MySQL MMM高可用方案

本文涉及的产品
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

介绍

本篇文章主要介绍搭建MMM方案以及MMM架构的原理。这里不介绍主从、主主的搭建方法,MMM方案不适用对数据一致性要求很高的业务。

 

 

 架构

部署

1.修改hosts

在所有的服务器中执行相同的操作。

vim /etc/hosts

192.168.137.10 master192.168.137.20 backup192.168.137.30 slave192.168.137.40 monitor

2.添加mysql用户

只需要在所有的数据库端执行即可,监控端不需要。

GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.137.%' IDENTIFIED BY 'mmm_monitor'; 
GRANT SUPER,REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.137.%' IDENTIFIED BY  'mmm_agent';
flush privileges;

 注意:repl用户在搭建主从服务的时候已经创建好了。

 3.安装监控软件

注意:监控端全部安装,但是监控端只需要用到mysql-mmm-monitor,mysql-mmm-agent不需要启动。数据库端只需要安装mysql-mmm-agent

1.在监控服务器执行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum –y  install mysql-mmm*

2.在数据库服务器上执行,每个数据库服务器上都要执行

wget http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm –ivh epel-release-6-8.noarch.rpm
yum -y install mysql-mmm-agent

路径说明:

4.配置文件

db服务器配置文件:mmm_agent.conf,mmm_common.conf

监控服务器的配置文件:mmm_mon.conf,mmm_common.conf(该文件所有服务器一样)

配置db服务器

1.修改master服务器

vim /etc/mysql-mmm/mmm_common.conf

复制代码

active_master_role      writer     ###积极的master角色的标示,所有的db服务器都需要开启read_only参数,对于writer服务器监控代理会自动将read_only属性关闭。<host default>
    cluster_interface       eth0      #####群集的网络接口
    pid_path                /var/run/mysql-mmm/mmm_agentd.pid    ####pid路径
    bin_path                /usr/libexec/mysql-mmm/              #####可执行文件路径 
    replication_user        repl           #######复制用户
    replication_password    repl           #######复制用户密码
    agent_user              mmm_agent      #######代理用户,用于更改只读操作
    agent_password          mmm_agent      #######代理用户密码</host><host master>            ##########master1的host名
    ip      192.168.137.10   #####master1的ip
    mode    master       ########角色属性,master代表是主
    peer    backup       ########与master1对等的服务器的host名,也就是master2的服务器host名</host><host backup>     ####和master的概念一样
    ip      192.168.137.20
    mode    master
    peer    master</host><host slave>      #####从库的host名,如果存在多个从库可以重复一样的配置
    ip      192.168.137.30   ####从的ip
    mode    slave    #####slave的角色属性代表当前host是从</host><role writer>   ####writer角色配置
    hosts   master,backup   ####能进行写操作的服务器的host名,如果不想切换写操作这里可以只配置master,这样也可以避免因为网络延时而进行write的切换,但是一旦master出现故障那么当前的MMM就没有writer了只有对外的read操作。
    ips     192.168.137.100  #####对外提供的写操作的虚拟IP
    mode    exclusive    #####exclusive代表只允许存在一个主,也就是只能提供一个写的IP</role><role reader>   #####read角色配置
    hosts   backup,slave  ######对外提供读操作的服务器的host名,当然这里也可以把master加进来
    ips     192.168.137.120,192.168.137.130,192.168.137.140  ###对外提供读操作的虚拟ip,这两个ip和host不是一一对应的,并且ips也hosts的数目也可以不相同,如果这样配置的话其中一个hosts会分配两个ip
    mode    balanced   ###balanced代表负载均衡</role>

复制代码

同时将这个文件拷贝到其它的服务器包括监控服务器,配置不变

scp  /etc/mysql-mmm/mmm_common.conf slave:/etc/mysql-mmm/scp  /etc/mysql-mmm/mmm_common.conf backup:/etc/mysql-mmm/scp  /etc/mysql-mmm/mmm_common.conf monitor:/etc/mysql-mmm/

 2.代理文件配置

vim /etc/mysql-mmm/mmm_agent.conf

 

注意:这个配置只配置db服务器,监控服务器不需要配置,this后面的host名改成当前服务器的host命令,master2和slave也改成对应的服务器的host名。

3.启动代理进程

 

chkconfig mysql-mmm-agent on
service mysql-mmm-agent start

每台db服务器上都需要启动

配置监控服务器

vim /etc/mysql-mmm/mmm_mon.conf

 

复制代码

include mmm_common.conf<monitor>
    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  #####群集的状态文件,也就是执行mmm_control show操作的显示来源。
    ping_ips            192.168.137.10,192.168.137.20,192.168.137.30  ######被监控的db服务器的ip地址
    auto_set_online     0   ####设置自动online的时间,默认是超过60s就将它设置为online,默认是60s,这里将其设为0就是立即online

    # The kill_host_bin does not exist by default, though the monitor will
    # throw a warning about it missing.  See the section 5.10 "Kill Host
    # Functionality" in the PDF documentation.
    #
    # kill_host_bin     /usr/libexec/mysql-mmm/monitor/kill_host
    #</monitor><host default>
    monitor_user        mmm_monitor   ####监控db服务器的用户
    monitor_password    mmm_monitor   ####监控db服务器的密码</host>debug 0       #######debug 0正常模式,1为debug模式

复制代码

注意:配置文件中的注释是为了便于理解,在部署的时候最好把注释去掉以免因为注释造成的潜在影响。

启动监控进程

chkconfig mysql-mmm-monitor onservice mysql-mmm-monitor start

注意:无论是在db端还是在监控端如果有对配置文件进行修改操作都需要重启代理进程和监控进程。

 

操作分析

日志文件

日志文件往往是分析错误的关键,所以要善于利用日志文件进行问题分析。

db端:/var/log/mysql-mmm/mmm_agentd.log

监控端:/var/log/mysql-mmm/mmm_mond.log

命令文件

mmm_agentd :db代理进程的启动文件
mmm_mond :监控进程的启动文件   
mmm_backup :备份文件 
mmm_restore :还原文件
mmm_clone    
mmm_control:监控操作命令文件

 

db服务器端只有mmm_agentd程序,其它的都是在monitor服务器端。

mmm_control用法

mmm_control程序可以用于监控群集状态、切换writer、设置online\offline操作等。

复制代码

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设置为online
    set_offline <host>                - set host <host> offline  ###将host设置为offline
    mode                              - print current mode.  ####打印输出当前的mode
    set_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>

复制代码

1.检查所有的db服务器群集状态

复制代码

[root@monitor mysql-mmm]# mmm_control checks allmaster  ping         [last change: 2016/06/07 16:31:24]  OK
master  mysql        [last change: 2016/06/07 16:31:24]  OK
master  rep_threads  [last change: 2016/06/07 16:31:24]  OK
master  rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is nullslave   ping         [last change: 2016/06/07 16:31:24]  OK
slave   mysql        [last change: 2016/06/07 16:31:24]  OK
slave   rep_threads  [last change: 2016/06/07 16:31:24]  OK
slave   rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is nullbackup  ping         [last change: 2016/06/07 16:31:24]  OKbackup  mysql        [last change: 2016/06/07 16:31:24]  OKbackup  rep_threads  [last change: 2016/06/07 16:31:24]  OKbackup  rep_backlog  [last change: 2016/06/07 16:31:24]  OK: Backlog is null

复制代码

检查项包括:ping、mysql是否正常运行、复制线程是否正常等

2.检查群集环境在线状况

[root@monitor mysql-mmm]# mmm_control show  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.对指定的host执行offline操作

[root@monitor mysql-mmm]# mmm_control set_offline backupOK: State of 'backup' changed to ADMIN_OFFLINE. Now you can wait some time and check all roles![root@monitor mysql-mmm]# mmm_control show  backup(192.168.137.20) master/ADMIN_OFFLINE. Roles: 
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)

4.对指定的host执行onine操作

复制代码

[root@monitor mysql-mmm]# mmm_control set_online backupOK: State of 'backup' changed to ONLINE. Now you can wait some time and check its new roles![root@monitor mysql-mmm]# mmm_control show  backup(192.168.137.20) master/REPLICATION_FAIL. Roles: 
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.120), reader(192.168.137.130)[root@monitor mysql-mmm]# mmm_control show  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120)
  master(192.168.137.10) master/ONLINE. Roles: writer(192.168.137.100)
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

复制代码

5.执行write切换

1.查看当前的slave对应的master

复制代码

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'Warning: Using a password on the command line interface can be insecure.*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.137.10
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000073
          Read_Master_Log_Pos: 1461
               Relay_Log_File: mysql-relay-bin.000006
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000073
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

复制代码

2.writer切换,要确保mmm_common.conf文件中的writer属性有配置对应的host,否则无法切换

[root@monitor mysql-mmm]# mmm_control move_role writer backupOK: Role 'writer' has been moved from 'master' to 'backup'. Now you can wait some time and check new roles info![root@monitor mysql-mmm]# mmm_control show  backup(192.168.137.20) master/ONLINE. Roles: reader(192.168.137.120), writer(192.168.137.100)
  master(192.168.137.10) master/ONLINE. Roles: 
  slave(192.168.137.30) slave/ONLINE. Roles: reader(192.168.137.130)

3.save从库自动切换到了新的master

复制代码

[root@slave ~]# mysql -uroot -proot -e 'show slave status \G;'Warning: Using a password on the command line interface can be insecure.*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.137.20
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000039
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000039
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

复制代码

 

其它处理问题

 如果不想让writer从master切换到backup(包括主从的延时也会导致写VIP的切换),那么可以在配置/etc/mysql-mmm/mmm_common.conf时,去掉<role write>中的backup

<role writer>   ####writer角色配置
    hosts   master   ###这里只配置一个Hosts
    ips     192.168.137.100  #####对外提供的写操作的虚拟IP
    mode    exclusive    #####exclusive代表只允许存在一个主,也就是只能提供一个写的IP</role>

 这样的话当master出现故障了writer写操作不会切换到backup服务器,并且slave也不会指向新的master,此时当前的MMM之前对外提供写服务。

 

总结

主从的延时会导致写VIP的切换,下一篇文章会写关于半同步复制结合MMM方案,可以更有效的解决切换数据不一致性的问题,欢迎关注。

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→online

5.默认monitor会控制mmm_agent会将writer db服务器read_only修改为OFF,其它的db服务器read_only修改为ON,所以为了严谨可以在所有的服务器的my.cnf文件中加入read_only=1由monitor控制来控制writer和read,root用户和复制用户不受read_only参数的影响

6.monitor会控制slave指向master,如果当前master故障了MMM会控制slave指向新的master,由于MMM是非抢占机制所以新的master将一直承担写服务。




本文转自 bxst 51CTO博客,原文链接:http://blog.51cto.com/13013670/1939653
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
关系型数据库 MySQL 数据库
|
1月前
|
运维 容灾 关系型数据库
介绍几种 MySQL 官方高可用方案
MySQL 官方提供了多种高可用部署方案,从最基础的主从复制到组复制再到 InnoDB Cluster 等等。本篇文章以 MySQL 8.0 版本为准,介绍下不同高可用方案架构原理及使用场景。
236 3
介绍几种 MySQL 官方高可用方案
|
25天前
|
存储 SQL 关系型数据库
Mysql多表数据需进行联动修改得方案
Mysql多表数据需进行联动修改得方案
|
1月前
|
SQL 关系型数据库 MySQL
MySQL高可用架构设计:从主从复制到分布式集群
MySQL高可用性涉及主从复制、半同步复制和Group/InnoDB Cluster。主从复制通过二进制日志同步数据,保证故障时可切换。半同步复制确保事务在至少一个从服务器确认后才提交。Group Replication是多主复制,支持自动故障切换。InnoDB Cluster是8.0的集成解决方案,简化集群管理。使用这些技术能提升数据库的稳定性和可靠性。
223 2
|
2月前
|
运维 负载均衡 关系型数据库
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
MySQL高可用解决方案演进:从主从复制到InnoDB Cluster架构
|
2月前
|
SQL canal 运维
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
MySQL高可用架构探秘:主从复制剖析、切换策略、延迟优化与架构选型
|
2月前
|
SQL 关系型数据库 MySQL
MySQL in 太慢的 3 种优化方案
MySQL中的`eq_range_index_dive_limit`参数默认值为200,影响了IN查询的执行方式。当IN列表项少于这个值时,MySQL会使用扫描索引树(精确成本计算),而多于此值则使用索引统计(快速但可能不准)来分析查询成本。大量IN值可能导致性能下降。解决方案包括:1) 分批查询;2) 使用UNION ALL创建内存临时表;3) 创建实体表存储IN值并进行JOIN操作。注意,实体表需及时清理并避免反复插入删除导致性能下降。
244 0
|
2月前
|
搜索推荐 关系型数据库 MySQL
MySQL插入汉字报错的解决方案
MySQL插入汉字报错的解决方案
35 0
|
20天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
18天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。

推荐镜像

更多