Mysql本身不提供复制故障转移的解决方案,但是MMM方案可以实现服务器的故障转移,从而实现MySQL的高可用性。MMM不仅可以提供浮动IP的功能,如果当前主服务器挂机,它会自动将你的后端从服务器转移到新的主服务器上进行同步复制,无需手动更改同步配置。
一、MMM简介:
MMM代表mysql的多主复制管理器:MySQL多主复制管理器,基于perl实现。它是一套可扩展的脚本套件,用于MySQL主-主复制配置的监控、故障转移和管理(任何时候只能写入一个节点)。MMM还可以平衡从属服务器的读取负载,因此它可以用于在一组用于复制的服务器上启动虚拟ip。此外,它还具有用于数据备份和节点间重新同步的脚本。Mysql本身不提供复制故障转移的解决方案,但是MMM方案可以实现服务器的故障转移,从而实现MySQL的高可用性。MMM不仅可以提供浮动IP的功能,如果当前主服务器挂机,它会自动将你的后端从服务器转移到新的主服务器上进行同步复制,无需手动更改同步配置。这是目前比较成熟的方案。详情请见官网:http://mysql-mmm.org
优点
:高可用性,良好的可扩展性,故障时自动切换。对于主-主同步,同一时间只提供一次数据库写操作,以保证数据的一致性。当主服务器挂机时,另一个主服务器立即接管,其他从服务器可以自动切换,无需人工干预。缺点
:monitor节点是单点,但也可以将此与keepalived或haertbeat结合起来,使其具有高可用性;至少三个节点,对主机数量有要求,需要实现读写分离,还需要在前端编写读写分离程序。在繁忙的读写业务系统下性能不是很稳定,可能会出现复制延迟、切换失败等问题。MMM方案不适合对数据安全性要求高,读写繁忙的环境。适用场景:
MMM的适用场景是大型数据库访问和读写分离的场景。
Mmm的主要功能由以下三个脚本提供:
Mmm_mond负责所有监控工作的监控守护进程,决定节点的移除(mmm_mond进程定时检测心跳,如果失败,将ip floats写入另一个master)等等。
Mmm_agentd是一个运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点。
mmm_control通过命令行管理mmm_mond进程。
在整个监管过程中,需要在mysql中添加相关的授权用户。授权用户包括一个mmm_monitor用户和一个mmm_agent用户。如果要使用mmm的备份工具,需要再添加一个mmm_tools用户。
二、部署实施
1.环境介绍
操作系统:centos7.2(64位)数据库系统:mysql5.7.13
关闭selinux
配置ntp,同步时间
作用
互联网协议(Internet Protocol)
主机名
服务器id
写vip
阅读vip
主控1
192.168.31.83
主控1
一
192.168.31.2
主服务器2(备份)
192.168.31.141
master2
2
192.168.31.3
从属1
192.168.31.250
从属1
3
192.168.31.4
从属2
192.168.31.225
从属2
四
192.168.31.5
班长
192.168.31.106
监视器1
没有
2.在所有主机上配置/etc/hosts文件,并添加以下内容:
192.168.31.83主机1
192.168.31.141主机2
从属权利要求1
从属权利要求2
监测器一
在所有主机上安装CPAN李巴特_ lgpl。x86 _ 64 RRD工具。x86 _ 64 RRD工具-perl。x86 _ 64包
#美味可口安装perl-* libart _ lgpl。x86 _ 64 RRD工具。x86 _ 64 RRD工具-perl。x86 _ 64
注:使用centos7在线妙的源安装
安装实际抽取与汇报语言的相关库
#cpan -i算法Diff Class:Singleton DBIDBD:MySQL Log:Dispatch Log:Log 4 perl Mail:Send Net:Ping Proc:Daemon Time:HiRes Params:Validate Net:ARP
3、在主机1、主机2、从机1、从机2主机上安装mysql5.7和配置复制
主控一和master2互为主从,从属1、从属2为主控一的从
在每个关系型数据库的配置文件/etc/my.cnf中加入以下内容,注意服务器身份证明(identification)不能重复。
主控一主机:
log-bin=mysql-bin
binlog_format=mixed
服务器id=1
继电器记录=继电器箱
中继日志索引=从中继箱。指数
日志从属更新=1
自动增量-增量=2
自动增量偏移=1
master2主机:
log-bin=mysql-bin
binlog_format=mixed
服务器id=2
继电器记录=继电器箱
中继日志索引=从中继箱。指数
日志从属更新=1
自动增量-增量=2
自动增量偏移=2
从属一主机:
服务器id=3
继电器记录=继电器箱
中继日志索引=从中继箱。指数
read_only=1
从属2主机:
服务器id=4
继电器记录=继电器箱
中继日志索引=从中继箱。指数
read_only=1
在完成了对my.cnf的修改后,通过系统ctl重新启动mysqld重新启动关系型数据库服务
四台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则:
防火墙-cmd-permanent-add-port=3306/TCP
防火墙-命令-重新加载
主从配置(主控一和master2配置成主主,从属一和从属2配置成主控一的从):
在主控一上授权:
*上的关系型数据库授权复制从属服务器。*代表@192.168.31。"%"由"123456"标识;
在master2上授权:
*上的关系型数据库授权复制从属服务器。*代表@192.168.31。"%"由"123456"标识;
把主设备2、从设备一和从属2配置成主控一的从库:
在主控一上执行显示主机状态;获取binlog文件和位置点
关系型数据库显示主状态;
- - - - -
|文件|位置| Binlog _ Do _ DB | Binlog _ Ignore _ DB | Executed _ Gtid _ Set |
- - - - -
| mysql-bin.000001 | 452 | | | |
- - - - -
在主设备2、从设备一和从属2执行
关系型数据库把掌握改成master_host=192.168.31.83 ,master_port=3306,master_user=rep ,master_password=123456 ,master _ log _ file= MySQL-bin。000001 ,master _ log _ pos=452
mysqlslave启动;
验证主从复制:
master2主机:
关系型数据库显示从状态 G;
*************************** 1.第*************************行
Slave _ IO _状态:等待主机发送事件
主人_主人:192.168.31.83
主用户:代表
主端口:3306
连接重试次数:60
主日志文件:mysql-bin.000001
Read_Master_Log_Pos: 452
中继_日志_文件:中继-bin.000002
中继日志位置:320
中继_主控_日志_文件:mysql-bin.000001
从属_IO_Running:是
从属_SQL_Running:是
从属一主机:
关系型数据库显示从状态 G;
*************************** 1.第*************************行
Slave _ IO _状态:等待主机发送事件
主人_主人:192.168.31.83
主用户:代表
主端口:3306
连接重试次数:60
主日志文件:mysql-bin.000001
Read_Master_Log_Pos: 452
中继_日志_文件:中继-bin.000002
中继日志位置:320
中继_主控_日志_文件:mysql-bin.000001
从属_IO_Running:是
从属_SQL_Running:是
从属2主机:
关系型数据库显示从状态 G;
*************************** 1.第*************************行
Slave _ IO _状态:等待主机发送事件
主人_主人:192.168.31.83
主用户:代表
主端口:3306
连接重试次数:60
主日志文件:mysql-bin.000001
Read_Master_Log_Pos: 452
中继_日志_文件:中继-bin.000002
中继日志位置:320
中继_主控_日志_文件:mysql-bin.000001
从属_IO_Running:是
从属_SQL_Running:是
如果从机_ IO _运行和从属结构化查询语言运行都为是的,那么主从就已经配置好了
把主控一配置成master2的从库:
在master2上执行显示主机状态;获取binlog文件和位置点
关系型数据库显示主状态;
- - - - -
|文件|位置| Binlog _ Do _ DB | Binlog _ Ignore _ DB | Executed _ Gtid _ Set |
- - - - -
| mysql-bin.000001 | 452 | | | |
- - - - -
在主控一上执行:
关系型数据库把掌握改成master_host=192.168.31.141 ,master_port=3306,master_user=rep ,master_password=123456 ,master _ log _ file= MySQL-bin。000001 ,master _ log _ pos=452
关系型数据库启动从机;
验证主从复制:
主控一主机:
关系型数据库显示从状态 G;
*************************** 1.第*************************行
Slave _ IO _状态:等待主机发送事件
主控_主机:192.168.31.141
主用户:代表
主端口:3306
连接重试次数:60
主日志文件:mysql-bin.000001
Read_Master_Log_Pos: 452
中继_日志_文件:中继-bin.000002
中继日志位置:320
中继_主控_日志_文件:mysql-bin.000001
从属_IO_Running:是
从属_SQL_Running:是
如果从机_ IO _运行和从属结构化查询语言运行都为是的,那么主从就已经配置好了
MySQL-嗯配置:
在四台关系型数据库节点上创建用户
创建代理账号:
mysql授权超级用户,复制客户端,在*上处理.*至嗯_代理 @192.168.31 ."%"由"123456"标识;
创建监控账号:
*上的关系型数据库授权复制客户端。*至嗯_monitor@192.168.31 ."%"由"123456"标识;
注1:因为之前的主从复制,以及主从已经是好的的,所以我在主控一服务器执行就好的了。
检查master2和从属1、从属2三台上是否都存在监控和代理账号
mysql从MySQL中选择用户、主机。user where user in( mmm _ monitor , mmm _ agent );
- -
|用户|主机|
- -
| mmm_agent | 192.168.31 .% |
| mmm_monitor | 192.168.31 .% |
- -
或
关系型数据库显示“mmm _ agent”@ 192。168 .31的授权。%;
-
|给mmm_agent@192.168.31的拨款。% |
-
*上的|授权进程、超级、复制客户端。*至嗯_代理 @192.168.31 .% |
-
关系型数据库显示" mmm _ monitor"@ 192。168 .31的授权。%;
-
|对mmm_monitor@192.168.31的拨款。% |
-
|授予*上的复制客户端。*至嗯_monitor@192.168.31 .% |
注2:
嗯_监视器用户:嗯监控用于对关系型数据库服务器进程健康检查
嗯_代理用户:嗯代理用来更改只读模式,复制的主服务器等
MySQL-嗯安装
在班长主机(192.168.31.106) 上安装监控程序
cd /tmp
wget http://pkgs。fedora项目。org/repo/pkgs/MySQL-mmm/MySQL-mmm-2。2 .1 .焦油。F8 b48 BDF 89251d 3183328 f 0249461 e/MySQL-mmm-2。2 .1 .焦油。地面零点
塔尔-zxf mysql-mmm-2.2.1.tar.gz
光盘MySQL-mm-2 . 2 . 1
进行安装
在数据库服务器(主机1、主机2、从机1、从机2)上安装代理
cd /tmp
wget http://pkgs。fedora项目。org/repo/pkgs/MySQL-mmm/MySQL-mmm-2。2 .1 .焦油。F8 b48 BDF 89251d 3183328 f 0249461 e/MySQL-mmm-2。2 .1 .焦油。地面零点
塔尔-zxf mysql-mmm-2.2.1.tar.gz
光盘MySQL-mm-2 . 2 . 1
进行安装
6、配置mmm
写配置文件时,五台主机必须一致:
安装完成后,所有配置文件都放在/etc/mysql-mmm/下。管理服务器和数据库服务器都应包含一个通用文件mmm_common.conf,其内容如下:
Active_master_rolewriter#表示活动的主角色,所有数据库服务器都应打开read_only参数,而writer的服务器监视代理将自动关闭read_only属性。
主机默认值
Cluster_interfaceeno16777736# #群集的网络接口
PID _ path/var/run/mmm _ agentd . PID # PID路径
Bin_path /usr/lib/mysql-mmm/#可执行文件路径
Replication_user rep#复制用户
Replication_password 123456#复制用户密码
Agent_usermmm_agent#代理用户
Agent_password 123456#代理用户密码
/主机
主机1 #主机1 #主机1
主机1的Ip 192.168.31.83 # IP
Master #角色属性,Master代表master。
Peer master2#是相当于master1的服务器主机名,即master2的服务器主机名。
/主机
Master2 #与Master的概念相同。
ip 192.168.31.141
模式主机
对等主机1
/主机
Host slave1#从库的主机名,如果有多个从库,可以重复相同的配置。
Ip 192.168.31.250#来自Ip
模式slave#slave的角色属性表示当前主机来自
/主机
主机slave2#与slave的概念相同。
ip 192.168.31.225
模式从属
/主机
角色#编写器角色配置
主机主机1,主机2#可以执行写操作的服务器的主机名。如果不想切换写操作,只能在这里配置master,这样也可以避免因网络延迟而切换写操作。然而,一旦主机发生故障,当前MMM将没有写入器,只有外部读取操作。
Ips 192.168.31.2#外部写操作的虚拟IP
Mode exclusive#exclusive表示只允许一个主机,即只能提供一个写IP。
/角色
角色#读取角色配置
主机master2、slave1、slave2#是提供外部读取操作的服务器的主机名。当然这里也可以加上master。
Ips 192.168.31.3、192.168.31.4、192.168.31.5 #是提供外部读取操作的虚拟ip。这三个IP和主机不是一一对应的,IP和主机的数量可能不一样。如果这样配置,其中一台主机将分配两个IP。
模式平衡#balanced代表负载平衡。
/角色
同时,将该文件复制到其他具有相同配置的服务器上。
#对于主机1主2从1从2中的主机;do scp/etc/MySQL-mmm/mmm _ common . conf $ host:/etc/MySQL-mmm/;完成的
代理文件配置
在4个mysql节点上编辑/etc/mysql-mmm/mmm_agent.conf
在数据库服务器上,还有一个mmm_agent.conf需要修改。其内容是:
includemmm _ common.conf
这个主人1
注意:这个配置只配置db服务器,不需要配置监控服务器。此后的主机名将更改为当前服务器的主机名。
启动代理进程
在#!在/bin/sh下的/etc/init.d/mysql-mmm-agent的脚本文件中,添加以下内容
源/根/。bash_profile
将其添加为系统服务,并将其设置为自启动。
#chkconfig -添加MySQL-mmm-代理
# chkconfigmysql-mmm-代理打开
#/etc/init . d/MySQL-mmm-代理启动
注意:添加source /root/的目的。bash_profile使mysql-mmm-agent服务能够自己启动。
自动启动和手动启动的唯一区别是激活控制台。那么当作为服务启动时,可能是因为缺少环境变量。
服务启动失败,出现以下错误信息:
守护程序bin:“/usr/sbin/mmm _ agentd”
守护程序PID:“/var/run/mmm _ agentd . PID”
正在启动MMM代理守护程序.在@INC中找不到Proc/daemon . pm(@ INC包含:/usr/local/lib 64/perl 5/usr/local/share/perl 5/usr/lib 64/perl 5/vendor _ perl/usr/share/perl 5/vendor _ perl/usr/lib 64/perl 5/usr/share/perl 5。)在/usr/sbin/mmm_agentd第7行。
BEGIN失败-编译在/usr/sbin/mmm_agentd第7行中止。
不成功的
解决方法:
# cpanProc:守护进程
# cpan Log:Log4perl
#/etc/init . d/MySQL-mmm-代理启动
守护程序bin:“/usr/sbin/mmm _ agentd”
守护程序PID:“/var/run/mmm _ agentd . PID”
正在启动MMM代理守护程序.好的
# netstat -antp | grep mmm_agentd
TCP 0 0 192 . 168 . 31 . 83:9989 0 . 0 . 0 . 0:*列表EN 9693/mmm_agentd
配置防火墙
firewall-cmd-permanent-add-port=9989/TCP
防火墙-命令-重新加载
编辑班长主机上的/etc/mysql-mmm/mmm_mon.conf
includemmm _ common.conf
班长
ip 127.0.0.1#为了安全性,设置只在本机监听,嗯_mond默认监听9988
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
状态_路径/var/lib/misc/mmm_mond.status
ping_ips192.168.31.83,192.168.31.141,192.168.31.250,192.168.31.225#用于测试网络可用性互联网协议(互联网协议)地址列表,只要其中有一个地址砰通,就代表网络正常,这里不要写入本机地址
auto_set_online 0#设置自动在线的的时间,默认是超过60年代就将它设置为在线,默认是60年代,这里将其设为0就是立即在线的
/监视器
检查默认值
检查_期间5
陷阱_周期10
超时2
# 10000后重新启动
max_backlog 86400
/检查
检查_周期
描述:检查周期默认为5s
默认值:5s
陷阱_周期
描述:一个节点被检测不成功的时间持续陷阱_周期秒,就慎重的认为这个节点失败了。
默认值:10s
超时
描述:检查超时的时间
默认值:2s
重启_之后
描述:在完成重启_之后次检查后,重启棋子进程
默认值:10000
max_backlog
描述:记录检查rep_backlog日志的最大次数
默认值:60
主机默认值
监视器_用户嗯_监视器#监控服务器的用户
监控_密码123456#监控服务器的密码
/主机
调试0 #调试0正常模式,1为调试模式
启动监控进程:
在/etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容
源/根/。bash_profile
添加成系统服务并设置为自启动
#chkconfig -添加MySQL-mmm-监视器
# chkconfigmysql-嗯-打开监视器
#/etc/init。d/MySQL-嗯-监视器启动
启动报错:
正在启动嗯监视器守护程序:在@INC (@INC包含:/usr/local/lib 64/perl 5/usr/local/share/perl 5/usr/lib 64/perl 5/vendor _ perl/usr/share/perl 5/vendor _ perl/usr/lib 64/perl 5/usr/usr/share/perl 5)中找不到Proc/Daemon.pm .)在/usr/sbin/mmm _ mond 11号线。
开始失败-编译在/usr/sbin/mmm_mond第11行中止。
不成功的
解决方法:安装下列实际抽取与汇报语言的库
#cpanProc:守护进程
#cpan Log:Log4perl
[root @ monitor 1 ~]#/etc/init。d/MySQL-mmm-监视器启动
守护程序bin:"/usr/sbin/mmm _ mond "
守护程序PID:"/var/run/mmm _ mond。PID "
正在启动嗯监视器守护程序:正常
[root @ monitor 1 ~]# netstat-anpt | grep 9988
tcp 0 0 127.0.0.1:9988 0.0.0.0:*列表EN 8546/mmm_mond
注1:无论是在端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。
注2:嗯启动顺序:先启动监视器,再启动代理人
检查集群状态:
[root@monitor1 ~]# mmm_control显示
主1(192.168.31.83)主/在线。角色:作者(192.168.31.2)
主2(192.168.31.141)主/在线。角色:读者(192.168.31.5)
从属1(192.168.31.250)从机/在线。角色:读者(192.168.31.4)
从属2(192.168.31.225)从机/在线。角色:读者(192.168.31.3)
如果服务器状态不是在线,可以用如下命令将服务器上线,例如:
#嗯_控制集_在线主机名
例如:[root @ monitor 1 ~]# mmm _控制集_在线主1
从上面的显示可以看到,写请求的肠血管活性肽在主控一上,所有从节点也都把主控一当做主节点。
查看是否启用贵宾
[root @ master 1 ~]# IP地址显示开发者eno 16777736
eno16777736:广播、多播、上行、LOWER_UPmtu 1500 qdiscpfifo_fast状态上行qlen 1000
link/ether 00:0c:29:6d:2f:82 br dff:ff:ff:ff:ff:ff:ff:ff
inet 192。168 .31 .83/24 brd 192。168 .31 .255范围全球eno 1677585865
有效_lft永远首选_lft永远
范围全球eno16777736
有效_lft永远首选_lft永远
inet 6 fe80:20c:29ff:fe6d:2f82/64范围链接
有效_lft永远首选_lft永远
[root @ master 2 ~]# IP地址显示开发者eno 16777736
eno16777736:广播、多播、上行、LOWER_UPmtu 1500 qdiscpfifo_fast状态上行qlen 1000
link/ether 00:0c:29:75:1a:9c br dff:ff:ff:ff:ff:ff:ff:ff
inet 192。168 .31 .141/24 brd 192。168 .31 .255作用域全球动态eno16777736
有效_ lft 35850秒首选_ lft 35850秒
范围全球eno16777736
有效_lft永远首选_lft永远
inet 6 fe80:20c:29ff:fe75:1a9c/64范围链接
有效_lft永远首选_lft永远
[root @ slave 1 ~]# IP地址显示开发者eno 16777736
eno16777736:广播、多播、上行、LOWER_UPmtu 1500 qdiscpfifo_fast状态上行qlen 1000
link/ether 00:0c:29:02:21:19 brd ff:ff:ff:ff:ff:ff:ff:ff
国际地球物理研究所
有效_ lft 35719秒首选_ lft 35719秒
范围全球eno16777736
有效_lft永远首选_lft永远
inet 6 fe80:20c:29ff:fe02:2119/64范围链接
有效_lft永远首选_lft永远
[root @ slave 2 ~]# IP地址显示开发者eno 16777736
eno16777736:广播、多播、上行、LOWER_UPmtu 1500 qdiscpfifo_fast状态上行qlen 1000
link/ether 00:0c:29:E2:C7:fa br dff:ff:ff:ff:ff:ff:ff:ff:ff:ff
inet 192。168 .31 .225/24 brd 192。168 .31 .255作用域全球动态eno16777736
有效_ lft 35930秒首选_ lft 35930秒
范围全球eno16777736
有效_lft永远首选_lft永远
inet 6 fe80:20c:29ff:费2:c7fa/64范围链接
有效_lft永远首选_lft永远
在主机2、从机1、从机2主机上查看主关系型数据库的指向
关系型数据库显示从状态 G;
*************************** 1.第*************************行
Slave _ IO _状态:等待主机发送事件
主人_主人:192.168.31.83
主用户:代表
主端口:3306
连接重试次数:60
MMM高可用性测试:
服务器读写采有肠血管活性肽地址进行读写,出现故障时肠血管活性肽会漂移到其它节点,由其它节点提供服务。
首先查看整个集群的状态,可以看到整个集群状态正常
[root@monitor1 ~]# mmm_control显示
主1(192.168.31.83)主/在线。角色:作者(192.168.31.2)
主2(192.168.31.141)主/在线。角色:读者(192.168.31.5)
从属1(192.168.31.250)从机/在线。角色:读者(192.168.31.4)
从属2(192.168.31.225)从机/在线。角色:读者(192.168.31.3)
模拟主控一宕机,手动停止关系型数据库服务,观察班长日志,主控一的日志如下:
[root @ monitor 1 ~]# tail-f/var/log/MySQL-mmm/mmm _ mond。原木
2017/01/09 22:02:55《大师1》上的警告检查"重复线程"处于未知状态!消息:未知:连接错误(主机=192.168.31.83:3306,用户=mmm_monitor)!无法连接到"192.168.31.83"上的关系型数据库服务器(111)
2017/01/09 22:02:55《大师1》上的警告检查"代表积压"处于未知状态!消息:未知:连接错误(主机=192.168.31.83:3306,用户=mmm_monitor)!无法连接到"192.168.31.83"上的关系型数据库服务器(111)
2017/01/09 22:03:05错误检查"主控1 "上的" mysql "已失败10秒!消息:错误:连接错误(主机=192.168.31.83:3306,用户=mmm_monitor)!无法连接到"192.168.31.83"上的关系型数据库服务器(111)
2017/01/09 22:03:07主机"主控1 "的致命状态从在线的更改为HARD_OFFLINE (ping:正常,mysql:不正常)
2017/01/09 22:03:07信息从主机"主控1 "中删除所有角色:
2017/01/09 22:03:07信息已从主机"主控1 "中删除角色"编写器(192.168.31.2)"
2017/01/09 22:03:07信息孤立角色"编写器(192.168.31.2)"已分配给《大师2》
查看群集的最新状态
[root@monitor1 ~]# mmm_control显示
主1(192.168.31.83)主/硬_离线。角色:
主2(192.168.31.141)主/在线。角色:读者(192.168.31.5),作者(192.168.31.2)
从属1(192.168.31.250)从机/在线。角色:读者(192.168.31.4)
从属2(192.168.31.225)从机/在线。角色:读者(192.168.31.3)
从显示结果可以看出主控一的状态有在线的转换为硬_离线,写肠血管活性肽转移到了master2主机上。
检查所有的服务器群集状态
[root@monitor1 ~]# mmm_control检查所有
主1 ping[最后更改:2017/01/09 21:31:47]好的
master 1 MySQL[最后更改:2017/01/09 22:03:07]错误:连接错误(主机=192.168.31.83:3306,用户=mmm_monitor)!无法连接到"192.168.31.83"上的关系型数据库服务器(111)
主1代表线程[最后更改时间:2017/01/09 21:31:47]确定
master 1 rep _ Backlog[最后更改:2017/01/09 21:31:47]OK:Backlog为空
从机1 ping[最后更改时间:2017/01/09 21:31:47]好的
从属1我的SQL[最后更改:2017/01/09 21:31:47]好的
从属1 rep _ threads[最后更改:2017/01/09 21:31:47]好的
slave 1 rep _ Backlog[最后更改:2017/01/09 21:31:47]OK:Backlog为空
master2 pi
ng [last change: 2017/01/09 21:31:47] OKmaster2 mysql [last change: 2017/01/09 21:57:32] OKmaster2 rep_threads [last change: 2017/01/09 21:31:47] OKmaster2 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is nullslave2 ping [last change: 2017/01/09 21:31:47] OKslave2mysql [last change: 2017/01/09 21:31:47] OKslave2 rep_threads [last change: 2017/01/09 21:31:47] OKslave2 rep_backlog [last change: 2017/01/09 21:31:47] OK: Backlog is null从上面可以看到master1能ping通,说明只是服务死掉了。查看master2主机的ip地址:
[root@master2 ~]# ipaddr show dev eno16777736eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500 qdiscpfifo_fast state UP qlen 1000link/ether 00:0c:29:75:1a:9c brdff:ff:ff:ff:ff:ffinet 192.168.31.141/24 brd 192.168.31.255 scope global dynamic eno16777736valid_lft 35519sec preferred_lft 35519secinet 192.168.31.5/32 scope global eno16777736valid_lft forever preferred_lft foreverinet 192.168.31.2/32 scope global eno16777736valid_lft forever preferred_lft foreverinet6 fe80::20c:29ff:fe75:1a9c/64 scope linkvalid_lft forever preferred_lft foreverslave1主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.31.141Master_User: repMaster_Port: 3306slave2主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.31.141Master_User: repMaster_Port: 3306启动master1主机的mysql服务,观察monitor日志,master1的日志如下:[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log2017/01/09 22:16:56 INFO Check mysql on master1 is ok!2017/01/09 22:16:56 INFO Check rep_backlog on master1 is ok!2017/01/09 22:16:56 INFO Check rep_threads on master1 is ok!2017/01/09 22:16:59 FATAL State of host master1 changed from HARD_OFFLINE to AWAITING_RECOVERY从上面可以看到master1的状态由hard_offline改变为awaiting_recovery状态用如下命令将服务器上线:[root@monitor1 ~]#mmm_controlset_onlinemaster1查看群集最新状态[root@monitor1 ~]# mmm_control showmaster1(192.168.31.83) master/ONLINE. Roles:master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5), writer(192.168.31.2)slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)可以看到主库启动不会接管主,只到现有的主再次宕机。总结(1)master2备选主节点宕机不影响集群的状态,就是移除了master2备选节点的读状态。(2)master1主节点宕机,由master2备选主节点接管写角色,slave1,slave2指向新master2主库进行复制,slave1,slave2会自动change master到master2.(3)如果master1主库宕机,master2复制应用又落后于master1时就变成了主可写状态,这时的数据主无法保证一致性。如果master2,slave1,slave2延迟于master1主,这个时master1宕机,slave1,slave2将会等待数据追上db1后,再重新指向新的主node2进行复制操作,这时的数据也无法保证同步的一致性。(4)如果采用MMM高可用架构,主,主备选节点机器配置一样,而且开启半同步进一步提高安全性或采用MariaDB/mysql5.7进行多线程从复制,提高复制的性能。
附:
1、日志文件:日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。db端:/var/log/mysql-mmm/mmm_agentd.log监控端:/var/log/mysql-mmm/mmm_mond.log2、命令文件:mmm_agentd:db代理进程的启动文件mmm_mond:监控进程的启动文件 mmm_backup:备份文件 mmm_restore:还原文件mmm_control:监控操作命令文件 db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。3、mmm_control用法mmm_control程序可以用于监控群集状态、切换writer、设置onlineoffline操作等。Valid commands are:help - show this message #帮助信息ping - ping monitor #ping当前的群集是否正常show - show status #群集在线状态检查checks [<host>|all [<check>|all]] - show checks status#执行监控检查操作set_online<host> - set host <host> online #将host设置为onlineset_offline<host> - set host <host> offline #将host设置为offlinemode - print current mode. #打印输出当前的modeset_active - switch into active mode.set_manual - switch into manual mode.set_passive - switch into passive mode.move_role [--force] <role><host> - move exclusive role <role> to host <host> #移除writer服务器为指定的host服务器(Only use --force if you know what you are doing!)set_ip<ip><host> - set role with ip<ip> to host <host>检查所有的db服务器群集状态:[root@monitor1 ~]# mmm_control checks all检查项包括:ping、mysql是否正常运行、复制线程是否正常等检查群集环境在线状况:[root@monitor1 ~]# mmm_control show对指定的host执行offline操作:[root@monitor1 ~]# mmm_controlset_offline slave2对指定的host执行onine操作:[root@monitor1 ~]# mmm_controlset_online slave2执行write切换(手动切换):查看当前的slave对应的master[root@slave2 ~]# mysql -uroot -p123456 -e show slave statusG;mysql: [Warning] Using a password on the command line interface can be insecure.*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.31.141writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换[root@monitor1 ~]# mmm_controlmove_role writer master1OK: Role writer has been moved from master2 to master1. Now you can wait some time and check new roles info![root@monitor1 ~]# mmm_control showmaster1(192.168.31.83) master/ONLINE. Roles: writer(192.168.31.2)master2(192.168.31.141) master/ONLINE. Roles: reader(192.168.31.5)slave1(192.168.31.250) slave/ONLINE. Roles: reader(192.168.31.4)slave2(192.168.31.225) slave/ONLINE. Roles: reader(192.168.31.3)save从库自动切换到了新的master[root@slave2 ~]# mysql -uroot -p123456 -e show slave statusG;mysql: [Warning] Using a password on the command line interface can be insecure.*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.31.83
4、其它处理问题
如果不想让writer从master切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉<role write>中的backup<role writer>#writer角色配置hosts master1 #这里只配置一个Hostsips 192.168.31.2#对外提供的写操作的虚拟IPmode exclusive #exclusive代表只允许存在一个主,也就是只能提供一个写的IP</role>这样的话当master1出现故障了writer写操作不会切换到master2服务器,并且slave也不会指向新的master,此时当前的MMM之前对外提供写服务。
5、总结
1.对外提供读写的虚拟IP是由monitor程序控制。如果monitor没有启动那么db服务器不会被分配虚拟ip,但是如果已经分配好了虚拟ip,当monitor程序关闭了原先分配的虚拟ip不会立即关闭外部程序还可以连接访问(只要不重启网络),这样的好处就是对于monitor的可靠性要求就会低一些,但是如果这个时候其中的某一个db服务器故障了就无法处理切换,也就是原先的虚拟ip还是维持不变,挂掉的那台DB的虚拟ip会变的不可访问。
2.agent程序受monitor程序的控制处理write切换,从库切换等操作。如果monitor进程关闭了那么agent进程就起不到什么作用,它本身不能处理故障。
3.monitor程序负责监控db服务器的状态,包括Mysql数据库、服务器是否运行、复制线程是否正常、主从延时等;它还用于控制agent程序处理故障。
4.monitor会每隔几秒钟监控db服务器的状态,如果db服务器已经从故障变成了正常,那么monitor会自动在60s之后将其设置为online状态(默认是60s可以设为其它的值),有监控端的配置文件参数“auto_set_online”决定,群集服务器的状态有三种分别是:HARD_OFFLINE→AWAITING_RECOVERY→online5.默认monitor会控制mmm_agent会将writer db服务器read_only修改为OFF,其它的db服务器read_only修改为ON,所以为了严谨可以在所有的服务器的my.cnf文件中加入read_only=1由monitor控制来控制writer和read,root用户和复制用户不受read_only参数的影响。