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

背景

  • 最近在研究 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+ 介绍的不多,初学建议选择低一点! 【版本地址】
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第1张图片
  • 此处我选择的是 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

CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第2张图片

  • 保存文件后,刷新环境变量文件
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 # 查看状态

CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第3张图片
【注意】:

  • "mycat/bin" 目录是用来操作 mycat 状态的文件夹

    启动:./mycat start
    停止:./mycat stop
    查看状态:./mycat status
    重启:./mycat restart

  • 建议过个一分钟再查看下 mycat 状态
    有时会因为配置不合理,而造成启动终止

为了方便操作 mycat 服务,建议参考文章后面的 【附录- mycat 软连接的创建、开机自启动配置】

至此,mycat 安装并启动成功,接下来,便是对 mycat 部署数据库读写分离的配置了 …


三、☛ 配置 MyCat 的读写分离

对于 MyCat 配置参数,建议先阅读文章【mycat 目录结构以及主要配置文件解读】

  • 首先,进入 "/usr/local/mycat/conf/" 目录,查看三个重要的配置文件
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第4张图片

☞ 数据库宿主机角色分配

在此,我以四台 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 的账号和密码,同时还指定配置的逻辑数据库

  • 此处展示一下,鄙人的配置信息
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第5张图片

2). "schema.xml" 文件的配置

进行配置操作时,建议对配置文件复制一份,以做后期出错方便校验

对于配置文件的参数解释,建议参考文章 —— 【MyCat 配置文件解析】

  • 我们的读写分离主要是在 里配置。
    主要的配置参数有三个: balance="1" writeType="0" switchType="1" (参数解释请看【附录-配置参数解释】)
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第6张图片

  • 此处附上鄙人的配置代码,以作对比参考



<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 正常启动后,就可以测试读写分离效果了

☞ 演示操作

  • 首先,以我平常使用的 "Navicat for MySQL" 工具为例,连接 mycat
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第7张图片
  • 我的测试方法是
 首先,停止 Maser1 的同步服务:stop slave;( 此时,Master2 变化时,Master1 就不会同步数据)
 然后,进入 Master1 中,添加或更改一条记录 为 "Master 1"
 然后,进入 Slave1 中,对应的更改为 "Slave1"
 然后,进入 Master2 中,对应的更改为 "Master2"
 最后,进入 Slave2 中,对应的更改为 "Slave2"

 如此一来,四个 MySQL数据库中,对应的记录都不一样
 此时,只要在 mycat 中,多次执行查询操作,就会发现,不时地获到 Master2/Slave1/Slave2 的对应记录!
  • 简单提供一个截图
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第8张图片

  • 然后,在 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"
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第9张图片
  • 加入开机服务
chkconfig --add mycat
  • 如果正确配置,此时可以重启 Linux 系统,查看是否能够成功 开机自启动!
    CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第10张图片

▶. 启动失败,排查错误

  • 有时会因为配置不合理,而造成启动终止
    此时需要到文件 "/usr/local/mycat/logs/wrapper.log" 中进行信息排查
    如下,当我有配置错误时,会有如下类似信息: CentOS7 下使用 MyCat 实现 MySQL 读写分离/主从切换_第11张图片
 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 (写操作类型):
  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 实现分布式数据库】

知识参考

  • 【数据库中的 Schema 是什么?】
  • 【MyCat 数据库的基础配置及使用】
  • 【Mycat 配置文件解析】
  • 【mycat分片规则之范围约定规则(auto-sharding-long)】

你可能感兴趣的:(数据库,Linux,mysql,linux,mycat,数据库)