miracle just wanna be better

mycat

2019-09-28
miracle

mycat故障转移

mycat从节点配置

从节点会同步主节点的所有数据

  1. 启动mysql客户端 mysql>show master status/G;查看postion的指针的值,在从节点配置需要指向这个指针的值

  1. 配置从节点
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
  1. 启动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

分片逻辑

  1. rule=auto-sharding-long 整数范围约束
    • 0-500w 第一个分片 对应dataNode(dn1)
    • 500w-1000w 第二个分片 对应dataNode(dn2)
    • 1000w-1500w 第三个分片
  2. rule=auto-sharding-murmur

用hash一致性算法

默认对2个分片做计算,160*weight权重值个虚拟节点
在hash环上找到dn分片的位置,然后对id进行计算,找到hash环上对应的位置,顺时针寻找最近的分片

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>

上一篇 redis

下一篇 lunece

Comments

Content