MySQL架构MMM

news2024/11/15 18:39:51

官网地址:

Multi-Master Replication Manager for MySQL [MMM for MySQL Wiki]

简介

MMM(Master-Master replication manager for MySQL)是一套支持双主故障切换和双主日常管理的脚本程序。MMM使用Perl语言开发,主要用来监控和管理MySQL Master-Master(双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时刻备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个slave的read负载均衡。

MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全的保证数据一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度的保证业务可用性的场景。对于那些对数据的一致性要求很高的业务,非常不建议采用MMM这种高可用架构。

MMM项目来自 Google:http://code.google.com/p/mysql-master-master

官方网站为:http://mysql-mmm.org

下面我们通过一个实际案例来充分了解MMM的内部架构,如下图所示。

 

具体的配置信息如下所示:

角色 ip地址 主机名字 server-id monitoring 192.168.0.30 db2 - master1 192.168.0.60 db1 1 master2 192.168.0.50 db2 2 slave1 192.168.0.40 db3 3

业务中的服务ip信息如下所示:

ip地址 角色 描述 192.168.0.108 write 应用程序连接该ip对主库进行写请求 192.168.0.88 read 应用程序连接该ip进行读请求 192.168.0.98 read 应用程序连接该ip进行读请求

具体的配置步骤如下:

(1)主机配置

配置/etc/hosts,在所有主机中,添加所有的主机信息:

[root@192.168.0.30 ~]# cat /etc/hosts 192.168.0.60 db1 192.168.0.50 db2 192.168.0.40 db3 [root@192.168.0.30 ~]#

(2)首先在3台主机上安装mysql和搭建复制(192.168.0.60和192.168.0.50互为主从,192.168.0.40为192.168.0.60的从)具体的复制搭建这里就省略,要是这都不会,那么该文章对你就没意思了。然后在每个mysql的配置文件中加入以下内容,注意server_id 不能重复。

db1(192.168.0.60)上:

server-id = 1 log_slave_updates = 1 auto-increment-increment = 2 auto-increment-offset = 1

db2(192.168.0.50)上:

server-id = 2 log_slave_updates = 1 auto-increment-increment = 2 auto-increment-offset = 2

db3(192.168.0.40)上:

server-id = 3 log_slave_updates = 1

上面的id不一定要按顺序来,只要没有重复即可。

(3)安装MMM所需要的Perl模块(所有服务器)执行该脚本,也可以安装epel源,然后yum -y install mysql-mmm*来安装MMM:

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum -y install mysql-mmm*

[root@192.168.0.60 ~]# cat install.sh #!/bin/bash wget http://xrl.us/cpanm --no-check-certificate mv cpanm /usr/bin chmod 755 /usr/bin/cpanm cat > /root/list install Algorithm::Diff install Class::Singleton install DBI install DBD::mysql install File::Basename install File::stat install File::Temp install Log::Dispatch install Log::Log4perl install Mail::Send install Net::ARP install Net::Ping install Proc::Daemon install Thread::Queue install Time::HiRes EOF for package in `cat /root/list` do cpanm $package done [root@192.168.0.60 ~]#

(4)

下载mysql-mmm软件,在所有服务器上安装:

[root@192.168.0.60 ~]# wget http://mysql-mmm.org/_media/:mmm2:mysql-mmm-2.2.1.tar.gz

[root@192.168.0.60 ~]# mv :mmm2:mysql-mmm-2.2.1.tar.gz mysql-mmm-2.2.1.tar.gz [root@192.168.0.60 ~]# tar xf mysql-mmm-2.2.1.tar.gz [root@192.168.0.60 ~]# cd mysql-mmm-2.2.1 [root@192.168.0.60 mysql-mmm-2.2.1]# make install

mysql-mmm安装后的主要拓扑结构如下所示(注意:yum安装的和源码安装的路径有所区别):

目录 介绍 /usr/lib/perl5/vendor_perl/5.8.8/MMM MMM使用的主要perl模块 /usr/lib/mysql-mmm MMM使用的主要脚本 /usr/sbin MMM使用的主要命令的路径 /etc/init.d/ MMM的agent和monitor启动服务的目录 /etc/mysql-mmm MMM配置文件的路径,默认所以的配置文件位于该目录下 /var/log/mysql-mmm 默认的MMM保存日志的位置

到这里已经完成了MMM的基本需求,接下来需要配置具体的配置文件,其中mmm_common.conf,mmm_agent.conf为agent端的配置文件,mmm_mon.conf为monitor端的配置文件。

(5)配置agent端的配置文件,需要在db1,db2,db3上分别配置。

在db1主机上配置agent配置文件:

[root@192.168.0.60 ~]# cd /etc/mysql-mmm/ [root@192.168.0.60 mysql-mmm]# cat mmm_common.conf active_master_role writer cluster_interface eth1 pid_path /var/run/mmm_agentd.pid bin_path /usr/lib/mysql-mmm/ replication_user repl replication_password 123456 agent_user mmm_agent agent_password mmm_agent ip 192.168.0.60 mode master peer db2 ip 192.168.0.50 mode master peer db1 ip 192.168.0.40 mode slave hosts db1, db2 ips 192.168.0.108 mode exclusive hosts db2, db3 ips 192.168.0.88, 192.168.0.98 mode balanced [root@192.168.0.60 mysql-mmm]#

其中replication_user用于检查复制的用户,agent_user为agent的用户,mode标明是否为主或者备选主,或者从库。mode exclusive主为独占模式,同一时刻只能有一个主,中hosts表示目前的主库和备选主的真实主机ip或者主机名,ips为对外提供的虚拟机ip地址,中hosts代表从库真实的ip和主机名,ips代表从库的虚拟ip地址。

由于db2和db3两台主机也要配置agent配置文件,我们直接把mmm_common.conf从db1拷贝到db2和db3两台主机的/etc/mysql-mmm下。

注意:monitor主机要需要:

scp /etc/mysql-mmm/mmm_common.conf db2:/etc/mysql-mmm/

scp /etc/mysql-mmm/mmm_common.conf db3:/etc/mysql-mmm/

分别在db1,db2,db3三台主机的/etc/mysql-mmm配置mmm_agent.conf文件,分别用不同的字符标识,注意这三台机器的this db1这块要想,比如本环境中,db1要配置this db1,db2要配置为this db2,而db3要配置为this db3。

在db1(192.168.0.60)上:

[root@192.168.0.60 ~]# cat /etc/mysql-mmm/mmm_agent.conf include mmm_common.conf this db1 [root@192.168.0.60 ~]#

在db2(192.168.0.50)上:

[root@192.168.0.50 ~]# cat /etc/mysql-mmm/mmm_agent.conf include mmm_common.conf this db2 [root@192.168.0.50 ~]#

在db3(192.168.0.40)上:

[root@192.168.0.40 ~]# cat /etc/mysql-mmm/mmm_agent.conf include mmm_common.conf this db3 [root@192.168.0.40 ~]#

在db2(192.168.0.30)配置monitor的配置文件:

[root@192.168.0.30 ~]# cat /etc/mysql-mmm/mmm_mon.conf include mmm_common.conf ip 127.0.0.1 pid_path /var/run/mysql-mmm/mmm_mond.pid bin_path /usr/libexec/mysql-mmm status_path /var/lib/mysql-mmm/mmm_mond.status ping_ips 192.168.0.40,192.168.0.50,192.168.0.60 auto_set_online 60 monitor_user mmm_monitor monitor_password mmm_monitor debug 0 [root@192.168.0.30 ~]#

这里只在原有配置文件中的ping_ips添加了整个架构被监控主机的ip地址,而在中配置了用于监控的用户。

(6)创建监控用户,这里需要创建3个监控用户,具体描述如下:

用户名 描述 权限 monitor user MMM的monitor端监控所有的mysql数据库的状态用户 REPLICATION CLIENT agent user 主要是MMM客户端用于改变的master的read_only状态用户 SUPER,REPLICATION CLIENT,PROCESS repl 用于复制的用户 REPLICATION SLAVE

在3台服务器(db1,db2,db3)进行授权,因为我之前的主主复制,以及主从已经是ok的,所以我在其中一台服务器执行就ok了。用于复制的账号之前已经有了,所以这里就授权两个账号。

mysql> GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.0.%' IDENTIFIED BY 'mmm_agent'; Query OK, 0 rows affected (0.08 sec) mysql> GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.0.%' IDENTIFIED BY 'mmm_monitor'; Query OK, 0 rows affected (0.00 sec) mysql> flush privileges; Query OK, 0 rows affected (0.03 sec) mysql>

如果是从头到尾从新搭建,则加上另外一个复制账户(分别在3台服务器都需要执行这3条SQL):

GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.%' IDENTIFIED BY '123456';

(7)启动agent服务。

最后分别在db1,db2,db3上启动agent,并在db2(192.168.0.30)上启动monitor程序:

[root@192.168.0.60 ~]# /etc/init.d/mysql-mmm-agent start Daemon bin: '/usr/sbin/mmm_agentd' Daemon pid: '/var/run/mmm_agentd.pid' Starting MMM Agent daemon... Ok [root@192.168.0.60 ~]#

[root@192.168.0.50 ~]# /etc/init.d/mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ] [root@192.168.0.50 ~]#

因为我有些使用yum安装的,所以启动信息有些不一样。^_^

[root@192.168.0.40 ~]# /etc/init.d/mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ] [root@192.168.0.40 ~]#

启动monitor:

[root@192.168.0.30 ~]# /etc/init.d/mysql-mmm-monitor start Starting MMM Monitor Daemon: [ OK ] [root@192.168.0.30 ~]#

其中agent的日志存放在/var/log/mysql-mmm/mmm_agentd.log,monitor日志放在/var/log/mysql-mmm/mmm_mond.log,启动过程中有什么问题,通常日志都会有详细的记录。

(8)在monitor主机上检查集群主机的状态:

[root@192.168.0.30 ~]# mmm_control checks all db2 ping [last change: 2014/04/18 00:29:01] OK db2 mysql [last change: 2014/04/18 00:29:01] OK db2 rep_threads [last change: 2014/04/18 00:29:01] OK db2 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null db3 ping [last change: 2014/04/18 00:29:01] OK db3 mysql [last change: 2014/04/18 00:29:01] OK db3 rep_threads [last change: 2014/04/18 00:29:01] OK db3 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null db1 ping [last change: 2014/04/18 00:29:01] OK db1 mysql [last change: 2014/04/18 00:29:01] OK db1 rep_threads [last change: 2014/04/18 00:29:01] OK db1 rep_backlog [last change: 2014/04/18 00:29:01] OK: Backlog is null [root@192.168.0.30 ~]#

(9)在monitor主机上检查集群环境在线状况:

[root@192.168.0.30 ~]# mmm_control show db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108) db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88) db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98) [root@192.168.0.30 ~]#

(10)online(上线)所有主机:

我这里主机已经在线了,如果没有在线,可以使用下面的命令将相关主机online

[root@192.168.0.30 ~]# mmm_control set_online db1 OK: This host is already ONLINE. Skipping command. [root@192.168.0.30 ~]#

提示主机已经在线,已经跳过命令执行了。

到这里整个集群就配置完成了。从输出中可以看到虚拟ip 192.168.0.108已经顺利添加到主机192.168.0.60上作为主对外提供写服务,虚拟ip 192.168.0.88添加到主机192.168.0.50上对外提供读服务,而虚拟ip 192.168.0.98添加到192.168.0.40上对外提供读服务。

MMM高可用测试

我们已经完成高可用环境的搭建了,下面我们就可以做MMM的HA测试咯。首先查看整个集群的状态,可以看到整个集群状态正常。

[root@192.168.0.30 ~]# mmm_control show db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108) db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88) db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98) [root@192.168.0.30 ~]#

模拟db2(192.168.0.50 )宕机,手动停止mysql服务,观察monitor日志:

[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log 2014/04/18 00:55:53 FATAL State of host 'db2' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)

从日志发现db2的状态有ONLINE转换为HARD_OFFLINE

重新查看集群的最新状态:

[root@192.168.0.30 ~]# mmm_control show db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108) db2(192.168.0.50) master/HARD_OFFLINE. Roles: db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.88), reader(192.168.0.98) [root@192.168.0.30 ~]#

重启db2,可以看到db2由HARD_OFFLINE转到AWAITING_RECOVERY。这里db2再次接管读请求。

[root@192.168.0.30 ~]# mmm_control show db1(192.168.0.60) master/ONLINE. Roles: writer(192.168.0.108) db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88) db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98) [root@192.168.0.30 ~]#

模拟db1主库宕机:

查看集群状态:

[root@192.168.0.30 ~]# mmm_control show db1(192.168.0.60) master/HARD_OFFLINE. Roles: db2(192.168.0.50) master/ONLINE. Roles: reader(192.168.0.88), writer(192.168.0.108) db3(192.168.0.40) slave/ONLINE. Roles: reader(192.168.0.98) [root@192.168.0.30 ~]#

查看MMM日志:

[root@192.168.0.30 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log 2014/04/18 01:09:20 FATAL State of host 'db1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)

从上面可以发现,db1由以前的ONLINE转化为HARD_OFFLINE,移除了写角色,因为db2是备选主,所以接管了写角色,db3指向新的主库db2,应该说db3实际上找到了db2的sql现在的位置,即db2 show master返回的值,然后直接在db3上change master to到db2。

db1,db2,db3之间为一主两从的复制关系,一旦发生db2,db3延时于db1时,这个时刻db1 mysql宕机,db3将会等待数据追上db1后,再重新指向新的主db2,进行change master to db2操作,在db1宕机的过程中,一旦db2落后于db1,这时发生切换,db2变成了可写状态,数据的一致性将会无法保证。

总结:

MMM不适用于对数据一致性要求很高的环境。但是高可用完全做到了。

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

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

相关文章

Kafka - 14 Kafka分区的分配策略及再平衡 | Range | RoundRobin | Sticky | CooperativeSticky

文章目录1. 分区的分配以及再平衡2. Range 分区分配以及再平衡3. RoundRobin 分区分配以及再平衡4. Sticky 分区分配以及再平衡1. 分区的分配以及再平衡 一个consumer group中有多个consumer组成,一个 topic有多个partition组成,现在的问题是&#xff0…

[Windows驱动开发] BlackBone介绍

▒ 目录 ▒🛫 导读需求开发环境1️⃣ 名词解释2️⃣ 介绍3️⃣ 库包含内容4️⃣ 编译问题总结常见问题fatal error LNK1104非类型模板参数中的 "auto" 📖 参考资料🛫 导读 需求 作为Windows开发人员,经常遇到枚举进程、…

dojo中的类

使用arcgis api for js 4.*进行地图的web前端开发,就不得不与dojo打交道。dojo是一个框架,自成体系,比如它对类的支持,有自己的一套。众所周知,js不是面向对象语言,没有类这一说,都是用函数来模…

人工智能轨道交通行业周刊-第25期(2022.11.28-12.4)

本期关键词:液体安检仪、智慧车站、大机作业、动车打温、实时人体姿态估计、图像压缩 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟V…

Java项目:SSM医院挂号预约管理系统

作者主页:源码空间站2022 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为管理员与医生两种角色; 管理员角色包含以下功能: 管理员登录,添加科室,科室增删改查,医生管理,查看预约信息,…

Redis03:Redis基础知识以及数据类型

Redis基础知识以及数据类型基础知识Redis-key基本数据类型String(字符串)三种特殊的数据类型geospatialhyperloglogbitmaps基础知识 redis默认有16个数据库,默认使用的时第0个,可以使用select进行切换数据库 清除当前数据库 清除全部数据库的内容 Red…

Cmake升级与软链接

记录cmake升级版本的记录,主要参考文章:Unbuntu安装Ros后Cmake变成3.10_向日葵骑士Faraday的博客-CSDN博客 cmake升级、更新(ubuntu18.04)_Doctor_Wu_的博客-CSDN博客_cmake升级 设计安装ros后cmake版本出现问题,且卸…

[附源码]Python计算机毕业设计Django基于Java的员工管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Windows 文件共享功能使用方法,局域网多台电脑之间传送文件

设想一下,家里或者公司有多台电脑,连接同一个Wifi,也就是处于同一个局域网中。 在不能使用微信、网盘的文件传输功能的情况下,这多台电脑之间,就只能用U盘传送数据吗? 不。Windows系统中已经提供了文件共享…

ZMQ之克隆模式的可靠性

克隆服务器的可靠性 克隆模型1至5相对比较简单,下面我们会探讨一个非常复杂的模型。可以发现,为了构建可靠的消息队列,我们需要花费非常多的精力。所以我们经常会问:有必要这么做吗?如果说你能够接受可靠性不够高的、或…

Docker三大核心概念(镜像、容器和仓库)与虚拟化

目录 1. Docker是什么 2. Docker与虚拟化 3. Docker虚拟化的好处 4. Docker核心概念 4.1.镜像 4.2.容器 4.3.仓库 5. CentOS7 安装docker(在线方式) 5.1.内核版本信息检查 5.2 卸载可能存在的旧版本 5.3 安装必要的系统工具 5.4 添加docker-ce安装源 5.5 更新yum缓存 5.…

web前端期末大作业:个人网站设计——响应式个人小站网站HTML+CSS+JavaScript

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

STC 51单片机54——气压水压计HX710B 串口显示均值滤波+滑窗滤波

//气压模块为红色模块,传感器型号未知,其信号放大器型号为HX710B // STC15W408AS 11.0592MHz 波特率9600,串口输出大气压强值 // STC15W408AS没有定时器1,所以用定时器2做波特率发生器 // 采用电脑USB供电会有很大的干扰&#xff…

Unity工具 - 工具聚合页(UEWindow)

随着项目工程的推进,开发者们会根据工作内容的需要在Unity内开发众多的工具。随着工具的增多,Unity 的Menu菜单也会逐渐臃肿,过于分散,工具代码也难以查找。在此问题的基础上,开发了工具聚合页(UEWindow) 这一功能来管…

R绘图案例|基于分面的面积图

简介 最近参加一个统计建模的比赛。模型建模后,需要展示不同模型的性能指标,数据如下所示: 其中,第 1 列是不同样本,共376条。第 2-4 列是随机森林得到的结果,第 5-7 列是XGBoost的结果。一共使用了三种评…

数字验证学习笔记——UVM学习3 核心基类

一、核心基类 UVM世界中的类最初都是从一个uvm_void根类(root class)继承来的,而实际上这个类并没有成员变量和方法。 uvm_void只是一个虚类(virtual class),还在等待将来继承于它的子类去开垦。在继承与u…

适合新手的Pytorch的中文文档

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

牛客练习赛106

牛客练习赛106 C D 脑筋急转弯的构造题 E 染色法判断二分图 结论,这个图是二分图说明不存在奇环 设左边是x,右边是y 则有xyn,xyn, xyn,且x∗y>边数n∗(n−1)/2−mx*y>边数n*(n-1)/2-m x∗y>边数n∗(n−1)/2−m 也就是说左式最大是n∗n/4(xn/…

【1774. 最接近目标价格的甜点成本】

来源:力扣(LeetCode) 描述: 你打算做甜点,现在需要购买配料。目前共有 n 种冰激凌基料和 m 种配料可供选购。而制作甜点需要遵循以下几条规则: 必须选择 一种 冰激凌基料。可以添加 一种或多种 配料&…

[附源码]计算机毕业设计ssm校园一卡通服务平台

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…