mycat搭建主从复制
mycat用的版本是
http://dl.mycat.org.cn/1.6.7.5/2020-4-10/Mycat-server-1.6.7.5-release-20200410174409-linux.tar.gz
linux直接wget下来就行
环境搭建用的是docker,mysql和mycat环境都是用的centos基础镜像封装
前提
已经搭建好的二主二从的mysql环境,四个mysql的docker环境。
新建一个centos容器复制mycat压缩包到容器里
#解压mycat并复制到/usr/local文件夹下面
#配置环境变量
vi /etc/proflie
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$JAVA_HOME/bin:$MYCAT_HOME/bin
source /etc/proflie
修改mycat文件夹conf下的
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="student" checkSQLschema="false" sqlMaxLimit="100" dataNode="li_database">
</schema>
<dataNode name="li_database" dataHost="li_host" database="student" />
<dataHost name="li_host" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="master1" url="对应数据库的ip地址:3306" user="root" password="对应数据库密码">
<!--从机-->
<readHost host="slave1" url="172.17.0.6:3306" user="root" password="对应数据库密码" />
</writeHost>
<writeHost host="master2" url="172.17.0.7:3306" user="root" password="对应数据库密码">
<!--从机-->
<readHost host="slave2" url="172.17.0.8:3306" user="root" password="对应数据库密码" />
</writeHost>
</dataHost>
</mycat:schema>
dataNode和dataNode要对应,dataHost和dataHost要对应,名字不能随便写,database就是主从集群相同的数据库
balance:
1. balance="0",不开启读写分离
2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双 主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载 均衡。
3. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力, 注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType:
1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
switchType 属性
-1 表示不自动切换 1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换 心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1) 心跳语句为 show status like ‘wsrep%’ -->
修改conf/server.xml,这是设置mycat数据库的用户
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">student</property>
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">student</property>
</user>
开启mycat进行测试
mycat console
如果是在dokcer环境内存不够的情况下创建内存空间
dd if=/dev/zero of=swapfile bs=1024 count=500000
mkswap swapfile
swapon swapfile
#卸载内存空间
swapoff swapfile
对应数据库表进行插入测试
insert into student (name) value (@@hostname);
insert into student (name) value (@@hostname);
insert into student (name) value (@@hostname);
insert into student (name) value (@@hostname);
insert into student (name) value (@@hostname);
因为定的writeType为0,所以一直只发送给第一个
如果停掉第一个的mysql服务,再次进行插入操作
进行插入操作的主机改变了
分库分表
再打开三个新的mysql容器和新的mycat容器
复制原本的mycat的文件夹到新的容器内,然后配置环境变量
在三个数据库进行以下建库建表操作
--数据库1
create database teacher_01;
use teacher_01;
--数据库2
create database teacher_02;
use teacher_02;
--数据库3
create database teacher_03;
use teacher_03;
--3个数据库都执行建表操作
create table teacher
(
id int null,
name varchar(20) null,
sal double null,
hiredate date null
);
重新设置mysql的schema.xml文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="table" checkSQLschema="false" sqlMaxLimit="100" >
<table name="teacher" dataNode="li_db01,li_db02,li_db03" rule="rule_li01" ></table>
</schema>
<dataNode name="li_db01" dataHost="li_host1" database="teacher_01" />
<dataNode name="li_db02" dataHost="li_host2" database="teacher_02" />
<dataNode name="li_db03" dataHost="li_host3" database="teacher_03" />
<dataHost name="li_host1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="172.17.0.9:3306" user="root"
password="密码">
</writeHost>
</dataHost>
<dataHost name="li_host2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="slave1" url="172.17.0.10:3306" user="root"
password="密码">
</writeHost>
</dataHost>
<dataHost name="li_host3" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master2" url="172.17.0.11:3306" user="root"
password="密码">
</writeHost>
</dataHost>
</mycat:schema>
dataNode和dataNode,dataHost和dataHost都是对应的关系,虽然是随便写,但要对应上,rule对应下面的规则
server.xml修改对应的用户配合schema的名字,比如上面的table
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">table</property>
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">table</property>
</user>
修改对应的分库规则conf下的rule…xml
#自定义规则,通过id数值进行取模,algorithm对应下面的函数名字
<tableRule name="rule_li01">
<rule>
<columns>id</columns>
<algorithm>func_li01</algorithm>
</rule>
</tableRule>
#自定义取模函数,有几台mysql服务器property就写几,然后数值就在1-3之间分配
<function name="func_li01" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
启动mycat,数据库图形化软件进行插入操作
#插入查看情况
insert into teacher(id,name,sal,hiredate) values(1,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(2,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(3,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(4,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(5,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(6,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(7,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(8,@@hostname,10000,'2020-01-10');
还可以进行按照日期规则的方法插入
#按照时间修改的规则
<tableRule name="rule_li02">
<rule>
<columns>hiredate</columns>
<algorithm>li_month</algorithm>
</rule>
</tableRule>
#自定义时间函数
<function name="li_month"
class="io.mycat.route.function.PartitionByMonth">
<property name="dateFormat">yyyy-MM-dd</property>
<property name="sBeginDate">2020-01-01</property>
</function>
再次进行插入操作
#按照时间插入数据,这里只有三个数据库,所以是1-3
insert into teacher(id,name,sal,hiredate) values(100,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(101,@@hostname,10000,'2020-02-10');
insert into teacher(id,name,sal,hiredate) values(102,@@hostname,10000,'2020-03-10');
id自增策略
#mycat自己的自增策略文件
cat conf/sequence_conf.properties
修改server.xml的配置进行自增插入
<property name="sequenceHandlerType">0</property>
再次进行插入
insert into teacher(id,name,sal,hiredate) values(next value for MYCATSEQ_GLOBAL,@@hostname,10000,'2020-01-10');
insert into teacher(id,name,sal,hiredate) values(next value for MYCATSEQ_GLOBAL,@@hostname,10000,'2020-02-10');
insert into teacher(id,name,sal,hiredate) values(next value for MYCATSEQ_GLOBAL,@@hostname,10000,'2020-03-10');