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');
相关推荐
初晴~10 分钟前
【Redis分布式锁】高并发场景下秒杀业务的实现思路(集群模式)
java·数据库·redis·分布式·后端·spring·
盖世英雄酱5813615 分钟前
InnoDB 的页分裂和页合并
数据库·后端
YashanDB2 小时前
【YashanDB知识库】XMLAGG方法的兼容
数据库·yashandb·崖山数据库
独行soc2 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍11基于XML的SQL注入(XML-Based SQL Injection)
数据库·安全·web安全·漏洞挖掘·sql注入·hw·xml注入
小林coding2 小时前
阿里云 Java 后端一面,什么难度?
java·后端·mysql·spring·阿里云
风间琉璃""3 小时前
bugkctf 渗透测试1超详细版
数据库·web安全·网络安全·渗透测试·内网·安全工具
drebander3 小时前
SQL 实战-巧用 CASE WHEN 实现条件分组与统计
大数据·数据库·sql
IvorySQL3 小时前
IvorySQL 4.0 发布:全面支持 PostgreSQL 17
数据库·postgresql·开源数据库·国产数据库·ivorysql
18号房客3 小时前
高级sql技巧进阶教程
大数据·数据库·数据仓库·sql·mysql·时序数据库·数据库架构
Dawnㅤ3 小时前
使用sql实现将一张表的某些字段数据存到另一种表里
数据库·sql