MySQL MMM高可用架构
- MySQL MMM高可用架构
- 一、MMM概述
- 1、MMM简介
- 2、MMM高可用架构
- 3、MMM故障切换流程
- 二、MMM高可用双主双从架构部署
- 1、配置主主复制(master),主从复制(slave)
- 1)修改 Master1的MySQL配置文件
- 2)把配置文件复制到其它 3 台数据库服务器上并启动服务器
- 3)配置主主复制,两台主服务器相互复制
- 4)配置主从复制,在两台从服务器上做
- 5)测试主主、主从 同步情况
- 2、安装配置 MySQL-MMM
- 1)在所有服务器上安装 MySQL-MMM
- 2)在 Master1上对 MySQL-MMM 进行配置
- 3)把配置文件复制到其它 4 台主机
- 4)修改所有数据库服务器的代理配置文件 mmm_agent.conf
- 5) 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf
- 6)在所有数据库上为 mmm_agent(代理进程)和mmm_moniter(监控进程)授权
- 7)在所有数据库服务器上启动 mysql-mmm-agent
- 8)在 monitor 服务器上启动 mysql-mmm-monitor
- 9)在 monitor 服务器上测试群集
- 3、 故障测试及恢复
- 1)模拟Master宕机以及恢复
- 2)模拟从服务器宕机以及恢复
- 3)客户端测试
MySQL MMM高可用架构
一、MMM概述
1、MMM简介
MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)
是一套支持双主故障切换和双主日常管理的脚本程序。
MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。
由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。
MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。
2、MMM高可用架构
关于 MMM 高可用架构的说明如下:
●mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控主机上运行。
●mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。
●mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。
●mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 MySQL 之上,当某一台 MySQL 宕机时,监管会将 VIP 迁移至其他 MySQL。
在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。
3、MMM故障切换流程
Monitor 检测到 Master1 连接失败
Monitor 发送 set_offline 指令到 Master1 的 Agent
Master1 Agent 如果存活,下线写 VIP,尝试把 Master1 设置为 read_only=1
Moniotr 发送 set_online 指令到 Master2
Master2 Agent 接收到指令,执行 select master_pos_wait() 等待同步完毕
Master2 Agent 上线写 VIP,把 Master2 节点设为 read_only=0
Monitor 发送更改同步对象的指令到各个 Slave 节点的 Agent
各个 Slave 节点向新 Master 同步数据
二、MMM高可用双主双从架构部署
节点服务器 | 所需服务及组件 | IP地址 |
---|---|---|
Master1(db1) | mysql5.7、mysql-mmm | 192.168.210.101 |
Master2(db2) | mysql5.7、mysql-mmm | 192.168.210.102 |
Slave1(db3) | mysql5.7、mysql-mmm | 192.168.210.103 |
Slave2(db4) | mysql5.7、mysql-mmm | 192.168.210.106 |
monitor(db5) | mysql-mmm | 192.168.210.104 |
#所有服务器
#关闭防火墙
systemctl stop firewalld
setenforce 0
1、配置主主复制(master),主从复制(slave)
1)修改 Master1的MySQL配置文件
vim /etc/my.cnf
......
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
#每台 Mysql 主机的 server-id 不能相同
log-error=/usr/local/mysql/data/mysql_error.log
#错误日志
general_log=ON
#通用查询日志
general_log_file=/usr/local/mysql/data/mysql_general.log
slow_query_log=ON
#慢查询日志
slow_query_log_file=mysql_slow_query.log
long_query_time=5
binlog-ignore-db=mysql,information_schema
#不需要同步的库名
log_bin=mysql_bin
#开启二进制日志用于主从数据复制
log_slave_updates=true
#允许slave从master复制数据时可以写入到自己的二进制日志
sync_binlog=1
#"双1设置",MySQL 在每写一次二进制日志时都会同步到磁盘中去
innodb_flush_log_at_trx_commit=1
#"双1设置",每次事务提交时MySQL都会把缓存的数据写入日志文件,并且刷到磁盘中去
auto_increment_increment=2
#自增字段一次递增多少
auto_increment_offset=1
#自增字段的起始值
2)把配置文件复制到其它 3 台数据库服务器上并启动服务器
注意:配置文件中的 server_id 要修改
scp /etc/my.cnf root@192.168.210.102:/etc/
scp /etc/my.cnf root@192.168.210.103:/etc/
scp /etc/my.cnf root@192.168.210.106:/etc/systemctl restart mysqld
#修改Master2 Slave1 Slave2的Mysql配置文件
#修改server_id 每个服务器不一致
3)配置主主复制,两台主服务器相互复制
#在两台主服务器上都执行授予从的权限
#从服务器上不需要执行
grant replication slave on *.* to 'replication'@'192.168.210.%' identified by '123456';#在两台主服务器上查看,记录日志文件名称和同步点
show master status;
#在Master1上配置同步
change master to master_host='192.168.210.102',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G
#在Master2上配置同步
change master to master_host='192.168.210.101',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G
4)配置主从复制,在两台从服务器上做
#同一时间只能有一个主服务器工作
change master to master_host='192.168.210.101 ',master_user='replication',master_password='123456',master_log_file='mysql_bin.000001',master_log_pos=461;start slave;show slave status\G
5)测试主主、主从 同步情况
create database db_test;
2、安装配置 MySQL-MMM
1)在所有服务器上安装 MySQL-MMM
#获取软件包
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#安装依赖和软件
yum -y install epel-release
yum -y install mysql-mmm*
2)在 Master1上对 MySQL-MMM 进行配置
cd /etc/mysql-mmm/
vim mmm_common.conf
……
<host default>cluster_interface ens33……replication_user replicationreplication_password 123456agent_user mmm_agentagent_password 123456<host db1>ip 192.168.210.101mode masterpeer db2
</host><host db2>ip 192.168.210.102mode masterpeer db1
</host><host db3>ip 192.168.210.103mode slave
</host><host db4>ip 192.168.210.106mode slave
</host><role writer>hosts db1, db2ips 192.168.210.188mode exclusive #只有一个 host 可以进行写操作模式
</role><role reader>hosts db3, db4ips 192.168.210.198, 192.168.210.199mode balanced #多个 slave 主机可以进行读操作模式
</role>
3)把配置文件复制到其它 4 台主机
所有主机该配置文件内容都是一样的。
scp mmm_common.conf root@192.168.210.102:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.103:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.106:/etc/mysql-mmm/
scp mmm_common.conf root@192.168.210.104:/etc/mysql-mmm/
4)修改所有数据库服务器的代理配置文件 mmm_agent.conf
修改 mmm_agent.conf
vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this db1 #根据不同的主机分别修改为 db1,db2,db3,db4
5) 在 monitor 监控服务器上修改监控配置文件 mmm_mon.conf
vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
.....ping_ips 192.168.210.101,192.168.210.102,192.168.210.103,192.168.210.106 #指定所有数据库服务器的 IPauto_set_online 10 #指定自动上线时间
</monitor><host default>monitor_user mmm_monitor #指定 mmm_monitor 的用户名monitor_password 123456 指定 mmm_monitor 的密码
</host>
6)在所有数据库上为 mmm_agent(代理进程)和mmm_moniter(监控进程)授权
grant super, replication client, process on *.* to 'mmm_agent'@'192.168.210.%' identified by '123456';grant replication client on *.* to 'mmm_monitor'@'192.168.210.%' identified by '123456';flush privileges;
7)在所有数据库服务器上启动 mysql-mmm-agent
systemctl enable mysql-mmm-agent.service --now
8)在 monitor 服务器上启动 mysql-mmm-monitor
systemctl start mysql-mmm-monitor.service
9)在 monitor 服务器上测试群集
mmm_control show
#查看各节点的情况
#检测监控功能是否都完善
mmm_control checks all
#需要各种OK
#指定绑定 VIP 的主机db2
mmm_control move_role writer db2mmm_control show
mmm_control move_role writer db1
#修改绑定VIP的主机为db1
mmm_control show
3、 故障测试及恢复
1)模拟Master宕机以及恢复
1.停止Master1的mysql服务
systemctl stop mysqld
2.查看VIP漂移情况
#切换到Monitor服务器
mmm_control show#VIP成功漂移至master2,且master1显示HARD_OFFLINE
3.重启Master1的mysql服务
systemctl start mysqld
4.查看Master1是否恢复
#切换至monitor
mmm_control show
#显示等待恢复
#继续查看节点状况
#等待数秒后重新查看,发现Master1在线,但未能获得VIP
mmm_control show
2)模拟从服务器宕机以及恢复
1.停止Slave1的mysql服务
#Slave1
systemctl stop mysqld
2.查看VIP漂移情况
#切换至monitor
mmm_control show#Slave1 离线
#VIP漂移至Slave2,服务不影响
3.重启Slave1的MySQL服务
#切换到Slave1
systemctl start mysqld
4.查看slave1是否恢复
#切换至monitor
mmm_control show#多次执行
3)客户端测试
1.在Master1服务器上为monitor服务器地址授权登录
#切换到Master1
mysql -u root -pabc123grant all on *.* to 'testdba'@'192.168.210.104' identified by '123456';
#master1授权给monitor
flush privileges;
2.在monitor服务器上使用写VIP登录
#切换到monitor
mysql -utestdba -p123456 -h 192.168.210.188
#以授权的用户名和密码使用写VIP登录
3.创建数据,测试同步情况
#monitor服务器
create database client_test;
#Master1服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test
| db_test
| mysql |
| performance_schema |
| sys | |
+--------------------+
6 rows in set (0.00 sec)
#Master2服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test
| db_test
| mysql |
| performance_schema |
| sys | |
+--------------------+
6 rows in set (0.00 sec)
#Slave1服务器mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test
| db_test
| mysql |
| performance_schema |
| sys | |
+--------------------+
6 rows in set (0.00 sec)
#Slave2服务器
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client_test
| db_test
| mysql |
| performance_schema |
| sys | |
+--------------------+
6 rows in set (0.00 sec)
相关文章:

MySQL MMM高可用架构
MySQL MMM高可用架构一、MMM概述1、MMM简介2、MMM高可用架构3、MMM故障切换流程 二、MMM高可用双主双从架构部署1、配置主主复制(master),主从复制(slave)1)修改 Master1的MySQL配置文件2)把配置…...

Spring Boot中配置文件介绍及其使用教程
目录 一、配置文件介绍 二、配置简单数据 三、配置对象数据 四、配置集合数据 五、读取配置文件数据 六、占位符的使用 一、配置文件介绍 SpringBoot项目中,大部分配置都有默认值,但如果想替换默认配置的话,就可以使用application.prop…...
Hobby脚本自动化工具
Hobby脚本自动化工具 功能简介:可以按照指定编排的配置文件,按顺序执行并监听 使用场景:可以用在前期信息收集的步骤上,将一些常见的脚本进行归纳,并编写成配置文档进行自动化处理 优点:可以扩展性强&am…...

Matlab随机数的产生
1、常见分布随机数的产生 1.1 二项分布 在贝努力试验中,某事件A发生的概率为p,重复该实验n次,X表示这n次实验中A发生的次数,则随机变量X服从的概率分布律(概率密度)为 记为 binopdf(x,n,p) p…...

计算机网络 第四章:网络层
一.网络层概述 1.1分组转发和路由选择 网络层的主要任务就是将分组从源主机经过多个网络和多段链路传输到目的主机,可以将该任务划分为分组转发和路由选择两种重要的功能。 如图所示:这些异构型网络如果只是需要各自内部通信,那它们只需要实…...
分享一个docker无法启动的小问题
准备看看docker服务怎么样 [rootlocalhost ~]# docker ps Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? 这一看就是docker的进程崩了,我们启动下进程 [rootlocalhost ~]# systemctl start docker Faile…...
Linux 安全 - Capabilities机制
文章目录 前言一、简介二、Capabilities list2.1 POSIX-draft defined capabilities2.2 Linux-specific capabilities 三、 Past and current implementation四、Thread capability sets五、File capabilities六、Transformation of capabilities during execve()七、Capabilit…...

分布式搜索引擎es-3
文章目录 数据聚合聚合的种类RestAPI实现聚合 数据聚合 什么是聚合? 聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如…...

Matlab坐标轴标签中文设置宋体
对y坐标输出中文宋体 新罗马字符 x[1,2,3,4,5,6,7]; plot(x) ylabel(\fontname{宋体}\fontsize{20}长度\fontname{Times New Roman}\fontsize{10} (μm))可以灵活设置字体和大小,其图片如下图所示 也可以对全图的文字设置同一个字体 set(gca,FontSize,9,Fontname, Times New…...
做一个贪吃蛇小游戏happy一下
直接Vue上代码 <template><div><div>贪吃蛇</div><canvas id"canvas" width"400" height"400"></canvas></div> </template><script> export default {data() {return {ctx: null,inter…...

opencv形态学-膨胀
opencv形态学-膨胀 膨胀就是取每一个位置结构元邻域内最大值作为该位置的输出灰度值; 膨胀是取邻域内最大值,那么显然膨胀后图像整体亮度会比原先要高,图像中亮的物体尺寸会变大,相反暗的尺寸会减小,甚至是消失 结构元…...

玄子Share 设计模式 GOF 全23种 + 七大设计原则
玄子Share 设计模式 GOF 全23种 七大设计原则 前言: 此文主要内容为 面向对象七大设计原则(OOD Principle)GOF(Gang Of Four)23种设计模式拓展的两个设计模式 简单工厂模式(Simple Factory Pattern&#x…...

单链表操作 C实现
struct LNode { //定义一个节点 int data; //数据域 struct LNode *next; //指针域 }; 0.初始化 typedef sturct LNode{ //定义单链表结点类型 int date ; //每个结点存放一个数据元素struct LNode *next; //指针指向下…...

WordPress主题网站首页添加好看的四格小工具教程
直接到网站根目录创建一个css文件(文件名:sige.css),文件名可自定义(注意文件名一致) <link rel"stylesheet" href"你的网站/sige.css" type"text/css" > 然后在header.php模板最上方添加引入代码 也可自定义HTML里添加css代码最上方写…...

unittest自动化测试框架讲解以及实战
为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,通常指函数或者类,一般是开发完成的。 单元…...

数学建模之Matlab基础操作
作者由于后续课程也要学习Matlab,并且之前也进行了一些数学建模的练习(虽然是论文手),所以花了几天零碎时间学习Matlab的基础操作,特此整理。 基本运算 a55 %加法,同理减法 b2^3 %立方 c5*2 %乘法 x 1; …...
【Nuxt】04 Nuxt2-SEO: sitemap.xml、seo优化、robots.txt
1 SiteMap设置 环境准备 注意生成sitemap依赖于nuxtjs/sitemap,并且需要用axios进行请求,不要使用nuxtjs/axios,不然会报错 sitemap.xml配置 在nuxt.config.js中配置下面的内容 npm install nuxtjs/sitemap npm install axios在static/s…...

VMware VSAN 入门
一、虚拟化的存储 1.1、对于数据中心来说最重要的是数据,而承载数据的设备就是存储设备(Storage) 1.2、物理服务器的本地存储阵列 与 虚拟化服务器的本地存储阵列 对比 1.3、避免单台服务器故障的虚拟化高级特性:vSphere HA技术 …...

【设计模式】备忘录模式
文章目录 1.备忘录模式定义2.备忘录模式的角色3.备忘录模式实现3.1.场景说明3.2.结构类图3.3.代码实现 4.备忘录模式优缺点5.备忘录模式适用场景6.备忘录模式总结 主页传送门:💁 传送 1.备忘录模式定义 备忘录(Memento Pattern)模…...
vue3+elementUiPlus表格导出功能
1.下载需要的组件包 npm install file-saver xlsx 2.页面中导入 import FileSaver from file-saver import * as XLSX from xlsx; 3.页面中的表格加一个id <el-table :data"tableData" ref"multipleTableRef" style"width…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...