CentOS7下MyCat实现读写分离
环境说明
Centos版本: CentOS Linux release 7.7.1908 (Core)
Linux连接工具:SecureCRT
MySQL Version: 5.7.28
主库主机地址:192.168.163.61
从库主机地址:192.168.163.62
参考文档:https://dev.mysql.com/doc/refman/5.7/en/replication.html
MyCat安装在主库主机
MyCat版本:Mycat-server-1.6.7.3-release
MyCat参考文档:http://www.mycat.io 里面有下载地址
安装配置MyCat
- 把下载好的MyCat上传并解压到指定目录
#上传到opt目录,解压到/usr/local目录(我们自己的软件一般都安装到这个目录)
[root@localhost opt]# ls
Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
[root@localhost opt]# pwd
/opt
#解压到指定目录
[root@localhost opt]# tar -xzvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz -C /usr/local/
[root@localhost opt]# cd /usr/local/
[root@localhost local]# ls
bin etc games include lib lib64 libexec Mycat-1.6.7.3 mysql sbin share src
详细讲解几个主要的配置文件:
conf目录下面:
server.xml:这里面可以配置mycat的端口号,和连接用户和密码
schema.xml:中配置逻辑库、数据节点,数据主机
rule.xml:
log目录下面
wrapper.log:tail -n 100 logs/wrapper.log 可以查看mycat的日志信息:MyCAT Server startup successfully. see logs in logs/mycat.log代表mycat启动成功
- 为MyCat创建单独的系统用户
#创建用户
[root@localhost Mycat-1.6.7.3]# useradd mycat
#设置密码
[root@localhost Mycat-1.6.7.3]# passwd mycat
Retype new password:
passwd: all authentication tokens updated successfully.
修改mycat安装目录的所有者为mycat
[root@localhost Mycat-1.6.7.3]# chown -R mycat:mycat /usr/local/Mycat-1.6.7.3
#切换当前用户为mycat
[root@localhost Mycat-1.6.7.3]# su mycat
#启动MyCat
[root@localhost Mycat-1.6.7.3]# ./bin/mycat start
Starting Mycat-server...
#查看日志信息,启动成功
[root@localhost Mycat-1.6.7.3]# tail -n 10 logs/wrapper.log
STATUS | wrapper | 2020/01/02 18:08:50 | --> Wrapper Started as Daemon
STATUS | wrapper | 2020/01/02 18:08:50 | Launching a JVM...
INFO | jvm 1 | 2020/01/02 18:08:50 | OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2020/01/02 18:08:51 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2020/01/02 18:08:51 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2020/01/02 18:08:51 |
INFO | jvm 1 | 2020/01/02 18:09:01 | MyCAT Server startup successfully. see logs in logs/mycat.log
MyCat目录/bin命令有:
启动MyCat: ./mycat start
查看启动状态:./mycat status
停止: ./mycat stop
重启: ./mycat restart
启动并控制台打印日志:./mycat console
MyCat配置读写分离
- 修改schema.xml 文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 注意:里面的元素一定要按 schema 、dataNode 、 dataHost的顺序配置 -->
<!-- schema 逻辑库:mycat数据服务中定义和管理的数据库 -->
<schema name="myorders" checkSQLschema="false" sqlMaxLimit="100"
dataNode="mydn1">
</schema>
<!-- dataNode数据节点,逻辑表分片的存放节点 -->
<dataNode name="mydn1" dataHost="dhhost1" database="orders" />
<dataNode name="mydn2" dataHost="dhhost2" database="orders" />
<!-- 读写分离第一种配置方式 -->
<!--dataHost:数据主机,数据节点所在的主机 -->
<dataHost name="dhhost1" 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.163.61:3306" user="root" password="Root2020.">
<readHost host="hostS1" url="192.168.163.62:3306" user="root" password="Root2020.">
</readHost>
</writeHost>
</dataHost>
<!-- 读写分离第二种配置方式 -->
<dataHost name="dhhost2" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM2" url="192.168.163.61:3306" user="root" password="Root2020.">
</writeHost>
<writeHost host="hostS2" url="192.168.163.62:3306" user="root" password="Root2020.">
</writeHost>
</dataHost>
</mycat:schema>
<!--
配置文件说明:
(1)设置 balance="1"与writeType="0"
Balance参数设置:
1. balance=“0”, 所有读操作都发送到当前可用的writeHost上。
2. balance=“1”,所有读操作都随机的发送到readHost。
3. balance=“2”,所有读操作都随机的在writeHost、readhost上分发
WriteType参数设置:
1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
2. writeType=“1”,所有写操作都随机的发送到readHost。
3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
“readHost是从属于writeHost的,即意味着它从那个writeHost获取同步数据,因此,当它所属的writeHost宕机了,则它也不会再参与到读写分离中来,即“不工作了”,这是因为此时,它的数据已经“不可靠”了。基于这个考虑,目前mycat 1.3和1.4版本中,若想支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点还能读取数据,则需要在Mycat里配置为两个writeHost并设置banlance=1。”
(2)设置 switchType="2" 与slaveThreshold="100"
switchType指的是切换的模式,目前的取值也有4种(主从服务器下,当主服务器出现问题,选取从服务器的策略):
1. switchType='-1' 表示不自动切换
2. switchType='1' 默认值,表示自动切换
3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
4. switchType='3'基于MySQLgalary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
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主从复制时延。
(3) password加密(1.4.1版本以后开始支持),我们在配置的的时候最好使用加密密码不要使用铭文密码:
加密方法,在文章末尾单独讲解
->
- 修改server.xml文件
<!--
这个地方可以配置登录的端口号
<property name="serverPort">8066</property> <property name="managerPort">9066</property>
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
<property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //连接空闲检查
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
<!--这个地方配置MyCat登录的账号和密码-->
<user name="root" defaultAccount="true">
<property name="password">Root2020.</property>
<!--这个地方配置MyCat逻辑库-->
<property name="schemas">myorders</property>
<!-- 表级 DML 权限设置
dml:0110四个数字位分别表示:insert update select delete
-->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" > 这四个数字分别代表:insert update select delete
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
- 重启MyCat服务
#启动MyCat
[root@localhost Mycat-1.6.7.3]# ./bin/mycat start
Starting Mycat-server...
#查看日志信息,启动成功
[root@localhost Mycat-1.6.7.3]# tail -n 10 logs/wrapper.log
STATUS | wrapper | 2020/01/02 18:08:50 | --> Wrapper Started as Daemon
STATUS | wrapper | 2020/01/02 18:08:50 | Launching a JVM...
INFO | jvm 1 | 2020/01/02 18:08:50 | OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=64M; support was removed in 8.0
INFO | jvm 1 | 2020/01/02 18:08:51 | Wrapper (Version 3.2.3) http://wrapper.tanukisoftware.org
INFO | jvm 1 | 2020/01/02 18:08:51 | Copyright 1999-2006 Tanuki Software, Inc. All Rights Reserved.
INFO | jvm 1 | 2020/01/02 18:08:51 |
INFO | jvm 1 | 2020/01/02 18:09:01 | MyCAT Server startup successfully. see logs in logs/mycat.log
MyCat用户和数据库密码加密
在mycat-1.4.1版本以后开始支持对密码加密,在/usr/local/Mycat-1.6.7.3/lib目录下有一个jar包:Mycat-server-1.6.7.3-release.jar提> 供了加密方法:
用户加密: java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:Root2020.
dataHost加密:java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 1:hostS2:root:Root2020.
输入命令后,会有相应的提示信息
#加密命令
[mycat@localhost lib]$ java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:Root2020.
其中 0:user:password是加密字符串,有两种格式
dataHost加密格式
1:hostM1:root:123456
1代表是dataHost加密
hostM1是<writeHost host="hostM1"
root是user="root"
123456是 password=明文密码(123456)
对应writeHost配置
<writeHost host="hostM1" url="localhost:3306" user="root" password="BpkNIjF7LfzS1C76HT7B1bJgmGIDtPihqIvHBlC92L1IFqsMfoJEMk1EkxSzjasWB4GWoUcODYO4AaJstdAp5w==" usingDecrypt="1">
<!-- can have multi read hosts -->
</writeHost>
mycat用户登录密码加密格式
0:root:123456
0代表mycat用户登录密码加密
<user name="root" defaultAccount="true">
<property name="usingDecrypt">1</property>
<property name="password">d6D+pOmkuUoY09p4/aivwMsScLa7zfjIwAxvkEhr3v7en06mEXoX9DTTjQNug5CfvGf7Wy9oLcthYI3yLMSjIg==</property>
<property name="schemas">TESTDB</property>
##生成的加密密文
A+OX6CDyAa/ipM9DvV2us9l9p/FRQLPaesX9LM39+U94Nk11HWNZ+kieVkpoCxqzsqxCGJ0UUxirZQDBbf5jBA==