位置: 编程技术 - 正文

MySQL高可用解决方案MMM(mysql多主复制管理器)(mysql数据库高可用方案)

发布时间:2024-02-26

推荐整理分享MySQL高可用解决方案MMM(mysql多主复制管理器)(mysql数据库高可用方案),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql的高可用,mysql 高可用性,mysql 高可用性,mysql高可用解决方案,mysql高可用keepalived,mysql高可用keepalived,mysql的高可用,mysql高可用解决方案,内容如对您有帮助,希望把文章链接给更多的朋友!

一、MMM简介:

MMM即Multi-Master Replication Manager for MySQL:mysql多主复制管理器,基于perl实现,关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),MMM也能对从服务器进行读负载均衡,所以可以用它来在一组用于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。MMM不仅能提供浮动IP的功能,如果当前的主服务器挂掉后,会将你后端的从服务器自动转向新的主服务器进行同步复制,不用手工更改同步配置。这个方案是目前比较成熟的解决方案。详情请看官网: 负责所有的监控工作的监控守护进程,决定节点的移除(mmm_mond进程定时心跳检测,失败则将write ip浮动到另外一台master)等等mmm_agentd 运行在mysql服务器上的代理守护进程,通过简单远程服务集提供给监控节点mmm_control 通过命令行管理mmm_mond进程在整个监管过程中,需要在mysql中添加相关授权用户,授权的用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还要添加一个mmm_tools用户。

二、部署实施

1、环境介绍

OS:centos7.2(位)数据库系统:mysql5.7.

关闭selinux

配置ntp,同步时间

角色

IP

hostname

Server-id

Write vip

Read vip

Master1

...

master1

1

...2

Master2(backup)

...

master2

2

...3

Slave1

...

slave1

3

...4

Slave2

...

slave2

4

...5

monitor

...

monitor1

MySQL高可用解决方案MMM(mysql多主复制管理器)(mysql数据库高可用方案)

2、在所有主机上配置/etc/hosts文件,添加如下内容:

... master... master... slave... slave... monitor1

在所有主机上安装perl、perl-develperl-CPAN libart_lgpl.x_ rrdtool.x_ rrdtool-perl.x_包#yum -y install perl-* libart_lgpl.x_ rrdtool.x_ rrdtool-perl.x_

注:使用centos7在线yum源安装

安装perl的相关库

#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP

3、在master1、master2、slave1、slave2主机上安装mysql5.7和配置复制

master1和master2互为主从,slave1、slave2为master1的从在每个mysql的配置文件/etc/my.cnf中加入以下内容, 注意server_id不能重复。

master1主机:

在完成了对my.cnf的修改后,通过systemctl restart mysqld重新启动mysql服务

4台数据库主机若要开启防火墙,要么关闭防火墙或者创建访问规则:

firewall-cmd --permanent --add-port=/tcpfirewall-cmd --reload主从配置(master1和master2配置成主主,slave1和slave2配置成master1的从):在master1上授权:mysql> grant replication slave on *.* to rep@'...%' identified by '';在master2上授权:mysql> grant replication slave on *.* to rep@'...%' identified by '';把master2、slave1和slave2配置成master1的从库:在master1上执行show master status; 获取binlog文件和Position点mysql> show master status;+------------------+----------+--------------+------------------+--------------------------------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+---------------------------------------------------+| mysql-bin. | | | | |+------------------+----------+--------------+------------------+-----------------------------------------------------+在master2、slave1和slave2执行

mysql> change master to master_host='...',master_port=,master_user='rep',master_password='',master_log_file='mysql-bin.',master_log_pos=;mysql>slave start;验证主从复制:master2主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: Connect_Retry: Master_Log_File: mysql-bin.Read_Master_Log_Pos: Relay_Log_File: relay-bin.Relay_Log_Pos: Relay_Master_Log_File: mysql-bin.Slave_IO_Running: YesSlave_SQL_Running: Yesslave1主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: Connect_Retry: Master_Log_File: mysql-bin.Read_Master_Log_Pos: Relay_Log_File: relay-bin.Relay_Log_Pos: Relay_Master_Log_File: mysql-bin.Slave_IO_Running: YesSlave_SQL_Running: Yesslave2主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: Connect_Retry: Master_Log_File: mysql-bin.Read_Master_Log_Pos: Relay_Log_File: relay-bin.Relay_Log_Pos: Relay_Master_Log_File: mysql-bin.Slave_IO_Running: YesSlave_SQL_Running: Yes如果Slave_IO_Running和Slave_SQL_Running都为yes,那么主从就已经配置OK了把master1配置成master2的从库:在master2上执行show master status ;获取binlog文件和Position点mysql> show master status;+------------------+----------+--------------+------------------+--------------------------------------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+---------------------------------------------------+| mysql-bin. | | | | |+------------------+----------+--------------+------------------+----------------------------------------------------+在master1上执行:mysql> change master to master_host='...',master_port=,master_user='rep',master_password='',master_log_file='mysql-bin.',master_log_pos=;mysql> start slave;验证主从复制:master1主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: Connect_Retry: Master_Log_File: mysql-bin.Read_Master_Log_Pos: Relay_Log_File: relay-bin.Relay_Log_Pos: Relay_Master_Log_File: mysql-bin.Slave_IO_Running: YesSlave_SQL_Running: Yes如果Slave_IO_Running和Slave_SQL_Running都为yes,那么主从就已经配置OK了4、mysql-mmm配置:在4台mysql节点上创建用户创建代理账号:mysql> grant super,replicationclient,process on *.* to 'mmm_agent'@'...%' identified by '';创建监控账号:mysql> grant replication client on *.* to 'mmm_monitor'@'...%' identified by '';注1:因为之前的主从复制,以及主从已经是ok的,所以我在master1服务器执行就ok了。检查master2和slave1、slave2三台db上是否都存在监控和代理账号mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');+-------------+----------------------------+| user | host |+-------------+----------------------------+| mmm_agent | ...% || mmm_monitor | ...% |+-------------+------------------------------+或mysql> show grants for 'mmm_agent'@'...%';+-----------------------------------------------------------------------------------------------------------------------------+| Grants for mmm_agent@...% |+-----------------------------------------------------------------------------------------------------------------------------+| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'mmm_agent'@'...%' |+-----------------------------------------------------------------------------------------------------------------------------+mysql> show grants for 'mmm_monitor'@'...%';+-----------------------------------------------------------------------------------------------------------------------------+| Grants for mmm_monitor@...% |+-----------------------------------------------------------------------------------------------------------------------------+| GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'...%' |注2:mmm_monitor用户:mmm监控用于对mysql服务器进程健康检查mmm_agent用户:mmm代理用来更改只读模式,复制的主服务器等5、mysql-mmm安装在monitor主机(...) 上安装监控程序cd /tmpwget -zxf mysql-mmm-2.2.1.tar.gzcd mysql-mmm-2.2.1make install在数据库服务器(master1、master2、slave1、slave2)上安装代理cd /tmpwget -zxf mysql-mmm-2.2.1.tar.gzcd mysql-mmm-2.2.1make install

6、配置mmm

编写配置文件,五台主机必须一致:完成安装后,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服务器和数据库服务器上都要包含一个共同的文件mmm_common.conf,内容如下:active_master_rolewriter#积极的master角色的标示,所有的db服务器要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。<host default>cluster_interfaceeno#群集的网络接口pid_path /var/run/mmm_agentd.pid#pid路径bin_path /usr/lib/mysql-mmm/#可执行文件路径replication_user rep#复制用户replication_password #复制用户密码agent_usermmm_agent#代理用户agent_password #代理用户密码</host><host master1>#master1的host名ip ...#master1的ipmode master#角色属性,master代表是主peer master2#与master1对等的服务器的host名,也就是master2的服务器host名</host><host master2>#和master的概念一样ip ...mode masterpeer master1</host><host slave1>#从库的host名,如果存在多个从库可以重复一样的配置ip ...#从的ipmode slave#slave的角色属性代表当前host是从</host><host slave2>#和slave的概念一样ip ...mode slave</host><role writer>#writer角色配置hosts master1,master2#能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。ips ...2#对外提供的写操作的虚拟IPmode exclusive#exclusive代表只允许存在一个主,也就是只能提供一个写的IP</role><role reader>#read角色配置hosts master2,slave1,slave2#对外提供读操作的服务器的host名,当然这里也可以把master加进来ips ...3, ...4, ...5#对外提供读操作的虚拟ip,这三个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ipmode balanced#balanced代表负载均衡</role>同时将这个文件拷贝到其它的服务器,配置不变#for host in master1 master2 slave1 slave2 ; do scp /etc/mysql-mmm/mmm_common.conf $host:/etc/mysql-mmm/ ; done代理文件配置编辑 4台mysql节点机上的/etc/mysql-mmm/mmm_agent.conf 在数据库服务器上,还有一个mmm_agent.conf需要修改,其内容是:includemmm_common.confthis master1注意:这个配置只配置db服务器,监控服务器不需要配置,this后面的host名改成当前服务器的主机名。启动代理进程 在 /etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容 source /root/.bash_profile 添加成系统服务并设置为自启动#chkconfig --add mysql-mmm-agent#chkconfigmysql-mmm-agent on#/etc/init.d/mysql-mmm-agent start注:添加source /root/.bash_profile目的是为了mysql-mmm-agent服务能启机自启。自动启动和手动启动的唯一区别,就是激活一个console 。那么说明在作为服务启动的时候,可能是由于缺少环境变量服务启动失败,报错信息如下:Daemon bin: '/usr/sbin/mmm_agentd'Daemon pid: '/var/run/mmm_agentd.pid'Starting MMM Agent daemon... Can't locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_agentd line 7.BEGIN failed--compilation aborted at /usr/sbin/mmm_agentd line 7.failed

解决方法:

# cpanProc::Daemon# cpan Log::Log4perl# /etc/init.d/mysql-mmm-agent startDaemon bin: '/usr/sbin/mmm_agentd'Daemon pid: '/var/run/mmm_agentd.pid'Starting MMM Agent daemon... Ok# netstat -antp | grep mmm_agentdtcp 0 0 ...: 0.0.0.0:* LISTEN /mmm_agentd配置防火墙firewall-cmd --permanent --add-port=/tcpfirewall-cmd --reload编辑 monitor主机上的/etc/mysql-mmm/mmm_mon.conf includemmm_common.conf<monitor>ip .0.0.1##为了安全性,设置只在本机监听,mmm_mond默认监听pid_path /var/run/mmm_mond.pidbin_path /usr/lib/mysql-mmm/status_path/var/lib/misc/mmm_mond.statusping_ips...,...,...,...#用于测试网络可用性 IP 地址列表,只要其中有一个地址 ping 通,就代表网络正常,这里不要写入本机地址auto_set_online 0#设置自动online的时间,默认是超过s就将它设置为online,默认是s,这里将其设为0就是立即online</monitor><check default>check_period 5trap_period timeout 2#restart_after max_backlog </check>check_period描述:检查周期默认为5s默认值:5strap_period描述:一个节点被检测不成功的时间持续trap_period秒,就慎重的认为这个节点失败了。默认值:stimeout描述:检查超时的时间默认值:2srestart_after描述:在完成restart_after次检查后,重启checker进程默认值:max_backlog描述:记录检查rep_backlog日志的最大次数默认值:<host default>monitor_usermmm_monitor#监控db服务器的用户monitor_password #监控db服务器的密码</host>debug 0#debug 0正常模式,1为debug模式启动监控进程:在 /etc/init.d/mysql-mmm-agent的脚本文件的#!/bin/sh下面,加入如下内容 source /root/.bash_profile 添加成系统服务并设置为自启动#chkconfig --add mysql-mmm-monitor#chkconfigmysql-mmm-monitor on#/etc/init.d/mysql-mmm-monitor start

启动报错:

Starting MMM Monitor daemon: Can not locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib/perl5 /usr/local/share/perl5 /usr/lib/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mond line .BEGIN failed--compilation aborted at /usr/sbin/mmm_mond line .failed解决方法:安装下列perl的库#cpanProc::Daemon#cpan Log::Log4perl[root@monitor1 ~]# /etc/init.d/mysql-mmm-monitor startDaemon bin: '/usr/sbin/mmm_mond'Daemon pid: '/var/run/mmm_mond.pid'Starting MMM Monitor daemon: Ok[root@monitor1 ~]# netstat -anpt | grep tcp 0 0 .0.0.1: 0.0.0.0:* LISTEN /mmm_mond注1:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。注2:MMM启动顺序:先启动monitor,再启动 agent

检查集群状态:

[root@monitor1 ~]# mmm_control showmaster1(...) master/ONLINE. Roles: writer(...2)master2(...) master/ONLINE. Roles: reader(...5)slave1(...) slave/ONLINE. Roles: reader(...4)slave2(...) slave/ONLINE. Roles: reader(...3)

如果服务器状态不是ONLINE,可以用如下命令将服务器上线,例如:

#mmm_controlset_online主机名

例如:[root@monitor1 ~]#mmm_controlset_onlinemaster1从上面的显示可以看到,写请求的VIP在master1上,所有从节点也都把master1当做主节点。查看是否启用vip[root@master1 ~]# ipaddr show dev enoeno: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu qdiscpfifo_fast state UP qlen link/ether :0c::6d:2f: brdff:ff:ff:ff:ff:ffinet .../ brd ... scope global enovalid_lft forever preferred_lft foreverinet ...2/ scope global enovalid_lft forever preferred_lft foreverinet6 fe::c:ff:fe6d:2f/ scope linkvalid_lft forever preferred_lft forever[root@master2 ~]# ipaddr show dev enoeno: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu qdiscpfifo_fast state UP qlen link/ether :0c:::1a:9c brdff:ff:ff:ff:ff:ffinet .../ brd ... scope global dynamic enovalid_lft sec preferred_lft secinet ...5/ scope global enovalid_lft forever preferred_lft foreverinet6 fe::c:ff:fe:1a9c/ scope linkvalid_lft forever preferred_lft forever[root@slave1 ~]# ipaddr show dev enoeno: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu qdiscpfifo_fast state UP qlen link/ether :0c:::: brdff:ff:ff:ff:ff:ffinet .../ brd ... scope global dynamic enovalid_lft sec preferred_lft secinet ...4/ scope global enovalid_lft forever preferred_lft foreverinet6 fe::c:ff:fe:/ scope linkvalid_lft forever preferred_lft forever[root@slave2 ~]# ipaddr show dev enoeno: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu qdiscpfifo_fast state UP qlen link/ether :0c::e2:c7:fa brdff:ff:ff:ff:ff:ffinet .../ brd ... scope global dynamic enovalid_lft sec preferred_lft secinet ...3/ scope global enovalid_lft forever preferred_lft foreverinet6 fe::c:ff:fee2:c7fa/ scope linkvalid_lft forever preferred_lft forever在master2,slave1,slave2主机上查看主mysql的指向mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: Connect_Retry:

MMM高可用性测试:

服务器读写采有VIP地址进行读写,出现故障时VIP会漂移到其它节点,由其它节点提供服务。首先查看整个集群的状态,可以看到整个集群状态正常[root@monitor1 ~]# mmm_control showmaster1(...) master/ONLINE. Roles: writer(...2)master2(...) master/ONLINE. Roles: reader(...5)slave1(...) slave/ONLINE. Roles: reader(...4)slave2(...) slave/ONLINE. Roles: reader(...3)模拟master1宕机,手动停止mysql服务,观察monitor日志,master1的日志如下:[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log// :: WARN Check 'rep_threads' on 'master1' is in unknown state! Message: UNKNOWN: Connect error (host = ...:, user = mmm_monitor)! Can't connect to MySQL server on '...' ()// :: WARN Check 'rep_backlog' on 'master1' is in unknown state! Message: UNKNOWN: Connect error (host = ...:, user = mmm_monitor)! Can't connect to MySQL server on '...' ()// :: ERROR Check 'mysql' on 'master1' has failed for seconds! Message: ERROR: Connect error (host = ...:, user = mmm_monitor)! Can't connect to MySQL server on '...' ()// :: FATAL State of host 'master1' changed from ONLINE to HARD_OFFLINE (ping: OK, mysql: not OK)// :: INFO Removing all roles from host 'master1':// :: INFO Removed role 'writer(...2)' from host 'master1'// :: INFO Orphaned role 'writer(...2)' has been assigned to 'master2'查看群集的最新状态[root@monitor1 ~]# mmm_control showmaster1(...) master/HARD_OFFLINE. Roles:master2(...) master/ONLINE. Roles: reader(...5), writer(...2)slave1(...) slave/ONLINE. Roles: reader(...4)slave2(...) slave/ONLINE. Roles: reader(...3)从显示结果可以看出master1的状态有ONLINE转换为HARD_OFFLINE,写VIP转移到了master2主机上。检查所有的db服务器群集状态[root@monitor1 ~]# mmm_control checks allmaster1 ping [last change: // ::] OKmaster1 mysql [last change: // ::] ERROR: Connect error (host = ...:, user = mmm_monitor)! Can't connect to MySQL server on '...' ()master1 rep_threads [last change: // ::] OKmaster1 rep_backlog [last change: // ::] OK: Backlog is nullslave1 ping [last change: // ::] OKslave1mysql [last change: // ::] OKslave1 rep_threads [last change: // ::] OKslave1 rep_backlog [last change: // ::] OK: Backlog is nullmaster2 ping [last change: // ::] OKmaster2 mysql [last change: // ::] OKmaster2 rep_threads [last change: // ::] OKmaster2 rep_backlog [last change: // ::] OK: Backlog is nullslave2 ping [last change: // ::] OKslave2mysql [last change: // ::] OKslave2 rep_threads [last change: // ::] OKslave2 rep_backlog [last change: // ::] OK: Backlog is null从上面可以看到master1能ping通,说明只是服务死掉了。

查看master2主机的ip地址:

[root@master2 ~]# ipaddr show dev enoeno: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu qdiscpfifo_fast state UP qlen link/ether :0c:::1a:9c brdff:ff:ff:ff:ff:ffinet .../ brd ... scope global dynamic enovalid_lft sec preferred_lft secinet ...5/ scope global enovalid_lft forever preferred_lft foreverinet ...2/ scope global enovalid_lft forever preferred_lft foreverinet6 fe::c:ff:fe:1a9c/ scope linkvalid_lft forever preferred_lft foreverslave1主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: slave2主机:mysql> show slave statusG;*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: ...Master_User: repMaster_Port: 启动master1主机的mysql服务,观察monitor日志,master1的日志如下:[root@monitor1 ~]# tail -f /var/log/mysql-mmm/mmm_mond.log// :: INFO Check 'mysql' on 'master1' is ok!// :: INFO Check 'rep_backlog' on 'master1' is ok!// :: INFO Check 'rep_threads' on 'master1' is ok!// :: 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(...) master/ONLINE. Roles:master2(...) master/ONLINE. Roles: reader(...5), writer(...2)slave1(...) slave/ONLINE. Roles: reader(...4)slave2(...) slave/ONLINE. Roles: reader(...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 -p -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: ...writer切换,要确保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(...) master/ONLINE. Roles: writer(...2)master2(...) master/ONLINE. Roles: reader(...5)slave1(...) slave/ONLINE. Roles: reader(...4)slave2(...) slave/ONLINE. Roles: reader(...3)save从库自动切换到了新的master[root@slave2 ~]# mysql -uroot -p -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: ...

4、其它处理问题

如果不想让writer从master切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉<role write>中的backup<role writer>#writer角色配置hosts master1 #这里只配置一个Hostsips ...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会自动在s之后将其设置为online状态(默认是s可以设为其它的值),有监控端的配置文件参数“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参数的影响。

Mysql常用sql语句汇总 1、mysql导出文件:SELECT`pe2e_user_to_company`.company_name,`pe2e_user_to_company`.company_code,`users`.name,`users`.uid,`users`.mail,`pe2e_email_notification_email`.`email_cc`FROM`users`,`pe2e_

MySQL prepare原理详解 Prepare的好处PrepareSQL产生的原因。首先从mysql服务器执行sql的过程开始讲起,SQL执行过程包括以下阶段词法分析-语法分析-语义分析-执行计划优化-执行。

游戏和服备忘问题简析 今天游戏和服,发现数据备份好后,导入不到目标库中,mysql-h...--port-usanda-pX--default-character-set=utf8sanda_s/data/mysql/8/user.sql返回ERROR(

标签: mysql数据库高可用方案

本文链接地址:https://www.jiuchutong.com/biancheng/348327.html 转载请保留说明!

上一篇:Centos7使用yum安装Mysql5.7.19的详细步骤(centos7.6怎么安装)

下一篇:Mysql常用sql语句汇总(mysql基本sql语句大全(基础用语篇))

  • 企业技术转让享受税收优惠政策应符合哪些条件
  • 税收指的是什么
  • 资金过桥怎么操作
  • 企业所得税几大税种
  • 开分公司赚钱吗
  • 小微企业注册流程及费用微
  • 不征税发票能报税吗
  • 建筑公司收到材料发票
  • 发票一定要填数量吗
  • 物流企业信用评级
  • 收到政府给的公维基金怎么开票报销
  • 以前借款没做账现在收回来怎么做账务处理?
  • 投资损益表该如何填列
  • 购买财务软件账务处理规定
  • 企业在筹办期间发生的开办费计入管理费用账户
  • 国税的应交税款在地税的财务报表上怎么填?
  • 贸易行业要计提什么费用
  • 地址变更工商局上门检查
  • 契税如果没有按时交会怎么办
  • 销项税额是负数是怎么回事
  • 公司对公账户每年费用
  • mac怎么安装字体文件
  • warning control
  • 信息化投入费用包括哪些
  • 投资长期溢价债券,容易获取投资收益
  • 如何设定电脑开机密码锁
  • 在windows 10中任务栏()
  • 房地产企业困境
  • php ftp上传文件
  • php read
  • 在建工程进项税可以抵扣吗
  • 自营 代理
  • 如何用ai写代码
  • 哈利法塔里面有什么
  • Realsense D455/435内参标定以及手眼标定
  • 公司员工个人所得税交多少
  • vue实战技巧
  • 深度学习|论文中常用的注意力模块合集(下)
  • A Loepa oberthuri moth (© Robert Thompson/Minden Pictures)
  • 十大经典排序算法(动图演示C 实现)
  • mapbox怎么用
  • configure命令
  • php 错误和异常处理
  • thinkphp消息通知
  • 逆回购要手续费吗
  • 城市维护建设税,教育费附加,地方教育费附加
  • 基本户 变更
  • 视同销售是指什么
  • 一般纳税人不开票收入怎么做账
  • 发票隔月可以重开吗
  • 没有收到款项签认债有用吗
  • 进项增值税发票抵扣期限
  • 工程款发票怎么做分录
  • 劳务派遣期限是什么意思
  • 收到保险理赔款计入什么科目
  • 存出投资款会计处理
  • 多栏式明细账的账页格式适用于
  • mysql中key 、primary key 、unique key 与index区别
  • mysql中decimal对应java类型
  • winxp注销快捷键
  • wincomm.exe - wincomm是什么进程
  • win7系统怎么重置网络
  • WIN7系统如何设置表格默认保存位置
  • win7家庭版开启administrator
  • cortanawin10在哪
  • ssh permission denied password
  • win10预览版好吗
  • linuxwho
  • 多个checkbox选中触发事件
  • shell程序中定义的函数能不能有参数
  • node创建服务
  • python2.7和3.8
  • 粒子form
  • 木瓜电子
  • textview在哪
  • 拆迁房抵税政策
  • 特许权使用费包括哪些内容
  • 小规模纳税人在电子税务局怎么报税
  • 佩兰诗胶原蛋白填充霜真的有效果吗
  • 西安医疗保险官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号