CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换

2022-01-06 10:44:19 浏览数 (1)

背景

  • 最近在研究 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以上)
代码语言:javascript复制
[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 版本
代码语言:javascript复制
wget http://dl.mycat.org.cn/1.6.7.6/20201126013625/Mycat-server-1.6.7.6-release-20201126013625-linux.tar.gz
  • 解压缩(会得到一个 "mycat" 的文件夹) 删除没用的压缩包
代码语言:javascript复制
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"
代码语言:javascript复制
mv mycat /usr/local/
  • 切换到 mycat 文件夹路径下
代码语言:javascript复制
cd /usr/local
  • 打开文件 : vi /etc/profile 在最底下配置环境变量,如下:
代码语言:javascript复制
#mycat
export MYCAT_HOME=/usr/local/mycat
  • 保存文件后,刷新环境变量文件
代码语言:javascript复制
source /etc/profile

3). mycat 的启动

  • 切换到"/usr/local/mycat/bin/"目录、启动 mycat、查看 mycat 运行状态
代码语言:javascript复制
[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>配置参数解释】**)
  • 此处附上鄙人的配置代码,以作对比参考
代码语言:javascript复制
<?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
  • 我的测试方法是
代码语言:javascript复制
 首先,停止 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 框架代码比较
代码语言:javascript复制
//------------- 主从分离配置参考----------------------------------
    '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 操作方便,建议创建软连接:

  • 创建软连接命令为:
代码语言:javascript复制
ln -s /usr/local/mycat/bin/mycat /etc/init.d/mycat
  • 如此一来,以后对 mycat 的操作命令就可以变成 :
代码语言:javascript复制
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"
  • 加入开机服务
代码语言:javascript复制
chkconfig --add mycat
  • 如果正确配置,此时可以重启 Linux 系统,查看是否能够成功 开机自启动!

▶. 启动失败,排查错误

  • 有时会因为配置不合理,而造成启动终止 此时需要到文件 "/usr/local/mycat/logs/wrapper.log" 中进行信息排查 如下,当我有配置错误时,会有如下类似信息:
代码语言:javascript复制
 wrapper.log	为程序启动的日志,启动时的问题看这个
 mycat.log 		为脚本执行时的日志,SQL 脚本执行报错后的具体错误内容,查看这个文件。
 switch.log 	是最新的错误日志,历史日志会根据时间生成目录保存
  • 另一种简单的查看信息的方式为:
代码语言:javascript复制
tail -f $MYCAT_HOME/logs/mycat.log

问题解决后,再重启 mycat 服务即可 …

▶. <dataHost> 配置参数解释

我们的读写分离主要是在 <dataHost> 里配置,主要的配置有三个: balance、 writeType、switchType

  • balance (负载均衡类型):
代码语言:javascript复制
  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 (写操作类型):
代码语言:javascript复制
  writeType="0":
   				所有写操作发送到配置的第一个 writeHost
 				第一个挂了切到还生存的第二个 writeHost
			    重新启动后已切换后的为准,切换记录在配置文件中: dnindex.properties .
  writeType="1": 
 				所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐 
  • switchType(切换类型):
代码语言:javascript复制
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 实现分布式数据库】

0 人点赞