作者亲自尝试过的开源MySQL读写分离工具有Amoeba、MySQL Proxy、Mycat等,经过仔细测试对比,在某个实际项目中选用Mycat作为MySQL数据库读写分离的代理工具。Mycat当前的最新版本为Mycat2,可从http://dl.mycat.org.cn/2.0/install-template取得下载包。
Mycat 需要依赖于JAVA,因此需要在读写分离代理所在的系统预先安装JAVA,并在环境变量配置中设置JAVA_HOME.关于JAVA的安装设置,参见本书“6.5.1 安装Tomcat”相关内容,这里不再重复。
如果Mycat所在的宿主操作系统版本比较新,比如Rochy 9或者Centos Stream 9,采用包管理工具(yum/dnf)便捷安装JAVA,需要执行的操作如下:
#安装jdk及jre yum install java-11-openjdk java-11-openjdk-devel |
执行完安装,将在自动生成目录“/usr/lib/jvm”。切换到此目录,查看其子目录(如图7-8),以确定在环境变量中如何设置“JAVA_HOME”及“JRE_HOME”。
图7- 8
根据目录结构,很容易就可以将与JAVA相关的环境变量设置。用文本编辑器,将如下四行文本追加到文件“/etc/profile”尾部:
export JAVA_HOME=/usr/lib/jvm/java export JRE_HOME=/usr/lib/jvm/jre export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin |
执行“source /etc/profile”是设置在当前Shell会话立即生效,或者退出终端,再次登录,也是一样的效果。
Mycat需要下载两个包,一个是安装包,一个是依赖的“jar”包。Mycat的下载存在于官网与“github.com”,作者建议在官网进行下载。
下载安装包的地址:http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip。
下载依赖的jar包地址:
http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies-2022-5-9.jar 。
下载来的zip压缩包,用unzip解开后,将其移动到目录“/usr/local”,并重命名为“mycat”.具体的命令如下:
[root@rocky114 ~]# unzip mycat2-install-template-1.21.zip -d /usr/local/ Archive: mycat2-install-template-1.21.zip creating: /usr/local/mycat/ creating: /usr/local/mycat/bin/ inflating: /usr/local/mycat/bin/mycat inflating: /usr/local/mycat/bin/mycat.bat inflating: /usr/local/mycat/bin/wrapper-aix-ppc-32 inflating: /usr/local/mycat/bin/wrapper-aix-ppc-64 inflating: /usr/local/mycat/bin/wrapper-hpux-parisc-64 …………..更多的输出省略……………………………………… |
为简化输入,可将系统环境变量文件“/etc/profile” 最后一行的内容追加Mycat安装目录的可执行文件所在绝对路径,更新后的“/etc/profile”文件最后一行的完整内容为:
export PATH=$PATH:/usr/local/mycat/bin:$JAVA_HOME/bin:$JRE_HOME/bin |
再次执行指令“source /etc/profile”使设置立即生效。
将下载来的mycat2-1.21-release-jar-with-dependencies-2022-5-9.jar文件,原样移动或者复制到目录“/usr/local/mycat/lib”。
到目前为止,安装的步骤基本上算是完成了,任意命令行下执行指令“mycat -h”,验证安装的正确性,命令的输出如图7-9所示。
图7- 9
提示权限不够,需要用指令“chmod -R +x /usr/local/mycat/bin”进行赋权,再执行就不会报错了,如图7-10.
图7- 10
Mycat2读写分离配置可分为:创建数据库连接账号、启动Mycat2与读写分离配置等几个步骤,接下来一一进行介绍。
1)创建Mycat2工作所必须的账号
启动Mycat2服务,需要有真实的数据库服务器支撑才能运行,因此,需要在MySQL服务器(其它被Mycat2支持的数据库也如此)创建账号并给账号授权,然后在Mycat2所在的宿主系统用MySQL客户端用创建好的账号远程进行连接,验证账号的有效性和正确性。
在前边的章节,我们已经做好了MySQL数据库间的主从同步,因此创建Mycat2所需账号的操作只需也只能在主数据库上进行,具体的指令如下:
mysql> create user ‘mycat’@’172.16.35.%’ identified by ‘dwue$Gs3’; mysql> grant all on *.* to ‘mycat’@’172.16.35.%’; mysql>flush privileges; |
切换到Mycat2所在的宿主系统,用刚创建好的账户远程登录MySQL主数据库,具体的指令如下:
[root@mycat116 ~]# mysql -h 172.16.35.113 -u mycat -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 439 Server version: 8.0.28 MySQL Community Server - GPL Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. |
2)启动Mycat2
与Mycat1.X版本相比,Mycat2的配置基本不需要手动去修改配置文件,而是可以在Mycat2启动之后,登录Mycat管理后台,用SQL指令或者客户端工具进行配置。在启动Mycat2之前,需要对原型库的数据源做相应的修改,修改的项主要是主数据库的连接信息,一个完整的修改过的原型数据源文件“/usr/local/mycat/conf/datasources/prototypeDs.datasource.json”的内容如下:
{ "dbType":"mysql", "idleTimeout":60000, "initSqls":[], "initSqlsGetConnection":true, "instanceType":"READ_WRITE", "maxCon":1000, "maxConnectTimeout":3000, "maxRetryCount":5, "minCon":1, "name":"prototypeDs", "password":" dwue$Gs3", "type":"JDBC", "url":"jdbc:mysql://172.16.35.113:3306/mysql?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8", "user":"mycat", "weight":0 } |
说明:被修改过的内容,以粗体字显示。
因为已经对系统变量做了设置,所以在任意路径执行“mycat start”就可以启动Mycat2。在Mycat2的安装目录“/usr/local/mycat”下,存在目录“logs”,打开此目录中的日志文件“wrapper.log”,可了解Mycat2服务的运行状况,如图7-11所示。
关闭Mycat2所在宿主系统的防火墙,在任意远端系统命令行下,用MySQL客户端工具连接Mycat的服务端口TCP 8066、用户名与密码在配置文件“/usr/local/mycat/conf/users/ root.user.json”中获取(如图7-12)。为安全起见,建议修改用户名(由root改成root888)及密码。
图7- 12
Linux下,用命令行连接Mycat管理后台的指令为“mysql -h 172.16.35.116 -u mycat -P8066 -p ”,输入密码,进入用户交互界面(如图7-13),表明Mycat2运行正常,可在次交互界面进行读写分离配置。
图7- 13
需要注意的是,这个连接账号,并非MySQL主数据库所创建的账号“mycat”,为了区别,也可以将其改成其它名称,并不会影响连接Mycat2。
如果Mycat客户端的宿主系统是Windows,可下载、安装“Navicat for MySQL”这样的图形管理工具(商业软件,需要授权),对Mycat2进行远程连接并进行操作管理,如图7-14所示。
图7- 14
3)Mycat2配置读写分离
有两种配置MySQL读写分离的方法,一种是直接在Mycat的配置目录“/usr/local/mycat/conf”的子目录编辑相关的文本文件(Mycat1.x版本只用这种方法);另一种登录到Mycat交互界面,用特殊语法的SQL命令进行配置。本书采用第二种方法,直接在Mycat的交互界面输入命令。
第一步:Mycat增加数据源。需要正确输入的数据主要包括:MySQL主从数据库的IP
地址、数据库库名(schema)、数据库账号、数据库密码(生产数据库请使用复杂密码)、实例类型(READ_WRITE或READ)。下边是添加一个主库源和两个从库源的具体指令:
#增加主库172.16.35.113,实例类型为READ_WRITE #################### mysql> /*+ mycat:createDataSource{ "name":"master","url":"jdbc:mysql://172.16.35.113:3306/v8_games","instanceType":"READ_WRITE","user":"sery","password":"123123"} */; Query OK, 0 rows affected (0.35 sec) #添加从库 172.16.35.114、172.16.35.117 ,实例类型为READ############## mysql> /*+ mycat:createDataSource{ "name":"slave114","url":"jdbc:mysql://172.16.35.114:3306/v8_games","instanceType":"READ","user":"sery","password":"123123"} */; Query OK, 0 rows affected (0.35 sec) mysql> /*+ mycat:createDataSource{ "name":"slave114","url":"jdbc:mysql://172.16.35.117:3306/v8_games","instanceType":"READ","user":"sery","password":"123123"} */; Query OK, 0 rows affected (0.01 sec) |
上述SQL语句是以“/*+”开头,以“*/;”结尾,可以写成一整行执行(如图7-15),以可以回车键多行输入,读者可根据自己的习惯自行决定。
正确执行完上面三条SQL语句以后,在目录“/usr/local/mycat/conf/datasources”下自动生成三个文本文件,文件名以已经执行的SQL语句中“name”的键值做前缀,如图7-16所示。
图7- 16
如果上述SQL语句输入的字符串有错误,可以登录Mycat2宿主系统,用编辑器直接修改字段值。更进一步,对所执行的SQL添加的源不满意,打算修正某些字串值重新执行SQL语句,比较直接的办法是执行“mycat stop”停止Mycat2,然后删除与之对应的数据源文件,再重启Mycat2,远程客户端重新连接Mycat2再次执行SQL语句.
第二步:创建Mycat集群。在本案中,集群成员包括一个主库与两个从库。根据业务场景,也可以创建多个集群,充分、有效的利用系统资源。创建Mycat集群的SQL语句如下:
mysql> /*! mycat:createCluster{"name":"cls01","masters":["master"],"replicas":["slave114","slave117"],"switchType":"NOT_SWITCH"} */; Query OK, 0 rows affected (0.03 sec) |
上述SQL语句执行完以后,将在目录“/usr/local/mycat/conf/clusters”自动生成Mycat集群配置文件“cls01.cluster.json”,其完整内容如图7-17所示。
图7- 17
第三步:创建Mycat逻辑数据库。这一步是关键,需要将已经创建好的集群名称、MySQL物理数据库名称(schema)等信息一一对应上。在创建逻辑库之前,先在Mycat交互界面执行数据库查询,看是否存在其它用户数据库,正常情况下,应该不存在其它用户数据库,查询过程及输出应该如图7-18所示。
图7- 18
创建逻辑库的具体指令如下:
mysql> /*+ mycat:createSchema{ "schemaName":"v8_games","targetName":"cls01"} */; Query OK, 0 rows affected (0.27 sec) |
执行完这条SQL语句以后,再来查看创建的逻辑库“v8_games”,是否与物理数据库相关联?在物理数据库“v8_games”中,已经存在很多数据表,如果在Mycat交互界面,能查询出这些表单(如图7-19),就表明Mycat的逻辑库与MySQL物理库正确进行了关联。
图7- 19
1)验证MySQL从数据库只读功能
关闭所有MySQL从数据库,仅保留主库可访问。登录Mycat客户端,交互界面执行简单数据表查询。可以看到用户数据库与数据表,但是执行查询操作不能成功,如图7-20所示。
图7- 20
启动任意从库,再登录到Mycat交互界面,再执行同样的查询操作,可以得到正确的结果,如图7-21所示。
图7- 21
通过上述对比测试,证明了设置的正确性:查询操作确实被分配到MySQL从数据库进行。
2)验证MySQL主数据库写入功能
关闭MySQL主数据,同时将剩下的两个从数据库运行起来,然后在Mycat2的交互界面创建用户数的数据表。这个写入操作将不会成功,在Mycat2的日志文件“logs/wrapper.log”立即就有错误信息写入,如图7-22所示。
启动MySQL主数据,重新远程连接Mycat代理,继续在用户数据库“v8_games”下执行数据表(student)的创建,立即可以执行成功,如图7-23所示。
直接登录任意MySQL从数据库,查看刚才创建的数据表(student.v8_games)应该被真正生成并被同步到从数据库,如图7-24所示。
通过上述对比测试,确认了通过Mycat代理只能对MySQL进行写入操作。
因为要在Mycat层面实现负载均衡,因此,需要将其它主机也部署好Mycat并实现MySQL数据库的读写分离。在Promxox VE超融合平台下,这个操作易如反掌,将已经验证实现MySQL读写分离功能的主机直接克隆出另外一个主机,启动系统后,控制台登录修改主机名、IP地址等,重启系统就可以直接使用。