数据库分片
数据库分片即平时说的分库分表
- 垂直切分:分库(根据不同的业务来分库,即将一个大库折成多个小库),跨数据库查询必须采用接口形式通讯,提高了复杂性,另外,会涉及到分布式事务。
- 水平切分:分表(将一个表的数据分到多个库,即把一个大表拆成多个小表),跨库 join 性能较差。
数据库拆分有哪些问题:
①自增id问题:可以通过每行产生不同的 UUID值(不递增)或者步长(即节点数据,一开始就要定好)来解决
②数据关联查询问题(水平拆分):性能会有所下降
数据库做了分库分表后,需要在客户端与 DB 服务器之间添加一个中间层,即中间件。
使用 Mycat 分库分表
目前有两台数据库服务器 128 和 130,两台服务器上都有 demodb 数据库,库中都有 cyt 和 t 表(都是空表)。
现希望访问 cyt 表时(比如插入),只访问 128 主机,访问 t 表时(比如插入),同时使用 128 和 130 主机,也就是说,对 t 做了一个水平切分。
1.配置 server.xml
<user name="appcat">
<property name="password">appcat</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
2.配置 schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="cyt" primaryKey="id" type="global" dataNode="node_db01" />
<table name="t" primaryKey="id" dataNode="node_db01,node_db02" rule="mod-long" />
</schema>
<dataNode name="node_db01" dataHost="dataHost01" database="demodb" />
<dataNode name="node_db02" dataHost="dataHost02" database="demodb" />
<dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="192.168.111.128:3306" user="app" password="app" />
</dataHost>
<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="192.168.111.130:3306" user="app" password="app" />
</dataHost>
</mycat:schema>
3.修改 rule.xml
我们这儿只有两个节点,而默认 rule.xml 中定义的 mod-long 有3个节点,所以需要修改。
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
4.启动mycat
./bin/mycat star
5.客户端连接
$ mysql -uappcat -pappcat -h192.168.111.133 -P8066
连接后,分别对两张表做一些插入操作,就可以看到:
cyt 表只有 128 主机上的数据库中多了记录,查询时,也只会查询 128 主机中的记录。
t 表在两个主机上均匀分配记录,查询时,会把 128 和 130 两台主机中的记录都查询出来。
Mycat 分片策略
MyCat支持10种分片策略
0、求模算法(根据计算出的模植的不同放到不同的数据库)
1、分片枚举(比如将不同地区定义为枚举常量,然后将记录插入到不同地区的数据库)
2、范围约定
3、日期指定
4、固定分片hash算法
5、通配取模
6、ASCll码求模通配
7、编程指定
8、字符串拆分hash解析
9、一致性hash