起因:学完mysql,了解一下mycat,对数据相关知识进一步了解。
1. MyCat读写分离多主库配置切换
读写分离配置
<dataHost name="HOST187" 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="M1" url="192.168.0.187:3306" user="gavin"
password="123456">
<!-- can have multi read hosts -->
<readHost host="S1" url="192.168.0.186:3306" user="gavin" password="123456" />
</writeHost>
<writeHost host="M2" url="192.168.0.189:3306" user="gavin"
password="123456" />
</dataHost>
2. MyCat枚举分片规则
# 分片规则在rule.xml
# 修改schema里的分片规则
<schema name="user_db" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_info" dataNode="dn1,dn2" rule="sharding-by-intfile" />
</schema>
# rule.xml设置分片的数据列
<tableRule name="sharding-by-intfile">
<rule>
<columns>province_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int"
class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="defaultNode">0</property>
</function>
# 修改partition-hash-int.txt配置枚举
10000=0
10001=0
10010=1
10011=1
如果枚举值不在范围内怎么办:
在function加上<property name="defaultNode">0</property>
# 0代表不在枚举范围内默认落到ds0节点,1代表不在枚举范围内默认落到ds1节点
3. MyCat取模分片规则
# 1.修改schema的table分片规则
<schema name="user_db" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_info" dataNode="dn1,dn2" rule="mod-long" />
</schema>
# 2.修改rule里的分片列
<tableRule name="mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
# 3.修改取模节点数
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>
4. MyCat时间分片规则
# schema里要添加表并设定时间分片规则
<schema name="user_db" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_info" dataNode="dn1,dn2" rule="mod-long" />
<table name="login_info" dataNode="dn1,dn2" rule="my-sharding-by-date" />
</schema>
# rule.xml里自己设定的规则
<tableRule name="my-sharding-by-date">
<rule>
<columns>login_date</columns>
<algorithm>sharding-by-date</algorithm>
</rule>
</tableRule>
<function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2020-03-14</property>
<property name="sEndDate">2020-03-15</property>
<property name="sPartionDay">1</property>
</function>
# columns :标识将要分片的表字段
# algorithm :分片函数
# dateFormat :日期格式
# sBeginDate :开始日期
# sEndDate:结束日期
# sPartionDay:分区天数,即默认从开始日期算起,分隔1天一个分区
# 如果配置了 sEndDate 则代表数据达到了这个日期的分片后后循环从开始分片插入
5. MyCat全局表配置
数据库里有很多表是做配置的,需要设置成全局表
# province_info 就是全局表
<schema name="user_db" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_info" dataNode="dn1,dn2" rule="mod-long" />
<table name="login_info" dataNode="dn1,dn2" rule="my-sharding-by-date" />
<table name="province_info" dataNode="dn1,dn2" type="global" />
</schema>
6. MyCat子表管理
我们的订单信息:保存的订单的整体信息,比如收货人地址和订单金额
订单详情又是另外一张表,如果order-A对应的order-itemA这两张表,不在一个节点上就会出现跨库
子表管理:通过MyCat自身的配置将子表和父表绑定在一起,子表的分片规则跟着父表走
<schema name="user_db" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="user_info" dataNode="dn1,dn2" rule="mod-long" />
<table name="login_info" dataNode="dn1,dn2" rule="my-sharding-by-date" />
<table name="province_info" dataNode="dn1,dn2" type="global" />
<table name="order_info" dataNode="dn1,dn2" rule="auto-sharding-long">
<childTable name="order_item" joinKey="order_id" parentKey="id"/>
</table>
</schema>
7. MyCat安全机制应用
用户的登录权限
# server.xml 进行用户访问设置的
<user name="user">
<property name="password">user</property>
<property name="schemas">user_db</property>
<property name="readOnly">true</property>
<property name="benchmark">2</property>
</user>
# benchmark:当连接达到这里设置的值,就拒绝这个用户连接,0或者不设置就表示不限制
schema中表的操作权限
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">user_db,product_db</property>
<privileges check="true">
<schema name="user_db" dml="0110" >
<table name="user_info" dml="0000"></table>
<table name="order_info" dml="1111"></table>
</schema>
</privileges>
<privileges check="true">
<schema name="product_db" dml="0110" >
<table name="product_info" dml="0000"></table>
<table name="catelog_info" dml="1111"></table>
</schema>
</privileges>
</user>
# dml的四位数分别代表
insert(0/1),update(0/1),select(0/1),delete(0/1)
黑白名单设置
MyCat可以通过设置白名单建立防火墙
# MyCat白名单可以通过*来指定IP通配符,使用通配符后就不验证用户了
<firewall>
<whitehost>
<host host="192.168.0.187" user="root"/>
<host host="192.168.0.187" user="user"/>
<host host="192.168.0.188" user="root"/>
</whitehost>
</firewall>
MyCat通过黑名单设置数据表访问
<firewall>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
黑白名单一起设置
<firewall>
<whitehost>
<host host="192.168.0.187" user="root"/>
<host host="192.168.0.187" user="user"/>
<host host="192.168.0.188" user="root"/>
</whitehost>
<blacklist check="true">
<property name="deleteAllow">false</property>
</blacklist>
</firewall>
8. 通过zookeeper实现MyCat的HA配置
MyCat就是一个数据库的中间代理层
MyCat能够实现多个writeHost热切换,只要你配置了双主的MySQL结构,就能实现两个写入节点的热切换
多个MyCat机器
如果是内网:keepalived(VIP)+HAProxy(x2)+MyCat*2(mysql -uroot -p都是通过TCP连接)
如果是阿里云:SLB(阿里云的负载均衡器)+MyCat*2
MyCat-A,MyCat-B(同时连接了dataHost1,dataHost2)
如果有多个MyCat镜像节点,那么配置就显得比较繁琐,同步过程比较麻烦,需要手工同步并进行reload
这个时候如果有个一个统一的配置中心可以只修改一个地方,就可以同步所有节点
这个时候就可以使用zookeeper,可以针对zookeeper开发一个MyCat的中心配置功能
zookeeper就是用来进行多台MyCat的配置同步的
不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!
网友评论