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

背景

  • 最近在研究 MySQL 数据库读写分离以及数据同步的操作
    根据知识面的拓宽发现
    很多有经验的公司和技术前辈
    都建议使用 MyCat 来部署数据库的读写分离
    在此整理鄙人的探索过程,欢迎指摘 …

首先,要 明确 一点:“ 此处,MyCat 是作为分布式数据库中间层,作为一个数据库代理的角色,并非数据库”

☞ MyCat 原理介绍

MyCat 原理中最重要的一个动词是 “拦截”

  • 它拦截了用户发送过来的 SQL 语句,
    首先对 SQL 语句做了一些特定的分析,例如分片分析、路由分析、读写分离分析、缓存分析等,
    然后将此 SQL 语句发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户.

本文不做赘述,可阅读文章: 【MyCat是什么?为什么要用 MyCat?】

本篇文章,是以成功配置完成 MySQL 数据库主从复制为前提而整理的!

前期姊妹篇 —— 【CentOS7 下 MySQL5.7.32 主从复制+同步配置操作 (一主多从+多主多从)】


配置步骤

一、☛ 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+ 介绍的不多,初学建议选择低一点! 【版本地址】
    当前下载页面已失效,可从 http://www.mycat.org.cn/ - 仓库地址,查找合适的版本
  • 此处我选择的是 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.221mycat
Master1192.168.80.221主库 M1,和 M2 互为主备
Slave1192.168.80.222从库 S1,是 M1 的从库
Master2192.168.80.223主库 M2,和 M1 互为主备
Slave2192.168.80.224从库 S2,是 M2 的从库

为了真实场景演示,我已配置好了如上四台机器 ,满足了 MySQL 数据库的 【两主两从】模式

【注意】: 同步是 MySQL 数据库那边做的,mycat 只是一个负责读写分发语句的角色!

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%’。

参考文章

配置参考

知识参考

报错参考

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值