首先来看分库分表,分库分表一般来说都是一起说的,但是实际上分库跟分表是有区别的,简单来说有垂直和水平两种方式,垂直就是将表按字段进行拆分,水平就是将表按照数据分布来做行拆分。具体的肯定还是有区别,本文不再进行阐述,主要介绍按照字段的分布进行数据行的拆分
本身理解来说Mycat实现的应该是分库,也就是将一个表的行分开存储到不同的数据库中,这里不同的数据库可以有一下两种
1)不同的数据库服务器上的 两个数据库(此时db的名字可以相同,也可以不同)
2)相同的数据库服务器上的两个数据库(此时db的名字肯定是不同的)
当然对于实际使用分库来说肯定是使用不同的数据库服务器的,而且大多数都是在不同的服务器上使用相同的名字,这样能够比较正式的做法
分表的关键部分在mycat的配置文件schema.xml中,该文件中定义了数据库服务器,表的拆分规则等等重要信息
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
以该配置为例,在mycat的逻辑数据库中定义employee表,主键是ID字段,分表规则是sharding-by-intfile,该规则可以在rule.xml中找到对应的信息,而拆分的数据节点是dn1和dn2,数据节点是mycat的概念,再来看看dn1
和dn2 的配置
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost2" database="db1" />
当然上面的配置是在将employee表的数据分配到两个数据库服务器上分别是localhost1和localhost2
同样也可以如下配置
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
这样的配置就在localhost1上建立两个数据库分别是db1和db2,将数据存在同一个数据库实例上的两个数据库上,同样属于分库分表
本文以正式运维环境进行配置,此处的dataHost是不同的,所以是不同的数据库服务器,而指向这两个数据库服务器的db名字是相同的,均为db1
本文以正式运维环境进行配置,此处的dataHost是不同的,所以是不同的数据库服务器,而指向这两个数据库服务器的db名字是相同的,均为db1
再看dataHost的配置,这里就涉及到具体数据库服务器的配置了
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip1:3003" user="root"
password="123">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip2:3009" user="root"
password="123">
</writeHost>
</dataHost>
这里的配置还没有加入读写分离,所以下面会介绍读写分离的配置,上面的配置就具体执行了两台的数据库服务器来做分库
这样一个表的分库就配置好了,Mycat会根据对应的rule规则和具体的sql语句进行路由处理,包括数据分库存储和数据分库获取等等
下面来看看读写分离,说到读写分离就必须存在主从复制的环境,需要先配置好主从复制,同样是在schema.xml中对主服务器和从服务器进行相应的配置即可
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="ip1:3003" user="root" password="123">
<readHost host="hostS1" url="ip2:3009" user="root" password="123"/>
</writeHost>
</dataHost>
此时在writeHost内配置对应的readHost,注意readHost是附属在writeHost下的,再去设置balance的值,至于balance的取值0,1,2网上有很多资料,分别用来指定哪
几个host能参与到数据库的读操作中,上面的配置是单独的一个写服务器的读写分离实例,这样会表示写操作会通过ip1:3003的服务器,而读操作会通过ip2:3009的
服务器,这就是最基本的读写分离配置,注意上面的配置只有一个dataHost,就是说明没有分库分表的特点
下面来看一下分库分表+读写分离,实际上也就是利用Mycat提供的功能,将两种特性都写入schema.xml中,达到同时具有分表+读写分离的需求
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="ip1:3003" user="root" password="123">
<readHost host="hostS1" url="ip2:3009" user="root" password="123"/>
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="ip3:3003" user="root" password="123">
</writeHost>
</dataHost>
显然总结一下: 1 有多个dataHost,就说明有分库分表的设置 2 在一个dataHost中有readHost在writeHost下,或者有多个writeHost,而且balance不等于0(0代表没有读写分离),就说明有读写分离的设置, 3 在一个dataHost中有多个writeHost,这些writeHost之间必须是主主复制,这样才能保证及时两次写操作分别用不同的writeHost,也能保证两个Host数据一致的情况