• MySQL案例详解 三:MMM高可用架构及其故障切换


    1. MMM高可用概述

    1.1 简介

    在这里插入图片描述
    MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器)是一套支持双主故障切换和双主日常管理的脚本程序。
    MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。

    由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。

    MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。

    1.2 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 用户。

    1.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 同步数据

    1.4 MMM架构的优缺点

    1.4.1 优势

    • 高可用性:MMM 通过自动故障检测和故障转移机制,可以快速将一个从节点提升为新的主节点,从而实现数据库的高可用性,减少系统的停机时间。
    • 负载均衡:MMM 可以根据节点的负载情况,将读操作分发到不同的节点上,从而实现负载均衡,提高系统的整体性能。
    • 简单易用:MMM 提供了一些管理工具,可以方便地进行节点的添加、删除和配置修改等操作,使得系统的管理和维护变得简单易用。

    1.4.2 劣势

    • 数据一致性:由于 MMM 采用的是异步复制机制,主节点和从节点之间存在一定的延迟,可能导致数据的不一致。在某些场景下,可能需要额外的措施来确保数据的一致性。
    • 单点故障:虽然 MMM 可以自动进行故障转移,但在故障转移过程中,可能会存在一段时间的数据库不可用。如果 MMM 本身发生故障,可能会导致整个系统的不可用。
    • 配置复杂性:MMM 的配置相对复杂,需要对 MySQL 的复制机制和 MMM 的工作原理有一定的了解。在配置过程中,需要注意各个节点的配置一致性和正确性。

    2. 部署MMM多主多从高可用架构

    2.1 前置准备

    节点服务器所需服务及组件IP地址
    Master1(db1)mysql5.7、mysql-mmm192.168.67.100
    Master2(db2)mysql5.7、mysql-mmm192.168.67.101
    Slave1(db3)mysql5.7、mysql-mmm192.168.67.102
    Slave2(db4)mysql5.7、mysql-mmm192.168.67.103
    monitor(db5)mysql-mmm192.168.2.104
    #所有节点服务器
    systemctl stop firewalld
    setenforce 0
    #关闭防火墙和selinux策略
    
    vim /etc/selinux/config
    SELINUX=disabled
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2 配置主主复制、主从复制

    2.2.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                  #自增字段的起始值
    
    #无注释版
    [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
    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
    sync_binlog=1
    innodb_flush_log_at_trx_commit=1
    auto_increment_increment=2
    auto_increment_offset=1
    
    
    #保存后重启服务
    systemctl restart mysqld
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    在这里插入图片描述

    2.2.2 把配置文件复制到其它 3 台数据库服务器上并启动服务器

    注:配置文件中的 server_id 要修改

    scp /etc/my.cnf root@192.168.67.101:/etc/
    scp /etc/my.cnf root@192.168.67.102:/etc/
    scp /etc/my.cnf root@192.168.67.103:/etc/
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #修改Master2 Slave1 Slave2的Mysql配置文件
    #修改server_id 每个服务器不一致
    
    systemctl restart mysqld
    #修改完成后所有节点服务器重启服务
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.2.3 配置主主复制

    #在两台主服务器上都执行授予从的权限
    #从服务器上不需要执行
    grant replication slave on *.* to 'replication'@'192.168.67.%' identified by 'abc123';
    
    #在两台主服务器上查看,记录日志文件名称和同步点
    show master status;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    #在Master1上配置同步
    change master to master_host='192.168.67.101',master_user='replication',master_password='abc123',master_log_file='mysql_bin.000001',master_log_pos=460;
    
    start slave;
    
    show slave status\G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    #在Master2上配置同步
    change master to master_host='192.168.67.100',master_user='replication',master_password='abc123',master_log_file='mysql_bin.000001',master_log_pos=460;
    
    start slave;
    
    show slave status\G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2.2.4 配置主从复制

    #同一时间只能有一个主服务器工作
    change master to master_host='192.168.67.100',master_user='replication',master_password='abc123',master_log_file='mysql_bin.000001',master_log_pos=460;
    
    start slave;
    
    show slave status\G
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    2.2.5 测试主主、主从复制同步情况

    create database scj;
    #新建数据库
    
    • 1
    • 2

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    2.3 安装配置 MySQL-MMM

    #在所有服务器上安装 MySQL-MMM
    #获取软件包
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    #安装依赖和软件
    yum -y install epel-release
    yum -y install mysql-mmm*
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3.1 在 Master1上对 MySQL-MMM 进行配置

    cd /etc/mysql-mmm/
    vim mmm_common.conf
    ……
    <host default>
        cluster_interface       ens33
        ……
        replication_user        replication
        replication_password    abc123
        agent_user              mmm_agent
        agent_password          abc123
    
    <host db1>
        ip      192.168.67.100
        mode    master
        peer    db2
    </host>
    
    <host db2>
        ip      192.168.67.101
        mode    master
        peer    db1
    </host>
    
    <host db3>
        ip      192.168.67.102
        mode    slave
    </host>
    
    <host db4>
        ip      192.168.67.103
        mode    slave
    </host>
    
    <role writer>
        hosts   db1, db2
        ips     192.168.67.110
        mode    exclusive           #只有一个 host 可以进行写操作模式
    </role>
    
    <role reader>
        hosts   db3, db4
        ips     192.168.67.120, 192.168.67.130
        mode    balanced            #多个 slave 主机可以进行读操作模式
    </role>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述

    2.3.2 将配置文件复制到其它所有主机

    所有主机该配置文件内容都是一样的。

    scp mmm_common.conf root@192.168.67.101:/etc/mysql-mmm/
    scp mmm_common.conf root@192.168.67.102:/etc/mysql-mmm/
    scp mmm_common.conf root@192.168.67.103:/etc/mysql-mmm/
    scp mmm_common.conf root@192.168.67.104:/etc/mysql-mmm/
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    2.3.3 修改所有数据库服务器的代理配置文件

    #修改 mmm_agent.conf
    vim /etc/mysql-mmm/mmm_agent.conf
    
    include mmm_common.conf
    this db1				#根据不同的主机分别修改为 db1,db2,db3,db4
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.3.4 在 monitor 监控服务器上修改监控配置文件

    vi /etc/mysql-mmm/mmm_mon.conf
    
    include mmm_common.conf
    <monitor>
    .....
        ping_ips        	192.168.67.100,192.168.67.101,192.168.67.102,192.168.67.103   #指定所有数据库服务器的 IP
    	auto_set_online		10				#指定自动上线时间
    </monitor>
    
    <host default>
        monitor_user        mmm_monitor		#指定 mmm_monitor 的用户名
        monitor_password    abc123          #指定 mmm_monitor 的密码
    </host>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    2.3.5 在所有数据库上为 mmm_agent(代理进程)和mmm_moniter(监控进程)授权

    grant super, replication client, process on *.* to 'mmm_agent'@'192.168.67.%' identified by 'abc123';
    
    grant replication client on *.* to 'mmm_monitor'@'192.168.67.%' identified by 'abc123';
    
    flush privileges;
    #刷新权限
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    2.3.6 在所有数据库服务器上启动 mysql-mmm-agent

    systemctl enable mysql-mmm-agent.service --now
    
    • 1

    在这里插入图片描述

    2.3.7 在 monitor 服务器上启动 mysql-mmm-monitor

    systemctl start mysql-mmm-monitor.service 
    
    • 1

    在这里插入图片描述

    2.3.8 在 monitor 服务器上测试群集

    mmm_control show
    #查看各节点情况
    
    • 1
    • 2

    在这里插入图片描述

    #检测监控功能是否都完善
    mmm_control checks all
    
    • 1
    • 2

    在这里插入图片描述

    #指定绑定 VIP 的主机
    mmm_control move_role writer db2
    
    • 1
    • 2

    在这里插入图片描述

    mmm_control move_role writer db1
    
    mmm_control show
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    2.3.9 测试故障切换

    #测试从服务器宕机以及恢复
    #Slave1
    systemctl stop mysqld
    #停止slave1的MySQL服务
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    #切换至monitor
    mmm_control show
    
    #Slave1 离线 
    #VIP漂移至Slave2,服务不影响
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    #重启slave1服务
    systemctl start mysqld
    
    • 1
    • 2

    在这里插入图片描述

    #切换至monitor
    mmm_control show
    
    #多次执行
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    
    
    • 1
  • 相关阅读:
    231022|推荐系统1-推荐框架注释
    windows资源文件LoadCursor、LoadIcon、SetCursor、SetIcon、WM_SETCURSOR消息
    fatal: Authentication failed for ‘https://gitee.com/xxx/xxx.git/‘
    Linux下安装MySQL教程
    有六家机器视觉公司今年11月份初放假到明年春节后,除夕不放假看住企业不跑路,不倒闭,明年大家日子会越来越甜
    C++ 类和对象(7) 对象数组
    博流BL602芯片 - 烧录配置
    [RK3568][Android11]内核Oops日志分析
    浅谈Java语法中的字符串:String
    离线生成双语字幕,一键生成中英双语字幕,基于AI大模型,ModelScope
  • 原文地址:https://blog.csdn.net/m0_74170357/article/details/133698548