背景
MySQL
数据库读写分离以及数据同步的操作MyCat
来部署数据库的读写分离首先,要 明确 一点:
“ 此处,MyCat 是作为分布式数据库中间层,作为一个数据库代理的角色,并非数据库”
MyCat 原理中最重要的一个动词是 “拦截”
SQL
语句,SQL
语句做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,SQL
语句发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户.本文不做赘述,可阅读文章:
【MyCat是什么?为什么要用 MyCat?】
本篇文章,是以成功配置完成
MySQL
数据库主从复制为前提而整理的!
前期姊妹篇 ——
【CentOS7 下 MySQL5.7.32 主从复制+同步配置操作 (一主多从+多主多从)】
【mycat 官方PDF 文档】
【mycat 权威指南·语雀】
配置步骤
一、☛ Java 环境的配置
因为
"mycat 是基于 Java 环境的"
,首先确认下是否已安装并成功配置了JAVA
环境
"java -version"
、以及"javac"
查看信息 !【java-jdk
(1.7及1.7以上)
】[root@localhost java]# java -version
java version "1.8.0_271"
Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
[root@localhost java]# javac
用法: javac <options> <source files>
其中, 可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
...
...
如果没有安装,请参考文章 ——
【CentOS7 环境下安装 jdk1.8 并配置环境变量】
二、☛ mycat 下载/安装/启动
可以通过
"wget"
命令,指定路径下载,也可以本地下载完再通过FTP
工具上传到Linux
系统
wget http://dl.mycat.org.cn/1.6.7.6/20201126013625/Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
"mycat"
的文件夹)tar -xvf Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
rm -rf Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
"mycat"
的文件夹, 剪切到 "/usr/local"
下mv mycat /usr/local/
mycat
文件夹路径下cd /usr/local
vi /etc/profile
#mycat
export MYCAT_HOME=/usr/local/mycat
source /etc/profile
"/usr/local/mycat/bin/"
目录、启动 mycat、查看 mycat 运行状态[root@localhost bin] cd /usr/local/mycat/bin/
[root@localhost bin] ./mycat start # 启动
[root@localhost bin] ./mycat status # 查看状态
"mycat/bin"
目录是用来操作 mycat
状态的文件夹
启动:./mycat start
停止:./mycat stop
查看状态:./mycat status
重启:./mycat restart
建议过个一分钟再查看下 mycat
状态
有时会因为配置不合理,而造成启动终止
为了方便操作
mycat
服务,建议参考文章后面的【附录- mycat 软连接的创建、开机自启动配置】
至此,
mycat
安装并启动成功,接下来,便是对mycat
部署数据库读写分离的配置了 …
三、☛ 配置 MyCat 的读写分离
对于 MyCat 配置参数,建议先阅读文章:
【mycat 目录结构以及主要配置文件解读】
在此,我以四台
CentOS7
虚拟机作为MySQL
数据库的宿主机,进行演示
主机名 | ip 地址 | 角色 |
---|---|---|
Mycat 服务主机 | 192.168.80.221 | mycat |
Master1 | 192.168.80.221 | 主库 M1,和 M2 互为主备 |
Slave1 | 192.168.80.222 | 从库 S1,是 M1 的从库 |
Master2 | 192.168.80.223 | 主库 M2,和 M1 互为主备 |
Slave2 | 192.168.80.224 | 从库 S2,是 M2 的从库 |
为了真实场景演示,我已配置好了如上四台机器 ,满足了
MySQL
数据库的 【两主两从】模式
【注意】:
同步是MySQL
数据库那边做的,mycat
只是一个负责读写分发语句的角色!
【CentOS7 下 MySQL5.7.32 主从复制+同步配置操作 (一主多从+多主多从)】
"server.xml"
文件的配置
"server.xml"
配置文件主要是设置连接mycat
的账号和密码,同时还指定配置的逻辑数据库
"schema.xml"
文件的配置进行配置操作时,建议对配置文件复制一份,以做后期出错方便校验
对于配置文件的参数解释,建议参考文章 ——
【MyCat 配置文件解析】
我们的读写分离主要是在
里配置。
主要的配置参数有三个: balance="1" writeType="0" switchType="1"
(参数解释请看【附录-
)
此处附上鄙人的配置代码,以作对比参考
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycat_tp5_pro" checkSQLschema="true" sqlMaxLimit="100">
<table name="tp5_xtest_logs,tp5_xusers" primaryKey="id" dataNode="dn1">table>
<table name="tp5_xarticles" primaryKey="id" dataNode="dn1" autoIncrement="true">table>
schema>
<dataNode name="dn1" dataHost="dataHost1" database="tp5_pro" />
<dataHost name="dataHost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()heartbeat>
<writeHost host="Master1" url="192.168.80.221:3306" user="root" password="MT123456">
<readHost host="Slave1" url="192.168.80.222:3306" user="root" password="MT123456">readHost>
writeHost>
<writeHost host="Master2" url="192.168.80.223:3306" user="root" password="MT123456">
<readHost host="Slave2" url="192.168.80.224:3306" user="root" password="MT123456">readHost>
writeHost>
dataHost>
mycat:schema>
此篇文章,可以为你提供一些配置建议:
【mycat 实现 mysql 读写分离】
记得,更改配置文件后,要
重启 mycat
才能生效!
如果前面配置都没问题了,
mycat
正常启动后,就可以测试读写分离效果了
首先,停止 Maser1 的同步服务:stop slave;( 此时,Master2 变化时,Master1 就不会同步数据)
然后,进入 Master1 中,添加或更改一条记录 为 "Master 1"
然后,进入 Slave1 中,对应的更改为 "Slave1"
然后,进入 Master2 中,对应的更改为 "Master2"
最后,进入 Slave2 中,对应的更改为 "Slave2"
如此一来,四个 MySQL数据库中,对应的记录都不一样
此时,只要在 mycat 中,多次执行查询操作,就会发现,不时地获到 Master2/Slave1/Slave2 的对应记录!
以上数据的变化,说明
mycat
写操作的是Master1
,读操作是Master2/Slave1/Slave2
ThinkPHP5
中的配置举例项目开发中,我们只需要将
mysql
的连接地址换成mycat
的访问地址即可,不会造成过多的业务逻辑
ThinkPHP5
框架代码比较//------------- 主从分离配置参考----------------------------------
'hostname' => ['192.168.80.221','192.168.80.222','192.168.80.223','192.168.80.224'],
'database' => 'tp5_pro',
'username' => ['root'],
'password' => ['MT123456'],
'prefix' => 'tp5_',//前缀而已,不要太在意
'deploy' => 1,
'rw_separate' => true,
//-------------------------------------------------------------
//------------- MyCat 主从分离配置参考----------------------------------
'hostname' => '192.168.80.221',
'database' => 'mycat_tp5_pro',
'username' => 'root_mycat',
'password' => 'mycat_007',
'prefix' => 'tp5_',//前缀而已,不要太在意
'hostport' => '8066',
//-------------------------------------------------------------
本文指导操作中,毕竟没有涉及到更精深的 分库分表操作、数据表权限、规则配置
等
但是,作为入门来说,还是可以的
建议,道友们后期可以根据自己的业务
选取更加适合自己的配置方式
实践出真知 …
再者,到此为止
看似对 MySQL
集群的部署,已经是个不错的方式了
但是,经过高并发数据测试就会发现
这种属于"Replication"
的部署方式
会不可避免的出现数据同步延迟问题哦!(此时,可能要涉猎一下 PXC 集群部署知识!)
当然,作为业务量不怎么大的中小型应用
这样的部署足以应对业务需求
并且还算是响应比较不错的配置了 …
知识是不断扩展的,小伙伴们,加油咯 !…
附录
mycat
软连接的创建、开机自启动配置为了对
mycat
操作方便,建议创建软连接:
ln -s /usr/local/mycat/bin/mycat /etc/init.d/mycat
mycat
的操作命令就可以变成 :service mycat start
service mycat status
service mycat stop
service mycat restart
有时为了方便,考虑将
mycat
配置一下开机自启动
"mycat/conf/wrapper.conf“”
文件,"wrapper.java.command"
设置为 java
的路径 "/usr/local/java/jdk1.8.0_271/bin/java"
chkconfig --add mycat
wrapper.log 为程序启动的日志,启动时的问题看这个
mycat.log 为脚本执行时的日志,SQL 脚本执行报错后的具体错误内容,查看这个文件。
switch.log 是最新的错误日志,历史日志会根据时间生成目录保存
tail -f $MYCAT_HOME/logs/mycat.log
问题解决后,再重启
mycat
服务即可 …
配置参数解释我们的读写分离主要是在
里配置,主要的配置有三个:
balance、 writeType、switchType
balance
(负载均衡类型): balance="0":
不开启读写分离机制,所有读操作都发送到当前可用的writeHost 上
balance="1":
全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
简单的说,当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备)
正常情况下, M2,S1,S2 都参与 select 语句的负载均衡
balance="2":
所有读操作都随机的在 writeHost、 readhost 上分发
balance="3":
所有读请求随机的分发到 wiriterHost 对应的 readhost 执行
writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有
writeType="0":
所有写操作发送到配置的第一个 writeHost
第一个挂了切到还生存的第二个 writeHost
重新启动后已切换后的为准,切换记录在配置文件中: dnindex.properties .
writeType="1":
所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
switchType="-1": 表示不自动切换
switchType="1": 默认值,自动切换
switchType="2": 基于 MySQL 主从同步的状态决定是否切换,,心跳语句为 show slave status
switchType="3": 基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。
参考文章
【学会数据库读写分离、分表分库——用 Mycat,这一篇就够了!】
【MyCat 数据库的基础配置及使用】
【Linux 使用 Mycat 实现读写分离(基于Mysql 的读写分离)】
【CentOS下安装和使用 Mycat 实现分布式数据库】