MySQL 读写分离代理(Mycat2)

news2024/10/7 14:26:36

作者:田逸 

作者亲自尝试过的开源MySQL读写分离工具有Amoeba、MySQL Proxy、Mycat等,经过仔细测试对比,在某个实际项目中选用Mycat作为MySQL数据库读写分离的代理工具。Mycat当前的最新版本为Mycat2,可从http://dl.mycat.org.cn/2.0/install-template取得下载包。

7.3.1 安装Mycat 2到系统

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

7.3.2 配置Mycat读写分离

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所示。

图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

3Mycat2配置读写分离

有两种配置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),以可以回车键多行输入,读者可根据自己的习惯自行决定。

图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

7.3.3 Mycat读写分离功能验证

1)验证MySQL从数据库只读功能

关闭所有MySQL从数据库,仅保留主库可访问。登录Mycat客户端,交互界面执行简单数据表查询。可以看到用户数据库与数据表,但是执行查询操作不能成功,如图7-20所示。

 

图7- 20

启动任意从库,再登录到Mycat交互界面,再执行同样的查询操作,可以得到正确的结果,如图7-21所示。

 

图7- 21

通过上述对比测试,证明了设置的正确性:查询操作确实被分配到MySQL从数据库进行。

2)验证MySQL主数据库写入功能

关闭MySQL主数据,同时将剩下的两个从数据库运行起来,然后在Mycat2的交互界面创建用户数的数据表。这个写入操作将不会成功,在Mycat2的日志文件“logs/wrapper.log”立即就有错误信息写入,如图7-22所示。

图7- 22

 

启动MySQL主数据,重新远程连接Mycat代理,继续在用户数据库“v8_games”下执行数据表(student)的创建,立即可以执行成功,如图7-23所示。

图7- 23

 

直接登录任意MySQL从数据库,查看刚才创建的数据表(student.v8_games)应该被真正生成并被同步到从数据库,如图7-24所示。

图7- 24

 

通过上述对比测试,确认了通过Mycat代理只能对MySQL进行写入操作。

因为要在Mycat层面实现负载均衡,因此,需要将其它主机也部署好Mycat并实现MySQL数据库的读写分离。在Promxox VE超融合平台下,这个操作易如反掌,将已经验证实现MySQL读写分离功能的主机直接克隆出另外一个主机,启动系统后,控制台登录修改主机名、IP地址等,重启系统就可以直接使用。

7.4 Mycat 负载均衡集群

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/650252.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

60、基于51单片机无线蓝牙温度上下限控制加热系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+任务书+元器件清单等)

摘 要 随着人们生活水平的提高,对生活环境的要求也越来越高,家用电器越来越趋向于自动控制控制乃至于智能控制,针对目前家庭的实际需要,自动控制水温报警系统比较方便实用,本文就通过51系列单片机来实现一种家用自动控…

VS2013 如何创建动态库和使用

创建动态库具体的步骤是:(以DLL为例) 1、创建一个win32项目 2、选择应用程序类型:DLL; 附加选项:导出符号,勾上; 3、点击完成,就会生成动态库 4、 由于是导出库&#xf…

[细读经典]Megatron论文和代码详细分析(1)

[细读经典]Megatron论文和代码详细分析(1) 导航: 迷途小书僮:[细读经典]Megatron论文和代码详细分析(2)102 赞同 41 评论文章正在上传…重新上传取消 前言 作为一款支持multi-node,multi-GPU的可以直接用来训练GPT3等世界上超大规模的自然…

【C++学习】VScode配置C/C++开发环境

VSCode是一个高级编辑器,只能用来写C/C/Python/Java等代码,不能直接编译这些代码。所以,我们需要搭建编译和调试环境,本文以C/C为例,使用MinGW-w64,将其移植到Windows平台的一个gcc编译器。下面具体介绍如何…

基于Java蜀都天香酒楼网站系统设计实现(源码+lw+部署文档+讲解等)

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精…

第二章_基于redis实现分布式锁

基本实现 借助于redis中的命令setnx(key, value),key不存在就新增,存在就什么都不做。同时有多个客户端发送setnx命令,只有一个客户端可以成功,返回1(true);其他的客户端返回0(false…

微信小程序WE分析----事件分析

目录 web分析-小程序 事件分析概述 1.新增事件管理 事件参数说明 (1) 填写事件配置 (2)小程序添加上报代码:将上报代码添加到小程序中 (3)测试事件数据上报:测试事件上报的数据是否正确。 属性管理 字典管理 新增事件分析 创建事件分析 添加事件指…

Java+Swing+mysql员工工资管理系统2.0

JavaSwingmysql员工工资管理系统2.0 一、系统介绍二、功能展示1.用户登陆2.主页3.员工工资查询4.员工工资添加5.员工工资修改6.员工工资删除 三、系统实现1.salary.java 四、其它系统五、获取源码 一、系统介绍 该系统实现了简单的增删查改、用户登陆、员工工资查询、员工工资…

美联储缩表意味着什么?

What does the Feds balance sheet reduction mean? 这里的表是资产负债表,Balance sheet. 美联储(Federal Reserve)作为全球影响力最大的央行,其在货币政策上做出的一些调整,可能就会引起全球经济和金融市场动荡&am…

项目测试排期的正确方法是什么?

测试排期是项目排期里面的一部分,所以了解项目排期对整体产品的全貌会有一个宏观的认知,甘特图能很好的体现项目排期,里面包含了参与角色和每个角色对应的排期。项目参与者和项目责任人都可以清晰的看到项目当前进展和项目耗时等。 甘特图可…

智能监控系统:在线培训考试系统的保障

随着互联网技术的不断发展,越来越多的培训机构和教育机构采用在线学习和考试的方式进行教学。然而,考试中的作弊问题也随之产生,给教育质量和学术诚信带来了挑战。为了解决这一问题,许多在线培训考试系统引入了智能监控系统。 智…

邓铎:探索书法艺术的新境界

中国书画院院士邓铎,是一位在书法艺术领域拥有深刻理解和丰富实践经验的老者。他的作品随心所欲,个性鲜明,具备独特的审美品味和艺术手法,更有重要的理论创新,让书法艺术大放光彩。 邓铎的书法作品在形式上追求“形似象…

【无标题】面试常考算法(3):二叉树遍历(创建、遍历、销毁)

这部分不够熟悉的话,面试直接递归就行。不过实际中虽然递归在某些情况下可以提供简洁和优雅的解决方案,但可能占用大量的内存空间和导致额外时间开销,所以还是尽量使用非递归。因为每次递归调用时,函数的局部变量和参数都需要在栈…

迭代器模式(十九)

相信自己,请一定要相信自己 上一章简单介绍了访问者模式(十八), 如果没有看过, 请观看上一章 一. 迭代器模式 引用 菜鸟教程里面迭代器模式介绍: https://www.runoob.com/design-pattern/iterator-pattern.html 迭代器模式(Iterator Pattern&#xff…

实战:私有化部署ngin+文件步骤记录

这里写目录标题 背景准备总结 背景 出差到某国企进行私有化部署,一波三折。没想到是那种最麻烦的部署,导入文件需要刻光盘,进入电脑房需要上交手机,不允许有人以及拍摄设备,内部有监控摄像头。 有问题怎么办&#xf…

SYSU程设c++(第十六周)

set set<int> st; 会自动排序升序 如果降序可以set<int, greater<int>> s; map map<string,int> m; 会按键进行升序 m["uiui"]100; map<string,int>::iterator it; for(itm.begin();it!m.end();it){ cout<<"键&qu…

Spark大数据处理学习笔记(3.3)掌握RDD分区

该文章主要为完成实训任务&#xff0c;详细实现过程及结果见【http://t.csdn.cn/OmCQ8】 文章目录 一、概念二、自定义分区器2.1 提出问题2.2 解决问题1. 准备数据文件2. 新建科目分区器3. 测试科目分区器 三、课后作业 一、概念 在Spark中&#xff0c;RDD&#xff08;弹性分布…

长文|基于Zabbix的可观测性监控

01 可观测性与可观测性监控 02 基于ZABBIX的可观测性监控 03 可观测性监控的探索 ——王小东&#xff0c;多年运维老兵&#xff0c;《nginx应用与运维实战》作者 本文整理自王小东在2022Zabbix峰会演讲分享。ppt可在公众号后台回复“ppt"。 1、可观测性与可观测性监控…

拷贝构造函数

拷贝构造函数 以值传递的方式调用函数时&#xff0c;如果实参为对象&#xff0c;会调用拷贝构造函数。函数以值的方式返回对象时&#xff0c;可能会调用拷贝构造函数&#xff08;VS会调用&#xff0c;Linux不会&#xff0c;g编译器做了优化&#xff09; 类似于构造函数和析构函…

Python控制流程盘点及高级用法、神秘技巧大揭秘!

在这篇文章中我们将全面深入地介绍 Python 的控制流程&#xff0c;包括条件语句、循环结构和异常处理等关键部分&#xff0c;尤其会将列表解析、生成器、装饰器等高级用法一网打尽。此外&#xff0c;我还将分享一些独特的见解和研究发现&#xff0c;希望能给你带来新的启发。文…