kingshard按时间分表功能介绍

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/king...

公众号

欢迎关注后端技术快讯公众号,有关kingshard的最新消息与后端架构设计类的文章,都会在这个公众号分享。图片描述


kingshard技术交流
kingshard([链接] )--一个Go开发高性能MySQL Proxy项目

后端工程师,kingshard作者。

405 声望
45 粉丝
0 条评论
推荐阅读
前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin21阅读 2.9k评论 3

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀22阅读 54.9k评论 1

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100214阅读 11k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100213阅读 11.2k评论 4

【已结束】SegmentFault 思否技术征文丨浅谈 Go 语言框架
亲爱的开发者们:我们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢迎大家来参与分享~征文时间11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前发布中奖名单参与条件新老思否作者均可参加征文...

SegmentFault思否11阅读 4.6k评论 11

封面图
【Go微服务】开发gRPC总共分三步
之前我也有写过RPC相关的文章:《 Go RPC入门指南:RPC的使用边界在哪里?如何实现跨语言调用?》,详细介绍了RPC是什么,使用边界在哪里?并且用Go和php举例,实现了跨语言调用。不了解RPC的同学建议先读这篇文...

王中阳Go8阅读 3.6k评论 6

封面图
【golang】sync.WaitGroup详解
上一期中,我们介绍了 sync.Once 如何保障 exactly once 语义,本期文章我们介绍 package sync 下的另一个工具类:sync.WaitGroup。

去去100213阅读 30.1k评论 2

后端工程师,kingshard作者。

405 声望
45 粉丝
宣传栏