mycat主从复制和分库分表

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');

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值