原理:读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,从数据库处理select查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库
目前较为常见的MySQL读写分离分为两种:
(1)基于程序代码内部实现
在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手,
(2)基于中间代理层实现
代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有两个代表性程序。
① MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua 脚本进行 SQL 判断,虽然是 MySQL 官方产品,但是 MySQL 官方并不建议将 MySQL-Proxy 用到生产环境。
②)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由 Java 语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。经过上述简单的比较,通过程序代码实现 MySQL 读写分离自然是一个不错的选择,但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java 应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种应用一般会考虑使用代理层来实现。本章后续案例通过 Amoeba 实现。
③ MyCAT 是一款开源的分布式关系型数据库中间件,主要用于解决大规模数据存储和高效查询的需求。它支持分布式 SQL 查询,兼容 MySQL通信协议,能够通过数据分片提高数据查询处理能力。MyCAT的前端用户可以将其视为一个数据库代理,使用 MySQL,客户端工具和命令行访问,而后端则可以通过 MySQL 原生协议与多个 MySQL服务器通信,或者使用 JDBC协议与大多数主流数据库服务器通信
实验过程
实验环境:
主机 | 操作系统 | IP地址 | 应用 |
master | openEuler 24.03 | 192.168.10.101 | mysql-server |
slave1 | openEuler 24.03 | 192.168.10.102 | mysql-server |
slave2 | openEuler 24.03 | 192.168.10.103 | mysql-server |
mycat | openEuler 24.03 | 192.168.10.104 | mycat2 |
客户端 | openEuler 24.03 | 192.168.10.105 | mysql |
1.搭建mysql主从复制(查看历史文章)
2.搭建mysql读写分离
MyCAT 是目前最流行的分布式数据库中间插件,是一个开源的分布式数据库系统,是一个实现了 MySQL协议的服务器。前端用户可以把它看作一个数据库代理,用 MySQL,客户端工具和命令行访问,其后端可以用 MySQL 原生协议与多个MySQL服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端 MySQL服务器里或者其他数据库里。
MyCAT 发展到目前,已经不是一个单纯的 MySQL 代理了,它的后端可以支持MySQL、SQL Server、0racle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB这种新型 NoSQL 方式的存储。未来,它还会支持更多类型的存储。
不过,无论是哪种存储方式,在最终用户看,MyCAT里都是一个传统的数据库表,支持标准的 SQL语句进行数据的操作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
2.1安装mycat2(mycat)
mycat 需要依赖于JAVA,所以需要在代理所在系统预先安装JAVA环境
dnf install jdk--8u171-linux-x64.rpm
2.2 安装并配置mycat软件
unzip mycat2-install-template-1.20.zip -d /usr/local/
ls /usr/local/mycat/
echo 'export PATH=$PATH:/usr/local/mycat.bin' >> /etc/profile
source /etc/profile
cp mycat2-1.21-release-jar-with-dependencies. jar mysql-connector-java-8.0.18. jar /usr/local/mycat/lib
为mycat命令添加执行权限:
chmod -R +x /usr/local/myczt/bin
mycat -h (验证安装的正确性)
2.3配置myca读写分离
Mycat2 读写分离配置可分为:创建数据库连接账号、启动Mycat2与读写分离配置等几个步骤
(1)创建mycat2工作所必须的账号
启动 Mycat2服务,需要有真实的数据库服务器支撑才能运行,因此,需要在 MySQL服务器(其它被 Mycat2 支持的数据库也如此)创建账号并给账号授权,然后在 Mycat2 所在的宿主系统用 MySQL, 客户端用创建好的账号远程进行连接,验证账号的有效性和正确性。
在前边的章节,我们已经做好了 MySQL 数据库间的主从同步,因此创建 Mycat2所需账号的操作只需也只能在主数据库上进行,具体的指令如下:
mysql>create user 'mycat'@'%' identified by '123456';
mysql>grant all on *.* to 'mycat'@'%';
alter user 'mycat'@'%' identified with mysql_native_password by 'pwd123';
flush privileges;
(2)启动mycat2
vim /uar/local/mycat/conf/datasources/prototypeDS.datasource.json
"password":"pwd123",
"url":"jdbc:mysql://192.168.10.101":3306....
"user":"mycat",
mycat start
ss -tnl | grep 8066
cat /usr/local/mycat/conf/users/root.user.json
进入用户交互界面,可在此交互界面进行读写分离配置
mysql -uroot -p123456 -p8066 -h192.168.10.101
(3)mycat2配置读写分离
两种配置mysql读写分离的方法,一种是直接在mycat的配置目录“/usr/local/mycat/conf”的子目录编程相关的文本文件。另一种登陆到mycat交互界面,用特殊语法的SQL命令进行配置。以下采用第二种直接输入命令
第一步:Mycat增加数据源
增加主库master:
mysql>/*+ mycat:createDataSource{ "name":"master","url":"jdbc:mysql://192.168.10.101:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"WRITE","user":"mycat","password":"pwd123"} */;
Query OK, 0 rows affected (0.01 sec)
增加从库slave1和slave2:
mysql>/*+ mycat:createDataSource{ "name":"slave1","url":"jdbc:mysql://192.168.10.102:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;
Query OK, 0 rows affected (0.01 sec)
mysql>/*+ mycat:createDataSource{ "name":"slave2","url":"jdbc:mysql://192.168.10.103:3306/?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","instanceType":"READ","user":"mycat","password":"pwd123"} */;
Query OK, 0 rows affected (0.01 sec)
第二步:创建Mycat集群
mysql>/*! mycat:createCluster{"name":"cls01","masters":["master"],"replicas":["slave1","slave2"]} */;
上述sql语句执行完成后,将在目录/usr/local/mycat/conf/clusters中自动生成mycat集群配置文件cls01.cluster.json
查看并修改集群配置
cat /usr/local/mycat/conf/clusters/cls01.cluster.json
"readBalanceType":"BALANCE_ALL_READ", (请修改,所有显示读请求路由到从节点,事务内除外)
"balance":1 (没有添加,所有从节点按固定顺序依次接受读请求)
修改负载均衡的默认策略为轮询
"defaultLoadBalance":"BalanceRoundRobin",
修改后重启mycat
mycat restart