背景
- 最近在研究
MySQL
数据库读写分离以及数据同步的操作 根据知识面的拓宽发现 很多有经验的公司和技术前辈 都建议使用MyCat
来部署数据库的读写分离 在此整理鄙人的探索过程,欢迎指摘 …
首先,要 明确 一点:
“ 此处,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
系统
1). mycat 的下载
- 请自行选择
mycat
版本,网上对mycat 2.0
介绍的不多,初学建议选择低一点!【版本地址】
- 此处我选择的是
1.6.7.6 版本
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
2). mycat 的安装,配置环境变量
- 将前面解压缩得到的
"mycat"
的文件夹, 剪切到"/usr/local"
下
mv mycat /usr/local/
- 切换到
mycat
文件夹路径下
cd /usr/local
- 打开文件 :
vi /etc/profile
在最底下配置环境变量,如下:
#mycat
export MYCAT_HOME=/usr/local/mycat
- 保存文件后,刷新环境变量文件
source /etc/profile
3). mycat 的启动
- 切换到
"/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 目录结构以及主要配置文件解读】
- 首先,进入
"/usr/local/mycat/conf/"
目录,查看三个重要的配置文件
☞ 数据库宿主机角色分配
在此,我以四台
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 主从复制 同步配置操作 (一主多从 多主多从)】
1). "server.xml"
文件的配置
"server.xml"
配置文件主要是设置连接mycat
的账号和密码,同时还指定配置的逻辑数据库
- 此处展示一下,鄙人的配置信息
2). "schema.xml"
文件的配置
进行配置操作时,建议对配置文件复制一份,以做后期出错方便校验 对于配置文件的参数解释,建议参考文章 ——
【MyCat 配置文件解析】
- 我们的读写分离主要是在
<dataHost>
里配置。 主要的配置参数有三个:balance="1" writeType="0" switchType="1"
(参数解释请看**【附录-<dataHost>配置参数解释】
**)
- 此处附上鄙人的配置代码,以作对比参考
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--schema,即:数据库的组织和结构,此处的name值要与server.xml中的`<property name="schemas">MTSCHEMA</property>`对应!!!-->
<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>
<!-- 分片配置 -->
<!--数据节点dn1,对应的主机dataHost1,database:对应是真实数据库名称 -->
<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>
<!-- can have multi write hosts -->
<!--mysql 数据库的连接串 -->
<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
正常启动后,就可以测试读写分离效果了
☞ 演示操作
- 首先,以我平常使用的
"Navicat for MySQL"
工具为例,连接mycat
- 我的测试方法是
首先,停止 Maser1 的同步服务:stop slave;( 此时,Master2 变化时,Master1 就不会同步数据)
然后,进入 Master1 中,添加或更改一条记录 为 "Master 1"
然后,进入 Slave1 中,对应的更改为 "Slave1"
然后,进入 Master2 中,对应的更改为 "Master2"
最后,进入 Slave2 中,对应的更改为 "Slave2"
如此一来,四个 MySQL数据库中,对应的记录都不一样
此时,只要在 mycat 中,多次执行查询操作,就会发现,不时地获到 Master2/Slave1/Slave2 的对应记录!
- 简单提供一个截图
- 然后,在
mycat
连接的表中,更改记录为"MyCat"
,此时会发现所有的数据库数据都会同步为 “MyCat”
以上数据的变化,说明
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
- 如果正确配置,此时可以重启
Linux
系统,查看是否能够成功 开机自启动!
▶. 启动失败,排查错误
- 有时会因为配置不合理,而造成启动终止
此时需要到文件
"/usr/local/mycat/logs/wrapper.log"
中进行信息排查 如下,当我有配置错误时,会有如下类似信息:
wrapper.log 为程序启动的日志,启动时的问题看这个
mycat.log 为脚本执行时的日志,SQL 脚本执行报错后的具体错误内容,查看这个文件。
switch.log 是最新的错误日志,历史日志会根据时间生成目录保存
- 另一种简单的查看信息的方式为:
tail -f $MYCAT_HOME/logs/mycat.log
问题解决后,再重启
mycat
服务即可 …
▶. <dataHost>
配置参数解释
我们的读写分离主要是在
<dataHost>
里配置,主要的配置有三个: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 (写操作类型):
writeType="0":
所有写操作发送到配置的第一个 writeHost
第一个挂了切到还生存的第二个 writeHost
重新启动后已切换后的为准,切换记录在配置文件中: dnindex.properties .
writeType="1":
所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
- switchType(切换类型):
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 实现分布式数据库】