66  
基于mysql主从复制的mycat实现读写分离
作者: wyasw 于 2020年03月29日 发布在分类 / linux / mysql 下,并于 2020年03月29日 编辑
mysql

基于mysql主从复制的mycat实现读写分离

 

1.1 准备工作

mysql.5.7.22.解压安装.tar.gz

mycat:192.168.1.13   --主机名:mycat  ##:注意一定要26G以上内存的机器,不然会报错mycat

mysql主库:192.168.1.14  --主机名:mysql-master1

mysql从库:192.168.1.15  --主机名:mysql-slave1

注意关闭selinux

做好mysql主从配置,并建好需要读写分离的数据库和表

Mysql主从复制:

http://www.wyasw.com/webdoc/view/Pub00000000623d73fd01638ad2d472007d.html

 

1.2 下载mycat       

mycat的官网网址  http://www.mycat.org.cn/

我使用的是mycat1.6linux安装包

下载地址

https://github.com/MyCATApache/Mycat-download-new

 

http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

下载mycat的安装包到  目录下

[root@mycat ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

[root@mycat ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/

[root@mycat ~]# ls -d /usr/local/mycat/

/usr/local/mycat/

[root@mycat ~]# ls /usr/local/mycat

bin  catlet  conf  lib  logs  version.txt

1.3 安装JDK并且配置环境变量

下载:jdk-8u131-linux-x64.tar.gz

[root@mycat ~]# tar -xvf /tmp/jdk-8u131-linux-x64.tar.gz -C /home/deploy/

[root@mycat ~]# ln -s /home/deploy/jdk1.8.0_131/ /home/deploy/java

[root@mycat ~]# tail -3 /etc/profile

[root@mycat ~]# source /etc/profile

##java

export JAVA_HOME=/home/deploy/java

export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

 

1.4 准备Mycat所需要的用户

 

mycat需要两个用户用来执行用户通过mycat执行的操作,当程序需要对表进行查询操作时,mycat将会使用mycat_r进行执行查询,用mycat_w进行写操作,本文写操作使用的root用户

 

GRANT CREATE,DELETE,INSERT,SELECT,UPDATE,DROP ON *.* TO 'mycat_w'@'%' IDENTIFIED BY 'mycat_w';

GRANT SELECT ON *.* TO 'mycat_r'@'%' IDENTIFIED BY 'mycat_r';

FLUSH PRIVILEGES;

 

 

1.5 修改mycat配置文件

接下来修改mycat的配置文件

 

[root@mycat ~]# cd /usr/local/mycat/conf/

[root@mycat conf]# ls

autopartition-long.txt       rule.xml

auto-sharding-long.txt       schema.xml

auto-sharding-rang-mod.txt   sequence_conf.properties

cacheservice.properties      sequence_db_conf.properties

ehcache.xml                  sequence_distributed_conf.properties

index_to_charset.properties  sequence_time_conf.properties

log4j2.xml                   server.xml

migrateTables.properties     sharding-by-enum.txt

myid.properties              wrapper.conf

partition-hash-int.txt       zkconf

partition-range-mod.txt      zkdownload

 

配置文件非常多,配置项也远比amoeba复杂.如果只是简单配置在不同的服务器上进行读写分离只需要配置两个0文件  server .xml   schema.xml

1.5.1 先配置server.xml

此文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等,因此在这里简单说明

[root@mycat ~]# vim /usr/local/mycat/conf/server.xml

找到这一段

</system>

        <user name="root">

                <property name="password">123456</property>

                <property name="schemas">dong</property>

</user>

        <user name="user">

                <property name="password">read123456</property>

                <property name="schemas">dong </property>

<property name="readOnly">true</property>

        </user>

这里配置了两个可以来连接的用户

用户1  root  密码test   给予了此用户dong数据库的权限

用户2  user   密码user  给予了此用户dong数据库的只读权限

注意这里的dong不一定是你数据库上的真实库名.可以任意指定.只要和接下来的schema.xml的配置文件中的库名统一即可

系统默认 TESTDB大写 改成小写即可dong


 

1.5.2 接下来配置schema.xml

MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!~(当然分库分表策略、分片节点也在此文件中,暂且不谈)

【请注意修改自己的MySQL连接信息】

备份源schema.xml文件

[root@mycat ~]# cp /usr/local/mycat/conf/schema.xml /usr/local/mycat/conf/schema.xml.bak

配置

[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="dong" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

        </schema>

        <dataNode name="dn1" dataHost="localhost1" database="dong" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"  switchType="1" slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost host="hostM1" url="192.168.1.14:53306" user="root" password="mycat_w">

                <readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r " />

                </writeHost>

        </dataHost>

</mycat:schema>

 

1.5.3 如果有多个数据库dongdong2,则看以下配置文件

1.5.3.1   server.xml

 

        <user name="root">

                <property name="password">123456</property>

                <property name="schemas">dong,dong2</property>

        </user>

 

        <user name="user">

                <property name="password">read123456</property>

                <property name="schemas">dong,dong2</property>

                <property name="readOnly">true</property>

        </user>

 

1.5.3.2   schema.xml

 

<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="dong" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

        </schema>

        <schema name="dong2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">

       </schema>

 

        <dataNode name="dn1" dataHost="localhost1" database="dong" />

        <dataNode name="dn2" dataHost="localhost1" database="dong2" />

           

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"

                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

                <heartbeat>select user()</heartbeat>

                <writeHost

                         host="hostM1" url="192.168.1.14:53306" user="root" password="mycat_w">

                          <readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r" />

                </writeHost>

         </dataHost>

</mycat:schema>

 

 

 

1.5.4 配置文件解释

<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">

这里TESTDB 就是我们对外声称的我们有数据库的名称  必须和server.xml中的用户指定的数据库名称一致 添加一个dataNode="dn1" 是指定了我们这个库只在dn1.没有进行分库

 

<dataNode name="dn1" dataHost="localhost1" database="db1" />

这里只需要改database的名字 db1 就是你真实数据库服务上的数据库名 . 根据你自己的数据库名进行修改.

 

<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"

这里只需要配置三个地方    balance="1"writeType="0" ,switchType=”1”

 

a. balance 属性负载均衡类型,目前的取值有 4 种:

1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

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 没有。

b. writeType 属性

负载均衡类型,目前的取值有 3 种:

1. writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 
writeHost
,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .

2. writeType="1",所有写操作都随机的发送到配置的 writeHost1.5后废弃,不推荐

c. switchType 属性

- -1 表示不自动切换

- 1 默认值,自动切换

- 2 基于MySQL 主从同步的状态决定是否切换

slaveThreshold="100"

开始支持 MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:  
MyCAT
心跳检查语句配置为 show slave status dataHost 上定义两个新属性: switchType="2"    
slaveThreshold="100"
,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机 
制通过检测 show slave status 中的 "Seconds_Behind_Master", "Slave_IO_Running",  
"Slave_SQL_Running" 
三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从复制时延,  
Seconds_Behind_Master>slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之 
前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则 
表示主从同步,可以安全切换,否则不会切换。 

 

 

<heartbeat>select user()</heartbeat>

心跳检查语句

用户密码配置

<writeHost host="hostM1" url="192.168.1.14:53306" user="root" password=" Mycat_123 " />

<readHost host="hostS1" url="192.168.1.15:53306" user="readuser" password="Mycat_123" />

</writeHost>

这里是配置的我们的两台读写服务器IP地址访问端口和 访问用户的用户名和密码

1.6 启动mycat

/usr/local/mycat/bin/mycat start

#日志路径

/usr/locat/mycat/logs/mycat.log

 

1.7 一主两从

<readHost host="hostS2" url="192.168.1.15:53306" user="mycat_r" password="mycat_r" />

则给以上配置文件加一行

<readHost host="hostS3" url="192.168.1.16:53306" user="mycat_r" password="mycat_r" />

 

 

 

1.8 测试:

测试步骤:

1、用mycat root 8066用户登录,查看数据库 是不是dong逻辑库

2、用mycat root 8066用户登录,新建表,查看主库和从库是否有新建的表

3、停掉主从复制,给从库新建表,用mycat root 8066用户登录,查看数据库是否有刚新建的表及数据,有则证明主从读写分离成功,是从从库查询的,注意:之后删除新建表,再开启主从同步

 

 




 推荐知识

 历史版本

修改日期 修改人 备注
2020-03-29 15:46:09[当前版本] wyasw 创建版本

  目录
    文艺知识分享平台 - 4.3.0 - 文艺范儿