myCat MyCat读写分离多主库配置切换

2020-10-29  本文已影响0人  dylan丶QAQ

起因:学完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的配置同步的


不要以为每天把功能完成了就行了,这种思想是要不得的,互勉~!

上一篇下一篇

猜你喜欢

热点阅读