kingshard初探
来源:互联网 发布:ipad一直无法加入网络 编辑:程序博客网 时间:2024/06/05 18:18
起因:之前的相当长时间一直在寻找mysql的分布式解决方案,一直没有特别理想的答案,有同事给推荐了kingshard,所以决定一探究竟。
1.安装
机器共3台
安装请参考官方资料
https://github.com/flike/kingshard/blob/master/doc/KingDoc/kingshard_install_document.md
我安装的kingshard 2016年8月9日的版本,目前kingshard还没有参数或配置,把kingshard以后台守护进程的方式启动,因此作者建议使用supervisor进行管理。
因为我主要是为了观察效果,所以直接在终端中启动
./kingshard -config=../etc/ks.yaml
以下是我的配置文件 ks.yaml
# server listen addraddr : 0.0.0.0:9696# server user and passworduser : kingshardpassword : kingshard# if set log_path, the sql log will write into log_path/sql.log,the system log# will write into log_path/sys.log#log_path : /Users/flike/log# log level[debug|info|warn|error],default errorlog_level : debug# if set log_sql(on|off) off,the sql log will not outputlog_sql: on# only log the query that take more than slow_log_time ms#slow_log_time : 100# the path of blacklist sql file# all these sqls in the file will been forbidden by kingshard#blacklist_sql_file: /Users/flike/blacklist# only allow this ip list ip to connect kingshard#allow_ips: 127.0.0.1# the charset of kingshard, if you don't set this item# the default charset of kingshard is utf8.#proxy_charset: gbk# node is an agenda for real remote mysql server.nodes :- name : node1 # default max conns for mysql server max_conns_limit : 32 # all mysql in a node must have the same user and password user : kingshard password : kingshard # master represents a real mysql master server master : 192.168.122.3:3306 # slave represents a real mysql salve server,and the number after '@' is # read load weight of this slave. #slave : 192.168.59.101:3307@2,192.168.59.101:3307@3 down_after_noalive : 32- name : node2 # default max conns for mysql server max_conns_limit : 32 # all mysql in a node must have the same user and password user : kingshard password : kingshard # master represents a real mysql master server master : 192.168.122.4:3306 # slave represents a real mysql salve server slave : # down mysql after N seconds noalive # 0 will no down down_after_noalive: 32# schema defines sharding rules, the db is the sharding table database.schema : db : kingshard nodes: [node1,node2] default: node1 shard: - table: test_shard_day key: mtime # 指定分表所用的时间字段 type: date_day nodes: [node1,node2] date_range: [20160306-20160307,20160308-20160309]
由于我主要是用到kingshard的按时间分表功能,所以这里只配置了
2. 感受
2.1 kingshard 和后端node不断尝试连接,在一定的连接后就会认为后端node挂了,日志中会打印相应信息
2016/08/14 22:57:02 - ERROR - node.go:[113] - [Node] "checkMaster" "Ping" "db.Addr=192.168.122.4:3306|error=connection was bad" conn_id=02016/08/14 22:57:18 - ERROR - node.go:[113] - [Node] "checkMaster" "Ping" "db.Addr=192.168.122.4:3306|error=dial tcp 192.168.122.4:3306: getsockopt: connection refused" conn_id=02016/08/14 22:57:34 - ERROR - node.go:[113] - [Node] "checkMaster" "Ping" "db.Addr=192.168.122.4:3306|error=dial tcp 192.168.122.4:3306: getsockopt: connection refused" conn_id=02016/08/14 22:57:34 - INFO - node.go:[129] - [Node] "checkMaster" "Master down" "db.Addr=192.168.122.4:3306|Master_down_time=32" conn_id=0
同时可以使用终端管理命令查看所有节点的状态
admin server(opt,k,v) values('show','proxy','config');
在线上,完全可以基于这个命令来实现简单的监控报警
2.2 将SQL路由到指定node上
kingshard中支持将sql路由到指定的node上
/*node1*/ show tables; # 将sql发送到node1/*node2*/ show tables; # 将sql发送到node2
这个功能真的很棒,但是在使用mysql-client的时候必须带上-c 参数
mysql -h127.0.0.1 -ukingshard -pkingshard -P9696 -c;
–comments, -c
Whether to preserve comments in statements sent to the server. The default is –skip-comments (discard comments), enable with –comments (preserve comments).
如果不带-c,默认注释会被丢弃
2.3 kingshard不会自动创建任何表,所有用到的表必须自己创建
2.4 真实的读写例子
2.4.1 读操作
mysql> /*node1*/show tables;+-------------------------+| Tables_in_kingshard |+-------------------------+| test_shard_day_20140102 || test_shard_day_20140103 || test_shard_day_20140104 || test_shard_day_20160306 || test_shard_day_20160307 || test_shard_day_20160308 || test_shard_day_20160309 |+-------------------------+7 rows in set (0.01 sec)mysql> /*node2*/show tables;+-------------------------+| Tables_in_kingshard |+-------------------------+| test_shard_day_20160308 || test_shard_day_20160309 |+-------------------------+2 rows in set (0.01 sec)
我在kingshard中的设定是这样的
date_range: [20160306-20160307,20160308-20160309]
不包含20140102、20140103、20140104
执行sql 查看test_shard_day 表中的所有数据
mysql> select * from test_shard_day;+----+---------------------+-------+| id | mtime | money |+----+---------------------+-------+| 1 | 2016-03-06 00:00:00 | 0 || 2 | 2016-03-07 00:00:00 | 20 || 3 | 2016-03-08 00:00:00 | 10 || 4 | 2016-03-08 00:10:00 | 15 |+----+---------------------+-------+4 rows in set (0.03 sec)
在kingshard的日志中
2016/08/15 08:18:16 - OK - 9.7ms - 127.0.0.1:35925->192.168.122.3:3306:select * from test_shard_day_201603062016/08/15 08:18:16 - OK - 4.3ms - 127.0.0.1:35925->192.168.122.3:3306:select * from test_shard_day_201603072016/08/15 08:18:16 - OK - 16.0ms - 127.0.0.1:35925->192.168.122.4:3306:select * from test_shard_day_201603082016/08/15 08:18:16 - OK - 2.0ms - 127.0.0.1:35925->192.168.122.4:3306:select * from test_shard_day_20160309
一次性的触发了4条SQL
也就是对kingshard中没有设定过的表(test_shard_day_20140102、test_shard_day_20140103、test_shard_day_20140104),kingshard不会自动发现和访问、这其实是减少了不必要的开销,也大大简化了处理逻辑
在线上,如果可以实现动态的配置shard表,某种意义就达到动态的关闭和打开表的作用,比如只让用户访问最近三个月的数据
2.4.2 写操作
这里只讲特殊情况,如果插入数据的时间区间,不在 date_range: [20160306-20160307,20160308-20160309] 范围内,写请求也是可以进行的
insert into test_shard_day(id, mtime, money) values (15, '2016-03-06 01:00:00', 1);
kingshard日志
2016/08/15 08:37:37 - OK - 4.3ms - 127.0.0.1:35925->192.168.122.3:3306:insert into test_shard_day_20160306(id, mtime, money) values (15, '2016-03-06 01:00:00', 1)
写操作被默认发给了node1
test_shard_day_20160306 是我提前建好的
3. 总结
kingshard能够被非常简单的部署和使用
1. 无需修改 mysql-client
2. 安装方便,快捷
可以考虑在线上使用
- kingshard初探
- 开源数据库中间件:Kingshard
- 中间件kingshard入门(五):夭折
- kingshard 分表-主从复制 mariadb搭载
- kingshard架构设计和功能实现
- 中间件kingshard入门(一):基本安装
- 中间件kingshard入门(二):orzdba监控工具
- kingshard--一个Go开发高性能MySQL Proxy项目
- kingshard--一个支持sharding的MySQL Proxy项目
- kingshard: Go语言开发的高性能MySQL Proxy
- 中间件kingshard入门(三):基于jmeter的压力测试工具
- 初探
- 【开源访谈】Kingshard 作者陈非访谈实录【项目简介】 Kingshard 是一个由Go开发高性能MySQL Proxy项目,kingshard在满足基本的读写分离的功能上,致力于简化MySQ
- 如何利用一个数据库中间件扩展MySQL集群——kingshard使用指南
- 中间件kingshard入门(四):jmeter压测出现的问题too many open files
- 初探PHP5
- jdbc初探......
- STL初探
- go-并发
- 函数重载的本质
- jquery如何获取隐藏span的值
- 【杭电oj2032】杨辉三角
- Android应用开发性能优化完全分析
- kingshard初探
- hdu 5832 A water problem(简单数论)
- U盘启动Openwrt
- 我所理解的前端
- Canvas坦克在画布上移动
- QScintilla应用(1) 安装及简介
- UVA - 488 Triangle Wave
- Web开发人员的6种赚钱之道
- 线性表之链表C++版