案例:CentOS8 在 MySQL8.0 实现半同步复制

异步复制

MySQL 默认的复制即是异步的,主库在执行完客户端提交的事务后会立即将结果返给给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主节点如果 crash 掉了,此时主节点上已经提交的事务可能并没有传到从库上,如果此时,强行将从提升为主,可能导致新主上的数据不完整。

全同步复制

指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响。

半同步复制( 半异步复制 )

是介于全同步复制与全异步复制之间的一种,主库只需要等待至少一个从库节点收到并且 Flush Binlog 到 Relay Log 文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全完成并且提交的反馈,如此,节省了很多时间。

时间阈值概念:如果主节点服务器仅同步数据到其中一个从节点速度也很慢。( 比如设置超时阈值 10S ,从节点 10S 没有数据同步完成并反馈结果,主节点会直接将结果返回客户端。不等你从节点完成同步了。 )

范例:CentOS8 在 MySQL8.0 实现半同步复制

注意:每个数据库版本半同步复制的方法有所不同

建议:

二进制日志格式( ROW 行类型 )

所有节点都开启二进制日志功能( 并将二进制日志文件分开存放 )

所有从节点开启只读功能( read-only )

// 前置工作
yum install mysql-server -y
systemctl enable --now mysqld// 创建二进制日志目录
mkdir /data/log/mysql -p
chown -R mysql:mysql /data/log/mysql// 关闭防火墙 and SELinux
setenforce 0
systemctl disable --now firewalld
# 查看插件文件 ( 库文件 )
[root@master ~] rpm -ql mysql-server | grep semisync
/usr/lib64/mysql/plugin/semisync_master.so
/usr/lib64/mysql/plugin/semisync_replica.so
/usr/lib64/mysql/plugin/semisync_slave.so
/usr/lib64/mysql/plugin/semisync_source.so// master 服务器配置
[root@master ~] vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=8
log-bin
rpl_semi_sync_master_enabled=ON    # 修改此行, 需要先安装 semisync_master.so 插件后, 再重启, 否则无法启动 ( 开启主节点的半同步功能 )
rpl_semi_sync_master_timeout=3000  # 超时阈值: 设置 3s 内无法同步, 也将返回成功信息给客户端  ( 默认: 10S )// 创建账户并授权
mysql> show master logs;    # 查看位置
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000001 |       156 | No        |
+---------------+-----------+-----------+
1 row in set (0.00 sec)# 创建账户并授权
mysql> create user repluser@'192.168.80.%' identified by '123456';
mysql> grant replication slave on *.* to 'repluser'@'192.168.80.%';// slave1 服务器配置
[root@slave1 ~] vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=18
rpl_semi_sync_slave_enabled=ON    # 修改此行, 需要先安装 semisync_slave.so 插件后, 再重启, 否则无法启动 ( 插件开机自启 )// slave2 服务器配置
[root@slave2 ~] vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
server-id=28
rpl_semi_sync_slave_enabled=ON    # 修改此行, 需要先安装 semisync_slave.so 插件后, 再重启, 否则无法启动  ( 插件开机自启 )// "主服务器配置"
mysql> SHOW PLUGINS;    # 查看插件
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; # 永久安装插件
mysql> SET GLOBAL rpl_semi_sync_master_enabled=1;        # 临时修改变量
mysql> SET GLOBAL rpl_semi_sync_master_timeout = 3000;   # 超时长 3S, 默认值为 10s
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 3000       |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)// 从节点连接主节点 ( 注意: "两台从节点都配置连接主节点" )
mysql> CHANGE MASTER TOMASTER_HOST='192.168.80.8',MASTER_USER='repluser',MASTER_PASSWORD='123456',MASTER_PORT=3306,MASTER_LOG_FILE='binlog.000001',MASTER_LOG_POS=156;// 从服务器配置 ( 注意: "两个从节点都需要安装好插件" )
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;         # 临时修改变量
mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';              # 验证从服务器插件启用状态
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.02 sec)// 从节点重启数据库服务
[root@slave1 ~] systemctl restart mysqld
[root@slave2 ~] systemctl restart mysqld// 从节点启用复制线程
# 注意: 如果之前已经实现主从复制 需要 stop slave;start slave;  mysql> start slave;    # 两台从节点都启用复制线程
mysql> SHOW GLOBAL STATUS LIKE '%semi%';        # 验证状态
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Rpl_semi_sync_slave_status | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)// 主节点查看从节点状态 
mysql> SHOW GLOBAL STATUS LIKE '%semi%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 2     |        # 数量
| 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)// 从节点验证线程
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.80.8Master_User: repluserMaster_Port: 3306Connect_Retry: 60Master_Log_File: binlog.000001Read_Master_Log_Pos: 689Relay_Log_File: centos8-relay-bin.000003Relay_Log_Pos: 854Relay_Master_Log_File: binlog.000001Slave_IO_Running: Yes                # 运行中Slave_SQL_Running: Yes# 运行中// 验证半同步复制
mysql> create database db1;    # 主节点
mysql> show databases;         # 从节点
mysql> show databases;         # 从节点

// "测试效果"
stop slave;        # 两个从节点停止复制线程
stop slave;        # 两个从节点停止复制线程
create database db2;    # 主节点创建数据库 ( 三秒后自动完成创建 因为超过了阈值 )

start slave;        # 两个从节点启用复制线程
start slave;        # 两个从节点启用复制线程

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/679319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python:解析获取连续的重叠对pairwise

简介:pairwise函数,返回从输入迭代器获取的重叠对的迭代器,是Python 3.10 新特性,表示一个迭代器从对象中获取连续的重叠对,在某些场景中可以优化代码运行效率。pairwise 函数是一种用于处理列表中元素之间配对操作的通…

【Langchain Agent研究】SalesGPT项目介绍(二)

【Langchain Agent研究】SalesGPT项目介绍(一)-CSDN博客 上节课,我们介绍了SalesGPT他的业务流程和技术架构,这节课,我们来关注一下他的项目整体结构、poetry工具和一些工程项目相关的设计。 项目整体结构介绍 我们把…

互联网医院架构系统设计与实现

随着互联网技术的快速发展,互联网医院作为一种新兴的医疗服务模式,正逐渐受到人们的关注和使用。本文将介绍互联网医院架构系统的设计原则和关键组件,以及如何实现一个安全、高效和可扩展的互联网医疗服务平台。 内容: 1. 引言 …

LeetCode Python - 9.回文数

文章目录 题目答案运行结果 题目 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如&am…

【开源】基于JAVA+Vue+SpringBoot的实验室耗材管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 耗材档案模块2.2 耗材入库模块2.3 耗材出库模块2.4 耗材申请模块2.5 耗材审核模块 三、系统展示四、核心代码4.1 查询耗材品类4.2 查询资产出库清单4.3 资产出库4.4 查询入库单4.5 资产入库 五、免责说明 一、摘要 1.1…

Ps:信息面板

Ps菜单:窗口/信息 Window/Info 快捷键:F8 信息 Info面板提供了关于工作文档和当前操作的实时信息,包括鼠标指针的位置、取样点的颜色值(包括调整前后的对比值),以及当前所用工具的提示信息等等,…

PyTorch深度学习实战(26)——多对象实例分割

PyTorch深度学习实战(26)——多对象实例分割 0. 前言1. 获取并准备数据2. 使用 Detectron2 训练实例分割模型3. 对新图像进行推断小结系列链接 0. 前言 我们已经学习了多种图像分割算法,在本节中,我们将学习如何使用 Detectron2 …

【前端高频面试题--Vue基础篇】

🚀 作者 :“码上有前” 🚀 文章简介 :前端高频面试题 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬前端高频面试题--Vue基础篇 Vue基本原理双向绑定与MVVM模型Vue的优点计算属性与监听属性计算属性监…

python+flask+django医院预约挂号病历分时段管理系统snsj0

技术栈 后端:python 前端:vue.jselementui 框架:django/flask Python版本:python3.7 数据库:mysql5.7 数据库工具:Navicat 开发软件:PyCharm . 第一,研究分析python技术&#xff0c…

浅谈人工智能之深度学习~

目录 前言:深度学习的进展 一:深度学习的基本原理和算法 二:深度学习的应用实例 三:深度学习的挑战和未来发展方向 四:深度学习与机器学习的关系 五:深度学习与人类的智能交互 悟已往之不谏&#xff0…

模拟发送 Ctrl+Alt+Del 快捷键

目录 前言 一、在 XP 系统上模拟 SAS 二、在不低于 Vista 的系统上模拟 SAS 2.1 一些细节 2.2 实现原理和应用 三、完整实现代码和测试 3.1 客户端控制台程序 3.2 服务程序 3.3 编译&测试程序 四、总结&更新 参考文献 前言 对于开启了安全登陆的窗口工作站…

nodejs爬虫框架

nodejs爬虫框架 在Node.js中,有一些常用的爬虫框架可以帮助你实现网页抓取和数据提取的任务。以下是几个流行的Node.js爬虫框架: 1. **Puppeteer**: Puppeteer 是由 Google 开发的一个用于控制 headless Chrome 或 Chromium 浏览器的 Node.js 库。它提供…

python-产品篇-游戏-玛丽冒险

文章目录 开发环境要求运行方法代码效果 开发环境要求 本系统的软件开发及运行环境具体如下。 (1)操作系统:Windows 7、Windows 8、Windows 10。 (2)Python版本:Python 3.7.0。 (3)…

Packet Tracer - Configure IOS Intrusion Prevention System (IPS) Using the CLI

Packet Tracer - 使用CLI配置IOS入侵防御系统(IPS) 地址表 目标 启用IOS入侵防御系统(IPS)。 配置日志记录功能。 修改IPS签名规则。 验证IPS配置。 背景/场景 您的任务是在R1上启用IPS,扫描进入192.168.1.0网络…

Matplotlib核心:掌握Figure与Axes

详细介绍Figure和Axes(基于Matplotlib) 🌵文章目录🌵 🌳引言🌳🌳 一、Figure(图形)🌳🍁1. 创建Figure🍁🍁2. 添加Axes&am…

四.Linux实用操作 12-14.环境变量文件的上传和下载压缩和解压

目录 四.Linux实用操作 12.环境变量 环境变量 环境变量--PATH $ 符号 自行设置环境变量 自定义环境变量PATH 总结 四.Linux实用操作 13.文件的上传和下载 上传,下载 rz,sz命令 四.Linux实用操作 14.压缩和解压 压缩格式 tar命令 tar命令压缩…

深度解析Pandas聚合操作:案例演示、高级应用与实战技巧【第74篇—Pandas聚合】

深度解析Pandas聚合操作:案例演示、高级应用与实战技巧 在数据分析和处理领域,Pandas一直是Python中最受欢迎的库之一。它提供了丰富的数据结构和强大的功能,使得数据清洗、转换和分析变得更加高效。其中,Pandas的聚合操作在数据…

数据库基础学习笔记

一.基础概念 数据库、数据库管理系统、SQL 主流数据库: mysql的安装:略 mysql图形化界面的安装:略 二.数据模型 1). 关系型数据库(RDBMS) 概念:建立在关系模型基础上,由多张相互连接的二维表…

华为 huawei 交换机 接口 MAC 地址学习限制接入用户数量 配置示例

目录 组网需求: 配置思路: 操作步骤: 配置文件: 组网需求: 如 图 2-14 所示,用户网络 1 和用户网络 2 通过 LSW 与 Switch 相连, Switch 连接 LSW 的接口为GE0/0/1 。用户网络 1 和用户网络 2 分别属于 VLAN10 和 V…

导数的定义【高数笔记】

【含义】可以抽象成,在一个极其短的时间段内,温度差 / 时间差 【本质】瞬间的平均值 【分类】可以分成几类?每类需要注意的点 【导数存在的必要条件】 【导数与极限的关系】可以参考导数的定义的式子 【题型解法】分几个题型?每个…