mysql主从复制与读写分离(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: mysql主从复制与读写分离(二)

五、主从复制案例(半同步复制)


实验环境


Master 服务器:192.168.109.137 mysql5.7 centos7-7


Slave1 服务器:192.168.109.134 mysql5.7 centos7-4


Slave2 服务器:192.168.109.135 mysql5.7 centos7-5


主数据库配置

#在 [mysqld] 区域添加下面内容
vim /etc/my.cnf    
plugin-load=rpl_semi_sync_master=semisync_master.so #加载mysql半同步复制的插件
rpl_semi_sync_master_enabled=ON   #或者设置为"1",即开启半同步复制功能
rpl-semi-sync-master-timeout=1000    #超时时间为1000ms,即1s
#重启服务
systemctl restart mysqld


从数据库配置

#写入
vim /etc/my.cnf 
plugin-load=rpl_semi_sync_slave=semisync_slave.so
rpl_semi_sync_slave_enabled=ON
#重启服务
systemctl restart mysqld


查看半同步是否在运行

#主数据库执行
show status like 'Rpl_semi_sync_master_status';
show variables like 'rpl_semi_sync_master_timeout';
#从数据库执行(此时可能还是OFF状态,需要在下一步重启IO线程后,从库半同步状态才会为ON)
show status like 'Rpl_semi_sync_slave_status';
#重启从数据库上的IO线程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;



面试题:半同步复制什么情况下会降权为异步复制?


答:当超时的时候

#在主库查询半同步状态
show status like '%Rpl_semi%';  
mysql> show status like '%Rpl_semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
+--------------------------------------------+-------+
14 rows in set (0.00 sec)
#参数说明:
Rpl_semi_sync_master_clients                #半同步复制客户端的个数
Rpl_semi_sync_master_net_avg_wait_time      #平均等待时间(默认毫秒)
Rpl_semi_sync_master_net_wait_time          #总共等待时间
Rpl_semi_sync_master_net_waits              #等待次数
Rpl_semi_sync_master_no_times               #关闭半同步复制的次数
Rpl_semi_sync_master_no_tx                  #表示没有成功接收slave提交的次数
Rpl_semi_sync_master_status                 #表示当前是异步模式还是半同步模式,on为半同步
Rpl_semi_sync_master_timefunc_failures      #调用时间函数失败的次数
Rpl_semi_sync_master_tx_avg_wait_time       #事物的平均传输时间
Rpl_semi_sync_master_tx_wait_time           #事物的总共传输时间
Rpl_semi_sync_master_tx_waits               #事物等待次数
Rpl_semi_sync_master_wait_pos_backtraverse  #可以理解为"后来的先到了,而先来的还没有到的次数"
Rpl_semi_sync_master_wait_sessions          #当前有多少个session因为slave的回复而造成等待
Rpl_semi_sync_master_yes_tx                 #成功接受到slave事物回复的次数
当半同步复制发生超时(由rpl_semi_sync_master_timeout参数控制,默认为10000ms,即10s),会暂时关闭半同步复制,转而使用异步复制,也就是会自动降为异步工作。
当 master dump 线程发送完一个事务的所有事件之后,如果在 rpl_semi_sync_master_timeout 内,收到了从库的响应, 则主从又重新恢复为半同步复制。

注:


在一主多从的架构中,如果要开启半同步复制,并不要求所有的从都是半同步复制。


MySQL 5.7极大的提升了半同步复制的性能。


5.6 版本的半同步复制,dump thread 承担了两份不同且又十分频繁的任务:传送binlog 给 slave ,还需要等待 slave 反馈信息,而且这两个任务是串行的,dump thread 必须等待 slave 返回之后才会传送下一个 events 事务。dump thread 已然成为整个半同步提高性能的瓶颈。在高并发业务场景下,这样的机制会影响数据库整体的系统吞吐量(TPS)。


5.7 版本的半同步复制中,独立出一个 ack collector thread ,专门用于主节点接收 slave 的反馈信息。这样 master 上有两个线程独立工作,可以同时发送 binlog 到 slave ,和接收 slave 的反馈。


六、读写分离案例


实验环境


Master 服务器:192.168.109.137 mysql5.7 centos7-7


Slave1 服务器:192.168.109.134 mysql5.7 centos7-4


Slave2 服务器:192.168.109.135 mysql5.7 centos7-5


Amoeba 服务器:192.168.109.131 jdk1.6、Amoeba centos7-1


客户端 服务器:192.168.109.133 mysql centos7-3



Amoeba服务器 centos7-1:192.168.109.131


#Amoeba服务器配置
##安装 Java 环境##
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
上传软件包至opt下
cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
./jdk-6u14-linux-x64.bin
#按yes,按enter
#添加环境变量
vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6.0_14
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin
#刷新
source /etc/profile
#查看jkd版本
java -version






##安装 Amoeba软件##
#创建Amoeba村发放目录
mkdir /usr/local/amoeba
#解压
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#给权限
chmod -R 755 /usr/local/amoeba/
#开启
/usr/local/amoeba/bin/amoeba
#如显示amoeba start|stop说明安装成功
##配置 Amoeba读写分离,两个 Slave 读负载均衡##
#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
grant all on *.* to amoeba@'192.168.109.%' identified by '000000';
(amoeba用户自定义)
#再回到amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/
cp amoeba.xml amoeba.xml.bak
vim amoeba.xml          #修改amoeba配置文件
--30行--
<property name="user">amoeba</property>
--32行-- 
<property name="password">000000</property>
--115行--
<property name="defaultPool">master</property>
--117-去掉注释-
<property name="writePool">master</property>
<property name="readPool">slaves</property>
#修改数据库配置文件
cp dbServers.xml dbServers.xml.bak
vim dbServers.xml        
--23行--注释掉  作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- <property name="schema">test</property> -->
--26--修改
<property name="user">amoeba</property>
--28-30--去掉注释
<property name="password">000000</property>
--45--修改,设置主服务器的名Master
<dbServer name="master"  parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.168.109.137</property>
--52--修改,设置从服务器的名slave1
<dbServer name="slave1"  parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.109.134</property>
--58--复制上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.109.135</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>
#后台启动Amoeba软件,按ctrl+c 返回
/usr/local/amoeba/bin/amoeba start&  
#查看8066端口是否开启,默认端口为TCP 8066
netstat -anpt | grep java




登录名是amoeba,写错了



最后一行写错了,应该是slave1,slave2



客户端配置 centos7-3 192.168.109.133


#yum安装数据库
yum install -y mariadb mariadb-server
#开启服务
systemctl start mariadb.service 
netstat -natp |grep 3306
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      58897/mysqld  
#主节点创建表并插入数据
mysql> create database stevelu;
mysql> use stevelu;
mysql> create table student(id int,name char(10),age int);
mysql> insert into student values(1,'zhangsan',18);
mysql> insert into student values(2,'lisi',20);












总结


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
18天前
|
监控 关系型数据库 MySQL
深入了解MySQL主从复制:构建高效稳定的数据同步架构
深入了解MySQL主从复制:构建高效稳定的数据同步架构
57 1
|
18天前
|
负载均衡 监控 关系型数据库
MySQL 官宣:支持读写分离了!!
【10月更文挑战第8天】MySQL的读写分离功能显著提升了数据库性能、可用性和可靠性。通过将读写操作分配至不同服务器,有效减轻单个服务器负载,提高响应速度与吞吐量,并增强系统稳定性。此外,它还支持便捷的扩展方式,可通过增加只读服务器提升读操作性能。实现读写分离的方法包括软件层面(如使用数据库中间件)和硬件层面(使用独立服务器)。使用时需注意数据一致性、负载均衡及监控管理等问题。
|
1月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
78 6
|
1月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
57 1
|
1月前
|
关系型数据库 MySQL Java
MySQL主从复制实现读写分离
MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离
MySQL主从复制实现读写分离
|
2月前
|
SQL 关系型数据库 MySQL
说一下MySQL主从复制的原理?
【8月更文挑战第24天】说一下MySQL主从复制的原理?
55 0
|
2月前
|
存储 关系型数据库 MySQL
实战!MySQL主从复制一键搭建脚本分享
实战!MySQL主从复制一键搭建脚本分享
50 2
|
2月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 如何减少主从复制延迟?
在Linux中,mysql 如何减少主从复制延迟?
|
2月前
|
SQL 关系型数据库 MySQL
配置MySQL主从复制(一主一从)
配置MySQL主从复制(一主一从)