docker 安装mysql主从和mycat
mysql主从:https://blog.csdn.net/Amor_Leo/article/details/85177001
mycat安装:https://blog.csdn.net/Amor_Leo/article/details/85218405
Mycat是什么
数据库中间件,类似nginx,拦截请求,路由分发, 不同的是nginx拦截的是请求,而Mycat拦截的是sql
为什么要用Mycat
mycat数据模型
简单来说就是将以前的分库分表,读写分离等相关业务和配置从系统项目里面剥离出来,教给mycat统一管理,系统只需要链接mycat即可
主从复制
mysql主从复制原理
基本的读写分离是基于mysql的主从复制,主从复制内部的binlog同步来实现的,和redis主从不同的是,redis是通过RDB文件从太开始同步,而binlog只复制修改的部分
作用:
垂直分库:由不同的表名调用不同的数据库
垂直分表:通过不同的策略写入和查找
读写分离,可以设置读和写的主从策略
权限控制;读写权限
防火墙功能:ip白名单和黑名单
分片策略:rule.xml
具体策略:
枚举策略:
#(1)修改schema.xml配置文件
<table name="${tableName}" dataNode="${dataNode1},${dataNode2}" rule="sharding_by_intfile" ></table> #(2)修改rule.xml配置文件
...
<tableRule name="sharding_by_intfile"> <rule>
<columns>areacode</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="type">1</property>
<property name="defaultNode">0</property>
</function>
# columns:分片字段,algorithm:分片函数
# mapFile:标识配置文件名称,type:0为int型、非0为String,
#defaultNode:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就报错
#(3)修改partition-hash-int.txt配置文件
110=0
120=1
#(4)重启 Mycat
#(5)访问Mycat创建表
作用:当areacode=110的时候访问或者写入dataNode1 areacode=120读取写入dataNode2中
hash策略:
<table name="${tableName}" dataNode="${dataNode1},${dataNode2}" rule="sharding-by-substring" >
mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="sharding-by-substring">
<rule>
<columns>user_id</columns>
<algorithm>sharding-by-substring</algorithm>
</rule>
</tableRule>
<function name="sharding-by-substring"
class="io.mycat.route.function.PartitionDirectBySubString">
<property name="startIndex">0</property>
<property name="size">2</property>
<property name="partitionCount">2</property>
<property name="defaultPartition">0</property>
</function>
</mycat:rule>
columns标识将要分片的表字段。
algorithm为分片函数。
startIndex为字符串开始截取位,从0开始。
size为截取的位数。
partitionCount为分片个数
defaultPartition为默认节点
范围策略:
#(1)修改schema.xml配置文件
<table name="${tableName}" dataNode="${dataNode1},${dataNode2}" rule="auto_sharding_long" ></table> #(2)修改rule.xml配置文件
...
<tableRule name="auto_sharding_long"> <rule>
<columns>order_id</columns>
<algorithm>rang-long</algorithm> </rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
<property name="defaultNode">0</property>
</function>
# columns:分片字段,algorithm:分片函数
# mapFile:标识配置文件名称
#defaultNode:默认节点:小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点,
# 设置默认节点如果碰到不识别的枚举值,就让它路由到默认节点,如不设置不识别就 报错
#(3)修改autopartition-long.txt配置文件
0-102=0
103-200=1
#(4)重启 Mycat
#(5)访问Mycat创建表
作用:当0<=order_id<=102的时候访问或者写入dataNode1 103<=order_id<=200读取写入dataNode2中
时间策略:
#(1)修改schema.xml配置文件
<table name="login_info" dataNode="dn1,dn2" rule="sharding_by_date" ></table> #(2)修改rule.xml配置文件
...
<tableRule name="sharding_by_date"> <rule>
<columns>login_date</columns>
<algorithm>shardingByDate</algorithm> </rule>
</tableRule>
<function name="shardingByDate" class="io.mycat.route.function.PartitionByDate">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2019-01-01</property>
<property name="sEndDate">2019-01-04</property>
<property name="sPartionDay">2</property>
</function>
# columns:分片字段,algorithm:分片函数
#dateFormat :日期格式
#sBeginDate :开始日期 #sEndDate:结束日期,则代表数据达到了这个日期的分片后循环从开始分片插入 #sPartionDay :分区天数,即默认从开始日期算起,分隔 2 天一个分区
还有很多规则具体参考:cnblogs.com/bjxq-cs88/p/9470405.html
全局序列
1 mycat文件 不推荐,mycat宕机风险,不推荐
2.数据库存储方式,一次从mysql 拿100个自增id ,用完再取,宕机会再次获取,只会造成id不连续,并不会有重合风险
3.雪花算法
Mycat高可用
Mycat高可用
用HAProxy和keepalived来保证Mycat的高可用性