mycat故障转移
mycat从节点配置
从节点会同步主节点的所有数据
- 启动mysql客户端 mysql>show master status/G;查看postion的指针的值,在从节点配置需要指向这个指针的值
- 配置从节点
change master to
master_host='10.9.9.8',
master_port=3306,
master_user='root',
master_password='root',
master_log_file='mysql-log.000001',
master_log_pos=120
- 启动slave start slave 开启 stop slave 关闭
当主节点出现故障时,从节点并不会进行顶替,需要引入中间件mycat,中间件可以实现从节点顶替
双机热备
两个服务互为对方的从节点,当有一方宕机时,另一个顶替,出故障的机器恢复时,会同步新的数据.
开放远程登录权限
- mysql>grant all on . to ‘root’@’%’ identified by ‘root’;
分片计算
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="root">
<property name="password">root</property>
<property name="schemas">mstest</property>
</user>
</mycat:server>
需要配置用户名,密码,mstest是一个虚拟数据库,schemas和schemas.xml配置相关
schemas.xml
<schema name="mstest" checkSQLschema="true" sqlMaxLimit="100">
<table name="user" primaryKey="ID" dataNode="dn1"/>
<table name="student" primaryKey="ID" dataNode="dn1,dn2" rule="auto-sharding-long"/>
<table name="t_cat" primaryKey="ID" dataNode="dn1,dn2"/>
<table name="t_product" primaryKey="ID" dataNode="dn1,dn2" rule="auto-sharding-long"/>
<table name="t_order" primaryKey="order_id" dataNode="dn1,dn2" rule="easymall-order">
<childTable name="t_order_item" primaryKey="ID" joinKey="order_id" parentKey="order_id"/>
</table>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="mstest" />
<dataNode name="dn2" dataHost="localhost2" database="mstest" />
<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="10.42.141.101:3306" user="root"
password="root">
</writeHost>
</dataHost>
</mycat:schema>
- table name=”t_order” primaryKey=”order_id” dataNode=”dn1,dn2” rule=”easymall-order” 一个叫做t_order的虚拟数据表,在mycat中,主键是order id,数据分片是dn1和dn2,分片算法是rule,自定义的
- childTable name=”t_order_item” primaryKey=”ID” joinKey=”order_id” parentKey=”order_id” 名字叫做t order item的子表,主键是id,关联的键是order id,在父表中的关联键是order id
- dataNode name=”dn1” dataHost=”localhost1” database=”mstest” 分片名字叫dn1,主机名是localhost1,主机中的数据库名字是mstest
- dataHost name=”localhost1” maxCon=”1000” minCon=”10” balance=”0” 名字叫做localhost1的主机,最大连接数1000,最小10
- writeHost host=”hostM1” url=”10.42.141.101:3306” user=”root” password=”root” 写逻辑库名字叫做hostM1,url是数据库的ip地址,user是用户名,password是密码
writeType
- writeType=0 表示当前管理的dataHost主从集群。所有的写操作都会在下表为0的writeHost中进行,读操作随机
- writeType=1 会将读逻辑覆盖掉,写和读操作随机进行
balance
writeType=0才生效
- balance=0 不开启读分离,所有的读都在第一个writeHost执行
- balance=1 参与读的是除了第一个writeHost外的所有readHost和writeHost,当读并发高,会将一部分压力分散到第一个writeHost
- balance=3 会找到所有的readHost进行读的负载均衡。如果当 前分片中没有readHost,会从第一个writeHost去读 (备用,第二个以后的writeHost)
rule.xml
- tableRule :定义一个可以在schema中逻辑表里使用的分片规则名称(rule属性)
- rule:表示详细规则定义
- columns:当前分片规则计算分片使用的字段名称
- algorithm:算法,表示当前计算分片的规则对应的 真是计算的代码function值
- function:定义的明确的计算逻辑算法
autopartition-long.txt
定义计算的区间,默认是0-500w是dn1,500w-1000w是dn2
常用组合
writeType=0
balance=1
分片逻辑
- rule=auto-sharding-long
整数范围约束
- 0-500w 第一个分片 对应dataNode(dn1)
- 500w-1000w 第二个分片 对应dataNode(dn2)
- 1000w-1500w 第三个分片
- rule=auto-sharding-murmur
用hash一致性算法
默认对2个分片做计算,160*weight权重值个虚拟节点
在hash环上找到dn分片的位置,然后对id进行计算,找到hash环上对应的位置,顺时针寻找最近的分片
全局表
mycat不支持跨分片,跨库关联操作,需要引入全局表(将一个表格的表复制到多个分片中,不计算分片)
分片表格(数据量大)和非分片表(数据量小)长期做关联操作时,用全局表
<table name="student" primaryKey="ID" dataNode="dn1,dn2" rule="auto-sharding-long"/>
<table name="t_cat" primaryKey="ID" dataNode="dn1,dn2"/>
dataNode设置dn1和dn2,表格添加数据时,两个分片数据都被添加,是同步复制的
ER表
对两表字段进行了统一化,在添加数据时,会计算分到同一个分片
多张表格有关联关系,可以通过关联的字段将多个表格的计算统一化; 通过table中包含的标签childTable定义主表和子表.(业务意义上.只有主表的数据存在,子表数据存在才有意义)订单是主表,订单商品是子表order的table标签,包含order_item的
<table name="t_order" primaryKey="order_id" dataNode="dn1,dn2" rule="easymall-order">
<childTable name="t_order_item" primaryKey="ID" joinKey="order_id" parentKey="order_id"/>
</table>
上面的rule是自定义的,在rule.xml中自定义分片规则,columns是需要计算的id字段名称,算法是自带的murmur
<tableRule name="easymall-order">
<rule>
<columns>order_id</columns>
<algorithm>murmur</algorithm>
</rule>
</tableRule>