这两天在调研评测Mysql Proxy服务,有360的atlas,阿里的cobar,tddl . 最让我感兴趣的还是陈非的kingshard,只因为他的分库分表最合理,有range和bash的方式。 kingshard代码比较的清晰,文档也相应的清晰,我们可以根据自己的需求扩展分库分表.
该文章写的有些乱,欢迎来喷 ! 另外文章后续不断更新中,请到原文地址查看更新。
kingshard我在centos,ubuntu都测试了一遍,最后在docker里面也搞了一下,正在测试dockerfile,等调试完毕会推送到github。 kingshard给我的感觉就是速度不错,配置文件简练。
#blog: xiaorui.cc apt-get install golang git clone https://github.com/flike/kingshard.git src/github.com/flike/kingshard cd src/github.com/flike/kingshard source ./dev.sh make
然后我们开始编辑kingshard的配置文件.
vim /etc/multi.yaml
# 服务端的地址 addr : 0.0.0.0:9696 # 账号密码 user : root password : 123123 #log_path : /Users/flike/log # log level[debug|info|warn|error],default error log_level : debug #if set log_sql(on|off) off,the sql log will not output #log_sql: off #sql语句黑名单 #blacklist_sql_file: /Users/flike/blacklist #允许的ip地址 #allow_ips: 127.0.0.1 # the default charset of kingshard is utf8. #proxy_charset: utf8mb4 # node is an agenda for real remote mysql server. nodes : - name : node1 # default max conns for mysql server max_conns_limit : 8 # all mysql in a node must have the same user and password user : root password : 123123
最后启动kingshard, 之后我们就可以mysql -uroot -p -h -P9696通过kingshard连接mysql server了。
./bin/kingshard -config=/etc/multi.yaml
启动正常无ERROR,kingshard对于启动失败的原因描述的很清晰.
[root@ubuntu:~/src/github.com/flike/kingshard][master]#./bin/kingshard -config=/etc/multi.yaml __ _ __ __ / /__(_)___ ____ ______/ /_ ____ __________/ / / //_/ / __ \/ __ \/ ___/ __ \ / __\/ ___/ __ / / ,< / / / / / /_/ (__ ) / / / /_/ / / / /_/ / /_/|_/_/_/ /_/\__, /____/_/ /_/\__,_/_/ \__,_/ /____/ 2016/02/20 22:08:27 - INFO - server.go:[240] - [server] "NewServer" "Server running" "netProto=tcp|address=0.0.0.0:9696" conn_id=0
kingshard的性能我没有具体去测试,打算下周一步步的替换线上的mysql proxy. 看kingshard github的描述,性能在1w+ qps左右.
我们再来描述下kingshard的分表实现,题外化,360的altas刚出来那会,我就一直提交关于分表的issue,只是atlas一直没怎么关注过,或者他们内部早已经实现了分表的功能,只是没有对外开源而已。 这是人家自己的权力我没资格说啥。 后来atlas也出了分表的功能,但不是分布式的调度,只能是单库里面的分库分表。 还是那句话,对于真有相当需求的业务公司来说,花点时间扩展atlas的分表功能不是难问题。 淘宝的cobar是支持分布式的分表,但问题是他的性能是个问题,很是让我等屁民着急。tddl的依赖有些奇特,社区也不热,不推荐。
shard: - table: test_shard_hash key: id nodes: [node1, node2] type: hash locations: [4,4] - table: test_shard_range key: id type: range nodes: [node1, node2] locations: [4,4] table_row_limit: 10000
第一个分表模式是hash,可以指定hash的字段,上面是指定id为hash字段。
第二个分表模式是range区间,他是根据row行数来分表的,kingshard模式还不能按照时间区分。