MySQL读写分离是数据库架构中一种常见的优化手段,主要用于提高数据库系统的读性能和可用性。在读写分离的架构中,主数据库(Master)负责处理写操作(INSERT、UPDATE、DELETE等),而从数据库(Slave)负责处理读操作(SELECT等)。这种架构可以显著减少主数据库的负载,提高系统的并发处理能力
环境需求
|-----------|--------|----------------|------|
| 系统 | 主机名 | IP地址 | 配置 |
| CentOS7.9 | master | 192.168.78.129 | 2核4G |
| CentOS7.9 | slave1 | 192.168.78.130 | 2核4G |
| CentOS7.9 | slave2 | 192.168.78.131 | 2核4G |
| CentOS7.9 | amoeba | 192.168.78.132 | 2核4G |
| CentOS7.9 | client | 192.168.78.133 | 2核4G |
静态IP
vi /etc/sysconfig/neteork-scripts/ifcfg-ens33 //ens33网卡的配置文件
#内容如下
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static" //将获取IP方式改为静态static获取
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="2ce64331-c359-4e02-8297-4b279599dd47"
DEVICE="ens33"
ONBOOT="yes"
#添加网络信息
IPADDR="192.168.78.129" //IP地址
NETMASK="255.255.255.0" //子网掩码
GATEWAY="192.168.78.2" //网关
DNS1="192.168.78.2" //dns
DNS2="114.114.114.114" //dns
#重启服务
systemctl restart network
关闭防火墙
systemctl stop firewalld //关闭防火墙
systemctl disable firewalld //禁止开机自启动
关闭selinux
修改配置文件内的SELINUX=disabled
vi /etc/selinux/config //selinux的配置文件
#内容如下
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=disabled //将SELINUX改为disabled
MySQL主从复制读写分离实验
amoeba代理服务器配置
amoeba百度网盘下载链接:https://pan.baidu.com/s/17GHQvkB0qae6CAfs0tupgg
提取码:rlw2
准备基础环境
#安装Java基础环境
yum -y install java
#安装amoeba
#创建软件目录
mkdir /usr/local/amoeba
#解压amoeba软件
tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#添加ameba权限
chmod -R 755 /usr/local/amoeba
#测试amoeba是否安装成功
amoeba
三台MySQL部署主从复制
主从复制在作者前一篇文章中有详细介绍和部署
在MySQL数据库主节点创建amoeba连接后端MySQL的账号
grant all on *.* to 'test'@'192.168.78.%' identified by '123.com';
修改amoeba主配置文件
amoeba是 Amoeba 数据库代理服务器的主配置文件,它承担着配置 Amoeba 服务基本参数的重要任务
它负责配置 Amoeba 服务的基本参数、客户端连接信息、路由规则、其他配置文件引用以及可能的读写分离和负载均衡策略等
vi /usr/local/amoeba/conf/amoeba.xml
#内容如下,有#号注释的为需要修改的配置
27 <property name="authenticator">
28 <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
29 #用户登录amoeba代理时使用的账号
30 <property name="user">amoeba</property>
31 #用户登录amoeba代理时使用的密码
32 <property name="password">123456</property>
--------省略中间配置文件内容--------
106 <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
107 <property name="ruleLoader">
108 <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
109 <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
110 <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
111 </bean>
112 </property>
113 <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
114 <property name="LRUMapSize">1500</property>
#定义了默认的数据库连接池为master(MySQL主节点)。如果查询没有明确的路由规则,它会使用master连接池
115 <property name="defaultPool">master</property>
116
117 <!--
118 -->注意注释一定要取消
#指定了写操作应该使用的连接池为master。这确保了所有的写操作都发送到主数据库服务器
119 <property name="writePool">master</property>
#指定了读操作应该使用的连接池为slaves。这允许Amoeba将读操作分发到从数据库服务器,以减轻主服务器的负载并实现读写分离,slaves是一个虚拟连接池,需要在dbServers.xml内配置MySQL的从节点
120 <property name="readPool">slaves</property>
121 <property name="needParse">true</property>
122 </queryRouter>
修改amoeba的dbServers.xml配置文件
dbServers.xml 是 Amoeba 数据库代理服务器中的一个关键配置文件,它主要用于定义后端数据库服务器的连接信息和配置。Amoeba 是一个以 MySQL 为底层数据存储,并对应用提供 MySQL 协议接口的代理服务器,它支持读写分离、负载均衡、查询缓存等功能,它对于实现读写分离、负载均衡等功能至关重要
vi /usr/local/amoeba/conf/dbServers.xml
#内容如下,其中省略了部分配置,不要复制粘贴,建议看着修改
13 <dbServer name="abstractServer" abstractive="true">
#连接工厂
14 <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">
15 <property name="manager">${defaultManager}</property>
#发送缓冲区大小为64字节
16 <property name="sendBufferSize">64</property>
#接收缓冲区大小为128字节
17 <property name="receiveBufferSize">128</property>
18
19 <!-- mysql port 指定了MySQL服务器的端口号,这里是3306,这是MySQL的默认端口-->
20 <property name="port">3306</property>
21
22 <!-- mysql schema 指定了默认连接的数据库模式(或称为数据库名),这里是test-->
23 <property name="schema">test</property>
24
25 <!-- mysql user 用于连接MySQL服务器的用户名-->
26 <property name="user">test</property>
27
28 <!-- mysql password 用于连接MySQL服务器的密码,同时别忘了取消注释
29 -->
30 <property name="password">123.com</property>
31 </factoryConfig>
32 #连接池
33 <poolConfig class="com.meidusa.amoeba.net.poolable.PoolableObjectPool">
#指定了连接池中最大活跃连接数,即同时被借出的最大连接数,这里是500
34 <property name="maxActive">500</property>
#指定了连接池中最大空闲连接数,即连接池中允许保持空闲的最大连接数,这里也是500。注意,在某些连接池实现中,maxIdle可能会受maxActive的约束
35 <property name="maxIdle">500</property>
#指定了连接池中最小空闲连接数,即连接池中至少保持的空闲连接数,这里是10。
36 <property name="minIdle">10</property>
#指定了一个连接在池中保持空闲而不被逐出的最小时间(毫秒)
37 <property name="minEvictableIdleTimeMillis">600000</property>
#指定了空闲连接检测器运行的间隔时间(毫秒)。在这个例子中,两者都被设置为600000毫秒(即10分钟),意味着每10分钟检查一次连接池,并逐出空闲超过10分钟的连接
38 <property name="timeBetweenEvictionRunsMillis">600000</property>
#在借出连接时测试连接的有效性
39 <property name="testOnBorrow">true</property>
#在归还连接时测试连接的有效性
40 <property name="testOnReturn">true</property>
#在空闲时测试连接的有效性
41 <property name="testWhileIdle">true</property>
42 </poolConfig>
43 </dbServer>
#设置MySQL数据库主节点主机名,继承abstractServer配置,
45 <dbServer name="master" parent="abstractServer">
46 <factoryConfig>
47 <!-- mysql ip 指定了主节点的IP地址-->
48 <property name="ipAddress">192.168.78.129</property>
49 </factoryConfig>
50 </dbServer>
51 #设置MySQL数据库从节点主机名,继承abstractServer配置,
52 <dbServer name="slave1" parent="abstractServer">
53 <factoryConfig>
54 <!-- mysql ip 指定了从节点的IP地址-->
55 <property name="ipAddress">192.168.78.130</property>
56 </factoryConfig>
57 </dbServer>
58 #设置MySQL数据库从节点主机名,继承abstractServer配置,
59 <dbServer name="slave2" parent="abstractServer">
60 <factoryConfig>
61 <!-- mysql ip 指定了从节点的IP地址-->
62 <property name="ipAddress">192.168.78.131</property>
63 </factoryConfig>
64 </dbServer>
#虚拟从服务器组slaves,虚拟标志:virtual="true",这表示slaves不是一个实际的数据库服务器,而是一个虚拟的服务器组,用于将多个从服务器组合在一起进行负载均衡
65 <dbServer name="slaves" virtual="true">
66 <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
67 <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
#通过<property name="loadbalance">1</property>指定了负载均衡策略为1,即轮询(ROUNDROBIN)。Amoeba支持多种负载均衡策略,包括轮询(ROUNDROBIN)、基于权重的负载均衡(WEIGHTBASED)和高可用性(HA)模式
68 <property name="loadbalance">1</property>
69
70 <!-- Separated by commas,such as: server1,server2,server1 服务器列表:<property name="poolNames">slave1,slave2</property>指定了属于这个虚拟服务器组的实际服务器名称,即slave1和slave2。这意味着当请求被发送到slaves时,Amoeba将根据配置的负载均衡策略,在slave1和slave2之间分配请求-->
71 <property name="poolNames">slave1,slave2</property>
72 </poolConfig>
73 </dbServer>
#开启服务
amoeba start
客户端测试
下载mariadb
yum -y install mariadb
远程使用amoeba连接数据库
注意测试读写分离会使主从复制失效
mysql -u amoeba -p123456 -h 192.168.78.132 -P 8066
#-u 账号,也就是主配置文件配置的账号
#-p 密码,主配置文件配置的密码
#-h amoeba服务器的地址
#-P 端口
# 在master节点创建表
use test;
CREATE TABLE `kgc`(
`id` INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`age` INT
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
# master节点执行
INSERT INTO kgc VALUES(null,'张三',22);
# slave1执行
stop slave;
INSERT INTO kgc VALUES(null,'李四',18);
# slave2执行
stop slave;
INSERT INTO kgc VALUES(null,'王五',20);
# 在客户机连接查询,可以测出读节点
mysql -u amoeba -p123456 -h 192.168.207.167 -P 8066
select * from test.kgc;
MySQL [(none)]> select * from kgc;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 张三 | 22 |
| 2 | 李四 | 18 |
+----+--------+------+
2 rows in set (0.02 sec)
MySQL [(none)]> select * from kgc;
+----+--------+------+
| id | name | age |
+----+--------+------+
| 1 | 张三 | 22 |
| 2 | 王五 | 20 |
+----+--------+------+
3 rows in set (0.02 sec)
# 在客户机连接插入,可以测出写节点
insert into kgc values(4,'dd');