MySQL读写分离

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部署主从复制

主从复制在作者前一篇文章中有详细介绍和部署

http://t.csdnimg.cn/UNWVg

在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');
相关推荐
一 乐2 分钟前
校园二手交易|基于springboot + vue校园二手交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
啦啦啦_99994 分钟前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学36 分钟前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
Exquisite.38 分钟前
Mysql
数据库·mysql
全栈前端老曹1 小时前
【MongoDB】深入研究副本集与高可用性——Replica Set 架构、故障转移、读写分离
前端·javascript·数据库·mongodb·架构·nosql·副本集
R1nG8631 小时前
CANN资源泄漏检测工具源码深度解读 实战设备内存泄漏排查
数据库·算法·cann
阿钱真强道1 小时前
12 JetLinks MQTT直连设备事件上报实战(继电器场景)
linux·服务器·网络·数据库·网络协议
逍遥德2 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪2 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_2 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd