开源数据库中间件的对比、选取和搭建
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/http://github.com/flike/kingshard
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
评论