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');
相关推荐
夜泉_ly1 小时前
MySQL -安装与初识
数据库·mysql
qq_529835352 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New5 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6755 小时前
数据库基础1
数据库
我爱松子鱼5 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo5 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser6 小时前
【SQL】多表查询案例
数据库·sql
Galeoto6 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)7 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231117 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql