开源数据库中间件的对比、选取和搭建



Proxy式架构和客户端式架构的优劣

 

 

Proxy式架构

客户端式架构

优点

1, 集中式管理监控和升级维护方便

2, 解决连接数问题

1.     应用直连数据库性能高

2.     无需中间层集群,没有额外成本开销

劣势

1, 需要中间层集群,有硬件成本开销

2, 多一跳(hop)有一定性能损失

3,中间层做数据合并,需要做隔离机制

1.     客户端和应用耦合,管理监控和升级维护麻烦

2.     不解决连接数问题

 

选择困难症时期:

在选取中间件的时候 我们会考虑社区的活跃度 版本的更新情况,维护成本,而这些综合比较起来我们初步定了 DBProxy,kingshard,mycat,其中DBProxy采用c,kingshard采用golang,mycat采用java,而考虑C的维护成本,我们暂时放下了(此处没有歧视C的意思,只是想说C太高深了),而kingshard是由个人组织开发的,mycat由一个团队维护,对于使用哪一种,暂时没有完全定一来。

我们从另一个方面来考虑一下,其实使用中间件的时候,大部分是已经到了不得不分表分库的情况下了(这是根据本人从业的公司情况,不一定都如此),那么要分表,我们来考虑中间件使用的情况,假设我们要查id从1到100范围的值,而我们现在分了16张表,那么其实我们要做的是select 每一张表,把符合id在1到100的查出来,再把数据组合到一起,返回给你,那么这里其实你需要查16张表,表的数量越多,你其实查的很多,从这个角度来看,哪一种更有优势呢?似乎是采用golang的kingshard,大家都知道golang具有良好的并发性能,语言非常简洁,对于维护人员上手也是比较快的,综合考虑一下,我们选择了kingshard。

安装:

kingshard的安装,比较简单,我这里也是作者那里过来,但是对于不是很熟悉go的,又想马上看到kingshard的惊人效果来说,切记不要浮躁。

1. 安装Go语言环境(Go版本1.6以上),具体步骤请Google。

2. 切换到你的gopath路径下面 (再次提醒必需设置了$gopath,而且需要切换到此)

3 git clone flike/kingshard src/github.com/flike/kingshard

4. cd src/github.com/flike/kingsh

5. source ./dev.sh

6. make

7. 配置文件,etc下面有标准参考文件,如ks.yaml ,(必需先修改kingshard 链接的数据库配置信息,不然运行就会报错)

8. 运行kingshard:./bin/kingshard -config=etc/ks.yaml

配置文件说明:

# kingshard的地址和端口
addr : 0.0.0.0:9696

# 连接kingshard的用户名和密码
user :  kingshard
password : kingshard
#kingshard的web API 端口
web_addr : 0.0.0.0:9797
#调用API的用户名和密码
web_user : admin
web_password : admin

# log级别,[debug|info|warn|error],默认是error
log_level : debug
# 打开SQL日志,设置为on;关闭SQL日志,设置为off
log_sql : on
#如果设置了该项,则只输出SQL执行时间超过slow_log_time(单位毫秒)的SQL日志,不设置则输出全部SQL日志
slow_log_time : 100
#日志文件路径,如果不配置则会输出到终端。
log_path : /Users/flike/log
# sql黑名单文件路径
# 所有在该文件中的sql都会被kingshard拒绝转发
#blacklist_sql_file: /Users/flike/blacklist
# 只允许下面的IP列表连接kingshard,如果不配置则对连接kingshard的IP不做限制。
allow_ips: 127.0.0.1
# kingshard使用的字符集,如果不设置该选项,则kingshard使用utf8作为默认字符集
#proxy_charset: utf8mb4

# 一个node节点表示mysql集群的一个数据分片,包括一主多从(可以不配置从库)
nodes :
-
    #node节点名字
    name : node1

    # 连接池中最大空闲连接数,也就是最多与后端DB建立max_conns_limit个连接
    max_conns_limit : 16

    # kingshard连接该node中mysql的用户名和密码,master和slave的用户名和密码必须一致
    user :  kingshard
    password : kingshard

    # master的地址和端口
    master : 127.0.0.1:3306

    # slave的地址、端口和读权重,@后面的表示该slave的读权重。可不配置slave
    #slave : 192.168.0.12@2,192.168.0.13@3
    #kingshard在300秒内都连接不上mysql,kingshard则会下线该mysql
    down_after_noalive : 300
-
    name : node2
    max_conns_limit : 16
    user :  kingshard
    password : kingshard

    master : 192.168.59.103:3307
    slave :
    down_after_noalive: 100

# 分表规则
schema :
    #分表分布的node名字
    nodes: [node1,node2]
     #所有未分表的SQL,都会发往默认node。
    default: node1
    shard:
    -
        #分表使用的db
        db : kingshard
        #分表名字
        table: test_shard_hash
         #分表字段
        key: id
        #分表分布的node
        nodes: [node1, node2]
        #分表类型
        type: hash
        #子表个数分布,表示node1有4个子表,
        #node2有4个子表。
        locations: [4,4]

    -
        #分表使用的db
        db : kingshard
        #分表名字
        table: test_shard_range
        #分表字段
        key: id
        #分表类型
        type: range
        #分表分布的node
        nodes: [node1, node2]
        #子表个数分布,表示node1有4个子表,
        #node2有4个子表。
        locations: [4,4]
        #表示每个子表包含的最大记录数,也就是说每
        #个子表最多包好10000条记录。即子表1对应的id为[0,10000),子表2[10000,20000)....
        table_row_limit: 10000

作者的文档也说明的比较详细,这里只需要正确设置node1和node2 数据库配置的地址,账号,密码(测试时候可以设置成一样的),就可以启动了 ,默认的端口为9696

修改你原先配置链接数据库的配置转为连接kingshard,如:

'host'=>'192.168.72.134'
'username'=>'kingshard'
'password'=>'kingshard'
'name'=>**
'charset' => 'utf8',
'port' => '3306'

测试看看成功没有,是不是就大工告成了

测试一下分表的实现 :

按照说明,我们也建立了八张表,如下脚本:

CREATE TABLE `test_shard_hash_0000` (
  `id` bigint(64) unsigned NOT NULL,
  `str` varchar(256) DEFAULT NULL,
  `f` double DEFAULT NULL,
  `e` enum('test1','test2') DEFAULT NULL,
  `u` tinyint(3) unsigned DEFAULT NULL,
  `i` tinyint(4) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

test_shard_hash_0001,test_shard_hash_0003.....test_shard_hash_0007.以此类推

建立好表后,需要在ks.yaml文件中配置分表信息,之前的ks.yaml已经有分表举例,修改一下就行:

  #分表使用的db
       db : kingshard
       #分表名字
       table: test_shard_hash
       #分表字段
       key: id
       #分表分布的node
       nodes: [node1, node2]
       #分表类型
       type: hash
       #子表个数分布,表示node1有4个子表,
       #node2有4个子表。
       locations: [4,4]

这里总共就是8张表,node1 有4张表,从0000到0003,node2从0004到0007

当然你如果你的node1和node2是同一个地址同一个库下面, 就需要建立0000到0007(这个是测试,实际一般不会如此)

这里需要重启kingshard,切记,不然不生效啦

可以用客户端连接kingshard,执行一下操作

insert into test_shard_hash(id,str,f,e,u,i) values(15,"flike",3.14,'test2',2,3);
insert into test_shard_hash(id,str,f,e,u,i) values(7,"chen",2.1,'test1',32,3);
insert  into test_shard_hash(id,str,f,e,u,i) values(17,"github",2.5,'test1',32,3);
insert into test_shard_hash(id,str,f,e,u,i) values(18,"kingshard",7.3,'test1',32,3);

可以在启动的kingshard下面看到对应的SQL日志如下所示:

2015/09/02 18:48:24 - INFO - 127.0.0.1:55003->192.168.59.103:3307:insert into test_shard_hash_0007(id, str, f, e, u, i) values (15, 'flike', 3.14, 'test2', 2, 3)

2015/09/02 18:49:05 - INFO - 127.0.0.1:55003->192.168.59.103:3307:insert into test_shard_hash_0007(id, str, f, e, u, i) values (7, 'chen', 2.1, 'test1', 32, 3)

2015/09/02 18:49:51 - INFO - 127.0.0.1:55003->127.0.0.1:3306:insert into test_shard_hash_0001(id, str, f, e, u, i) values (17, 'github', 2.5, 'test1', 32, 3)

2015/09/02 18:50:21 - INFO - 127.0.0.1:55003->127.0.0.1:3306:insert into test_shard_hash_0002(id, str, f, e, u, i) values (18, 'kingshard', 7.3, 'test1', 32, 3)

显然kingshard已经给我们执行到对应的表上了

我们执行查询操作检测

mysql> select * from test_shard_hash where id < 18;

可以在启动的kingshard下面看到对应的SQL日志如下所示:

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->127.0.0.1:3306:select * from test_shard_hash_0000 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->127.0.0.1:3306:select * from test_shard_hash_0001 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->127.0.0.1:3306:select * from test_shard_hash_0002 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->127.0.0.1:3306:select * from test_shard_hash_0003 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->192.168.59.103:3307:select * from test_shard_hash_0004 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->192.168.59.103:3307:select * from test_shard_hash_0005 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->192.168.59.103:3307:select * from test_shard_hash_0006 where id < 18

2015/09/02 18:55:01 - INFO - 127.0.0.1:55003->192.168.59.103:3307:select * from test_shard_hash_0007 where id < 18

确实,对所有表都进行了查询

至此,我们的数据库中间件搭建就完成了,至于实际使用,各种心得还是需要自己慢慢去体会了

来源1:https://blog.csdn.net/odailidong/article/details/70195525

来源2:https://zhuanlan.zhihu.com/p/28325807

评论

此博客中的热门博文

Tailscale 开源版中文部署指南(支持无限设备数、自定义多网段 、自建中继等高级特性)

iOS任意版本号APP下载(含itunes 12.6.5.3 最后带AppStore版本)

关于 N1 旁路由的设置

Mifare Classic card(M1卡)破解过程记录(准备+理论+获取扇区密钥+数据分析)

Blogger搭建国内可正常访问博客(超详细教程)

一些免费的云资源

打造一个可国内访问的Blogger(Blogspot)方法

百度站长平台中接入Blogger博客

Mifare Classic card(M1)卡破解过程

重新学习并解锁emby4.6.7,4.7.2版本