本文概览:介绍了如何通过heisenberg部署一个分库分表的服务。

1 背景

现在使用heisenberg进行分库分表。这里采用规则是按照user_id的后两位来进行分库分表,如user_idxxx23,分库分表之后为,数据库为split_2;对应的表为customer_2_12表示分库index1表示表的index

2 数据库准备

1、建立10个库

split_0-slipt_9

2、 创建测试表

如对于split_1库中表是split1_0~split_1_9。对于创建表的sql

3 部署

3.1 代码

1、git clone的代码

https://github.com/brucexx/heisenberg

2、打包

3、拷贝target下面的heisenberg-server.zip文件到某一个目录下面,进行解压到/Users/test/local下面,此时就可以在/Users/test/local/heisenberg-server-1.0.6/可以看到:bin、conf、lib和logs 四个文件夹。

3.2 server.xml

在这个heisenberg服务的信息,可以直接使用默认的文件就可以

  • 配置<system>,指定配置heisenberg服务的端口号
  • 配置<user>,指定heisenberg的用户名、密码、schemas。

3.2 schemal配置

1、配置文件配置

  • 配置<table>信息
  • 配置数据库URL、用户名、密码

2、dataNode和dataSource的关系

可以理解dataNodel为一个数据库连接池,dataSource是要连接的数据库信息。

3.3 配置分表规则

1、配置文件

  • 配置<dbRuleList>。分库规则取user_id的倒数第二位
  • 配置<tbRuleList>。分表规则取user_id的倒数第一位
  • 配置<tbPrefix>。库和表的映射

3.3 启动和执行sql

1、执行bin目录下面的脚本

(1)启动

通过jps可以查看到服务已启动

55744 HeisenbergStartup

55786 Jps

54858 RemoteMavenServer

(2) 关闭

(3) 重新启动

2、连接数据库wms_shard

3、执行sql

(1)插入一条数据

(2)为了验证,我们可以通过mysql客户端登录到数据库来查看在split_3的cutsomer_3_2中是否有数据

4 常用功能

4.1 只分表不分库-按日分表

对于一个数据库中某一个表进行按日分表。此时只涉及分表,不需要分库。

1、schema.xml

因为现在只有一个库,所以如下设置

  • 在<table>指定datanode的时候不使用”wmsDN$0-9″,而直接写成”wmsDN”
  • <dataNode>的name不使用”wmsDN$0-9″,而直接写成”wmsDN”
  • <dataSource>中location中不使用split$0-9,而是写成split。

2、rule.mxl

假设队列按照batch_no分表,batch_no字段格式为xxx_yyyyMMdd,如xxxx_20161123。分表规则如下

4.2 同一个数据源存在分表和不分表两种类型

假设在一数据库中detail是按日分表,log表是不分表的,只需要修改schemal.xml就可以了:

  • <schemal>中添加一个dataNode属性就可以了
  • <table>只需要指定customer就可以了,不需要指定detail了

4.3  分布式部署台机器

在我们公司是通过bns来配置。类似一个zookeeper的功能,可以把一个请求分发到不同的heisenberg服务上。

4.4 查看每一个表执行时间

因为这个日志级别是debug,后续的改进不知道是否可以提升为info级别。所以我们修改log4j.xml如下日志级别为debug就可以了

执行如下命令

返回结果为:

common.log:2017-01-19 00:34:47,597 DEBUG executor.MultiNodeTask [wmsDN[6]][select * from customer_6_5]exetime:16ms pre:585

5 编码规范

5.1 规范1 需要定义Dao

有了mapper,为什么还需要定义Dao?

因为分库分表时,需要在查询条件必须包含分库分表的字段,如果直接使用mapper,很容易忽略,如不能直接使用mapper中

我们应该在dao中封装一个如下方法,然后更新操作都通过这个方法进行,

其中,userId和itemId是分库分表的规则依赖的字段,而且这两个字段可以组合成一个唯一键。

6 参考

1、作者官方博客  http://brucexx.iteye.com/blog/2041284

7 后续

还是感觉网上的这个资料太少了。到时候还是去看看mycat吧,官方博客:http://mycat.io/

附:生成分库分表的sql

生成分库分表的sql的代码如下:

分类&标签

发表评论

电子邮件地址不会被公开。 必填项已用*标注