1、读写分离mycat

a、 读写分离
  读–》读操作服务器只负责读
  写–》写操作服务器只负责写
b、分表分库
  (微服务)垂直拆分:系统(订单,用户)
  mycat研究对象-》水平拆分:订单(订单1/订单2)
  haproxy:搭建多个mycat集群
集群:防止单点故障
  当一个机器宕机了以后,另一个机器会启作用,进行数据传输和备份。

2、原理图

Mycat配置主从数据-集群搭建-冯金伟博客园

 3、安装mycat

  a. 解压文件

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 

  b. 移动到软件目录

 mv mycat/ /usr/ 

  c. 进入/usr/mycat/conf中配置三个文件

Server.xml

  这里是root用户密码的设置,同时逻辑分库表的名字

    <user name="root">
        <property name="password">root</property>
        <property name="schemas">mydb</property>        
    </user>

schema.xml 

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="mydb" checkSQLschema="false" sqlMaxLimit="100">
        <!-- 分表 name是分表  dataNode拆分后的切片的位置  rule拆分规则 -->
        <table name="student" dataNode="dn1,dn2" rule="myrule" />
        
    </schema>    
    <!--datahost设置读写分离的地址  database拆分后为mydb01和02-->
    <dataNode name="dn1" dataHost="localhost1" database="mydb01" />
    <dataNode name="dn2" dataHost="localhost1" database="mydb02" />
    <dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
              writeType="0" dbType="mysql" dbDriver="native" switchType="2"  slaveThreshold="100">
              <!--发送心跳确是否出故障-->
        <heartbeat>show slave status</heartbeat> <!--select user()-->
        <writeHost host="hostM1" url="192.168.209.135:3306" user="root"
                   password="root">
            <readHost host="hostS2" url="192.168.209.137:3306" user="root" password="root" />
        </writeHost>
        
    </dataHost>
</mycat:schema>

部分参数解析

  balance:读请求的负载均衡 

0:不开启读写分离,所有读操作都发送到writehost中

1:全部的readhost和stand by writehost都参与读操作的负载均衡

2:读请求随机发送给readhost或writehost

3:读请求随机发送给writehost中的readhost

  writeType:写请求的负载均衡

0:写请求先发送给schema.xml中的第一个writehost。

当第一个writehost挂掉后给第二个,切换 记录会被记录在conf/dnindex.properties

1:写请求随机发送到所有的writehost中

  switchType:是否允许读操作在readhost和writehost中自动切换(解决延迟问题,当从readhost中读 取数据出现网络延迟时,自动从writehost中读取)

-1:不允许

1:允许

2:根据主从同步的状态,自动选择是否切换 心跳设置必须为show slave status

rule.xml

这是是算法的区分
    <tableRule name="mod-long">
        <rule>
            <columns>id</columns>
            <algorithm>mod-long</algorithm>
        </rule>
    </tableRule>

下面的算法的实现

<function name=”mod-long” class=”io.mycat.route.function.PartitionByMod”>
<!– how many data nodes –>
<property name=”count”>3</property>
</function>

在主从底层数据库中进行数据参加

create database mydb01; 
create table student(id int(4),name varchar(10));
create database mydb02;
create table student(id int(4),name varchar(10));

启动mycat

开启     bin/mycat start 
关闭     bin/mycat stop 
查看状态    bin/mycat status

登录mycat

mysql -uroot -proot -P8066 -h(mycat所在服务器ip)

 测试

插入数据
select * from student;
insert student (id, name) values (88, 'nihao');

测试思路:

  读写分离,读从主slave中读,写从master写入。

  在master中插入数据,能查询到两个库中的数据。

  在slave中插入数据,由于slave是从数据库,所以数据不会同步到master,所以从master读是读不到的,只有从slave中读才能得到数据,得到验证。