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