分享
  1. 首页
  2. 文章

kingshard按时间分表功能介绍

flike · · 2289 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

kingshard按时间分表功能介绍

文档中主要介绍了kingshard的Hash和Range方式的分表,最近又开发了按时间维度的分表方式。按时间维度分表的场景非常普遍,下面介绍一下kingshard的时间分表功能

1. 支持的时间类型

kingshard中的分表字段支持MySQL中三种类型的时间格式

  • date类型,格式:YYYY-MM-DD,例如:2016年03月04日,注意:2016年3月04日,2016年03月4日,2016年3月4日等格式kingshard都是不支持的。

  • datetime类型,格式:YYYY-MM-DD HH:MM:SS,例如:2016年03月04日,注意:2016年3月04日 13:23:43,2016年03月4日 13:23:43,2016年3月4日 13:23:43等格式kingshard都是不支持的,必须严格按照规定的格式,kingshard才支持。

  • timestamp类型,整数类型,例如:1457165568,对应的是:2016年3月5日 16:12:48。

2. 支持的时间分表类型

kingshard支持MySQL中三种格式的时间类型

  • date类型,格式:YYYY-MM-DD,例如:2016年03月04日,注意:2016年3月04日,2016年03月4日,2016年3月4日等格式kingshard都是不支持的。

  • datetime,格式:YYYY-MM-DD HH:MM:SS,例如:2016年03月04日,注意:2016年3月04日 13:23:43,2016年03月4日 13:23:43,2016年3月4日 13:23:43等格式kingshard都是不支持的,必须严格按照规定的格式,kingshard才支持。

  • timestamp,整数类型。

3. 功能演示

kingshard的配置文件如下所示:

# server listen addr
addr : 0.0.0.0:9696
# server user and password
user : kingshard
password : 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 error
log_level : debug
# if set log_sql(on|off) off,the sql log will not output
log_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 : 127.0.0.1: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.59.103:3307
 # 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_year
 key: ctime
 type: date_day
 nodes: [node1,node2]
 date_range: [2015-2016,2017-2018]

3.1 按年分表

3.1.1 配置说明

按年分表的配置项设置如下:

 table: test_shard_year
 key: ctime
 type: date_year
 nodes: [node1,node2]
 date_range: [2015-2016,2017-2018]

该配置表示:

  • sharding key是ctime。

  • 按年的分表类型是:date_year

  • test_shard_year_2015, test_shard_year_2016两个子表落在node1上,test_shard_year_2017,test_shard_year_2018两个子表落在node2上。

  • 如果你一个node上只包含一张子表,你可以这样配置date_range[2015,2017-2018]

注意:子表的命名格式必须是:shard_table_YYYY,shard_table是分表名,后面接具体的年。

3.1.2 功能演示

在node1上创建两张子表test_shard_year_2015, test_shard_year_2016,在node2上创建两种子表test_shard_year_2017,test_shard_year_2018。建表SQL如下

CREATE TABLE `test_shard_year_2016` (
 `id` int(10) NOT NULL,
 `name` varchar(40) DEFAULT NULL,
 `ctime` datetime DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入数据:

mysql> insert into test_shard_year(id,name,ctime) values(12,"hello","2015年02月22日 13:23:45");
Query OK, 1 row affected (0.01 sec)
mysql> insert into test_shard_year(id,name,ctime) values(13,"world","2016年03月22日");
Query OK, 1 row affected (0.00 sec)
mysql> select * from test_shard_year where ctime < "2016年03月23日";
+----+-------+---------------------+
| id | name | ctime |
+----+-------+---------------------+
| 12 | hello | 2015年02月22日 13:23:45 |
| 13 | world | 2016年03月22日 00:00:00 |
+----+-------+---------------------+
2 rows in set (0.00 sec)

对应的SQL log信息是:

2016年03月05日 12:06:32 - OK - 1.2ms - 127.0.0.1:56597->127.0.0.1:3306:insert into test_shard_year_2015(id, name, ctime) values (12, 'hello', '2015年02月22日 13:23:45')
2016年03月05日 12:06:59 - OK - 2.0ms - 127.0.0.1:56597->127.0.0.1:3306:insert into test_shard_year_2016(id, name, ctime) values (13, 'world', '2016年03月22日')
2016年03月05日 12:08:30 - OK - 1.6ms - 127.0.0.1:56597->127.0.0.1:3306:select * from test_shard_year_2015 where ctime < '2016年03月23日'
2016年03月05日 12:08:30 - OK - 0.3ms - 127.0.0.1:56597->127.0.0.1:3306:select * from test_shard_year_2016 where ctime < '2016年03月23日'

当然如果你把id作为一个unix时间戳,来分表的话,kingshard也是支持的。具体配置就是这样的:

 table: test_shard_year
 key: id
 type: date_year
 nodes: [node1,node2]
 date_range: [2015-2016,2017-2018]

插入数据:

mysql> insert into test_shard_year(id,name,ctime) values(1457410310,"world","2018年03月22日");
Query OK, 1 row affected (0.01 sec)
mysql> select * from test_shard_year where id = 1457410310;
+------------+-------+---------------------+
| id | name | ctime |
+------------+-------+---------------------+
| 1457410310 | world | 2018年03月22日 00:00:00 |
+------------+-------+---------------------+
1 row in set (0.00 sec)

1457410310 这个unix时间戳对应的日期是:2016年3月8日 12:11:50。kingshard准确地将这条记录路由到了test_shard_year_2016这张子表中了。
对应的SQL log是:

2016年03月08日 12:12:49 - OK - 1.0ms - 127.0.0.1:56669->127.0.0.1:3306:insert into test_shard_year_2016(id, name, ctime) values (1457410310, 'world', '2018年03月22日')
2016年03月08日 12:13:23 - OK - 0.4ms - 127.0.0.1:56669->127.0.0.1:3306:select * from test_shard_year_2016 where id = 1457410310

3.2 按月分表

配置说明

按月分表的配置项设置如下:

 table: test_shard_month
 key: ctime
 type: date_month
 nodes: [node1,node2]
 date_range: [201512-201602,201609-2016010]

该配置表示:

  • sharding key是ctime。

  • 按年的分表类型是:date_month

  • test_shard_month_201512, test_shard_month_201601, test_shard_month_201602两个子表落在node1上,test_shard_month_201609,test_shard_month_201610两个子表落在node2上。

  • 如果你一个node上只包含一张子表,你可以这样配置date_range[201501,201609-201610]

注意:子表的命名格式必须是:shard_table_YYYYMM,shard_table是分表名,后面接具体的年和月。

功能演示参考按年分表的操作。

3.3 按天分表

配置说明

按月分表的配置项设置如下:

 table: test_shard_day
 key: ctime
 type: date_day
 nodes: [node1,node2]
 date_range: [20151222-20151224,20160901-20160902]

该配置表示:

  • sharding key是ctime。

  • 按年的分表类型是:date_day

  • test_shard_day_20151222, test_shard_day_20151223, test_shard_day_20151224两个子表落在node1上,test_shard_day_20160901,test_shard_day_20160902两个子表落在node2上。

  • 如果你一个node上只包含一张子表,你可以这样配置date_range[20150101,20160901-20161010]

注意:子表的命名格式必须是:shard_table_YYYYMMDD,shard_table是分表名,后面接具体的年,月和日。

功能演示参考按年分表的操作。

kingshard开源地址:https://github.com/flike/kingshard


有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:flike

查看原文:kingshard按时间分表功能介绍

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2289 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏