• 搜索
  • 夜间模式
    ©2026  依刻学习 Theme by OneBlog

    依刻学习博客

    搜索
    标签
  • 首页>
  • 学习的一天>
  • 正文
  • MHA实践(1)

    2025年03月22日 20 阅读 0 评论 8320 字

    前言

    复习mysql,搭建MHA架构,并且对MHA架构进行一定测试,标注出一些关键问题

    |NODE|IP|ROLE|
    |-|-|-|
    |T1|192.168.179.191|master,MHA-node|
    |T2|192.168.179.192|slave,MHA-manager|
    |T3|192.168.179.193|slave,MHA-node|
    可以将MHA-manager移至一个比较安全的节点,但是slave本身也可以(会配置no_master禁止T2成为master)

    实践

    1.配置域名解析

    cat >> /etc/hosts <<EOF
    192.168.179.191  T1
    192.168.179.192  T2
    192.168.179.193  T3
    EOF

    2.安装3台mysql
    请参考mysql一键启动脚本

    3.设置每个节点间的免密登录(每个节点都需要)

    ssh-keygen
    for i in 191 192 193;do ssh-copy-id root@192.168.179.$i;done

    4.配置用户(推荐所有节点,只有主节点也行)
    所有节点都需要授权是因为主从可能切换,此时原来的从节点就成为主节点,那么同时也需要复制账户
    但是实际上只需要主节点就行了,因为并没有配置忽略mysql这个database(user表在其中),所以从节点复制时也会复制授权语句

    #监控用户monmha,监控数据库变化
    grant all privileges on *.* to 'monmha'@'T1' identified by '!@#$%^&[]{O2p';
    grant all privileges on *.* to 'monmha'@'T2' identified by '!@#$%^&[]{O2p';
    grant all privileges on *.* to 'monmha'@'T3' identified by '!@#$%^&[]{O2p';
    grant all privileges on *.* to 'monmha'@'192.168.179.*' identified by '!@#$%^&[]{O2p';
    #复制用户mha,用于复制数据库
    grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'192.168.179.*' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
    grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T1' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
    grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T2' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
    grant REPLICATION SLAVE, REPLICATION CLIENT on *.* to 'mha'@'T3' identified by '1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n';
    flush privileges;
    #192.168.179.*与192.168.179.%基本相同
    #在mysql8.0中,创建用户与授权需要分开来,也就是需要两步
    #mysql需要对指定NDS进行解析,即使

    5.修改配置文件

    vim /etc/my.cnf
    
    [mysqld]
    # ===== 基础配置 =====
    # 唯一ID(主从必须不同,如主=1,从=2)
    server-id               = 1    
    datadir                 = /var/lib/mysql
    socket                  = /var/lib/mysql/mysql.sock
    log-error               = /var/log/mysqld.log
    pid-file                = /var/run/mysqld/mysqld.pid
    
    # ===== 二进制日志配置 =====
    # 所有节点均需配置(MHA要求)
    log-bin                 = /var/lib/mysql/mysql-bin  
    binlog_format           = ROW                     
    expire_logs_days        = 7
    max_binlog_size         = 100M
    # 主库建议1,从库可设0
    sync_binlog             = 1                         
    
    # ===== 中继日志配置 =====
    # 所有节点均需配置(MHA要求)
    relay_log               = /var/lib/mysql/relay-bin  
    # 控制sql线程定时清理中继日志
    relay_log_purge         = ON
    # 从库是否将其接收到的来自主库的更新操作记录到自己的二进制日志,必须启用(从库提升为主时需记录binlog)
    log_slave_updates       = ON                        
    
    # ===== GTID 配置(可选)=====
    # 一旦开启GTID,无法再回退,但是便于MHA定位日志断点(无需指定断点)
    gtid_mode             = ON                       
    enforce_gtid_consistency = ON
    
    # ===== 数据持久化配置 =====
    #innodb_flush_log_at_trx_commit 0:每秒刷到磁盘,1:事务提交时刷到文件系统,再刷到磁盘(性能好);2:事务提交时刷到磁盘
    # 主库建议1,从库可设2
    innodb_flush_log_at_trx_commit = 1                  
    # 根据内存调整(通常占50-70%)
    innodb_buffer_pool_size = 4G                        
    
    # ===== 主从角色相关配置 =====
    #read_only禁止普通用户写,但是SUPER用户仍能正常写
    #super_read_only禁止任何用户写,只有复制线程能绕过该限制的
    # 主库=OFF,从库=ON
    read_only               = OFF           
    # MHA切换主从时可以修改read_only,但是无法修改super_read_only导致一旦打开,主从切换后的master无法写入
    #super_read_only         = OFF               
    
    # ===== 网络与连接 =====
    # 允许远程访问
    bind-address            = 0.0.0.0                  
    port                    = 3306
    # 禁用DNS解析(提升性能)
    #注意,MHA使用DNS解析的主机名登录,一定不能开启
    #skip_name_resolve       = ON 
    # 连接数量调优
    max_connections         = 1000
    
    # ===== 其他MHA要求配置 =====
    # 将中继日志信息存储到表中(提高可靠性)
    #relay_log_info_repository = TABLE                   
    #master_info_repository  = TABLE
    # MHA用于节点识别(指定master的IP,可用于主机名解析存在问题时仍能识别)
    #report_host            = 192.168.179.111              
    systemctl restart mysqld
    • 每个节点需要修改server-id,保证每个节点不同
    • 主从节点需要修改read_only ,主库可写,从库只读(MHA切换时自动修改read_only)
    • innodb_flush_log_at_trx_commit建议修改
    • 经测试,从节点不能开启super_read_only,MHA在主从切换时不会修改这个参数

    6.实现一主二从
    两个从节点执行

    mysql -uroot -p'MyStr0ngP@ssw0rd!'
    CHANGE MASTER TO
    MASTER_HOST='T1',
    MASTER_USER='mha',
    MASTER_PASSWORD='1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n',
    MASTER_AUTO_POSITION = 1;
    
    STOP SLAVE;
    START SLAVE;
    SHOW SLAVE STATUS\G; 

    保证IO与SQL线程都启动了,一般IO线程出问题是master节点的问题,SQL线程出问题都是slave节点的问题

    7.测试主从
    master节点

    mysql -uroot -p'MyStr0ngP@ssw0rd!'
    create database test;
    show databases;

    slave节点

    show databases;


    master节点

    #删除测试数据库
    drop database test;

    8.下载MHA-node节点并安装(mysql的所有节点)

    #依赖(每个节点都需要安装)
    yum install -y perl-DBD-MySQL
    #下载(rpm版)
    wget  https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
    #本地安装(rpm)
    yum localinstall -y mha4mysql-node-0.58-0.el7.centos.noarch.rpm

    9.链接(mysql的所有节点)

    #将mysql链接到/usr/bin内,mysqlbinlog链接到/usr/local/bin,否则mha报错(但是这个我并没有验证)
    #由于是rpm安装的,所以mysql已经链接了
    ln -s /usr/bin/mysqlbinlog  /usr/local/bin/mysqlbinlog

    10.安装MHA-manage(非master的任意一个节点,此处为T2节点)

    #安装依赖
    yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
    #下载(rpm)
    wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
    #提示,安装MHA的manage的前提是该节点已经安装MHA的客户端(node)
    yum localinstall -y mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

    mha-master节点上也要安装mha-node

    11.配置MHA-master

    mkdir -p /app/tools/masterha/manager
    #该文件需要自己创建,mha启动需要
    vim /etc/masterha_default.cnf
    manager_workdir=/app/tools/masterha/manager
    remote_workdir=/tmp
    #manager_workdir为mha工作目录
    #remote_workdir放置保留的binlog或relaylog
    mkdir -p /app/tools/masterha/app1
    vim /app/tools/masterha/app1.cnf
    
    [server default]
    manager_log= /app/tools/masterha/app1/app.log
    #mysql监控用户和密码(用于)
    user=monmha
    password='!@#$%^&[]{O2p'
    #mysql复制账户和密码
    repl_user=mha
    repl_password='1U@1UK6$1UK6%5n5*}\9M1UK69M5n5n'
    #可创建专门的用户用于连接,需要配置登录从节点密钥,这里直接使用root
    ssh_user=root
    #主库binlog日志位置(master节点上)
    master_binlog_dir=/var/lib/mysql
    
    #工作目录
    manager_workdir=/app/tools/masterha/app1
    remote_workdir=/tmp/mha
    
    ping_interval=3
    #故障切换脚本(最后再添加)
    #master_ip_failover_script= /app/tools/masterha/app1/master_ip_failover
    #master_ip_online_change_script= /app/tools/masterha/app1/master_ip_online_change
    
    #server1为当前master
    [server1]
    hostname=192.168.56.191
    port=3306
    
    [server2]
    hostname=192.168.56.192
    port=3306
    
    [server3]
    hostname=192.168.56.193   
    port=3306
    #candidate_master=1 意味着强制指定为备选master

    如果是源码安装mysql需要指定master_binlog_dir为安装目录下的binlog目录

    12.检查测试mha

    #测试ssh连接,不通过就是没有配置免密登录
    masterha_check_ssh --conf=/app/tools/masterha/app1.cnf
    
    #测试主从复制
    masterha_check_repl --conf=/app/tools/masterha/app1.cnf


    13.启动

    nohup masterha_manager  --conf=/app/tools/masterha/app1.cnf &>/app/tools/masterha/app1/manager.log &

    14.检查

    cat  /app/tools/masterha/app1/manager.log

    15.测试

    #停止master
    systemctl stop mysqld

    T2节点切换T3节点为master,T3节点成为master节点

    错误

    1.MySQL拒绝连接

    • 报错

      masterha_check_repl --conf=/app/tools/masterha/app1.cnf

    • 原因
      经多次测试,发现MHA使用的是主机名连接,必须配置使用主机名连接而不是直接使用IP连接
    • 解决

      • 配置指定主机授权mysql用户(参考步骤4)
      • 配置本地解析(参考步骤1)
      • 一定要关闭配置中的skip_name_resolve,如果开启,即使配置了指定主机授权MHA也无法登录mysql

    2.master的GTID模式未开启

    • 报错

      show slave status\G;

    • 原因
      master上的GTID模式的注释没有解除
    • 解决

      • 修改master节点配置文件,然后重启

        vim /etc/my.cnf
        
        GTID_MODE=ON
        
        systemctl restart mysqld
      • 临时修改master节点的GTID

        SET GLOBAL GTID_MODE=ON;
      • 如果重启出现错误(请先排查配置文件问题),那可能需要删库
        危险操作,只能在刚开始配的时候使用

        #删除日志与数据,如果配置文件中被修改,删除的位置也需要修改
        rm -rf /var/lib/mysql/*
        rm -f /var/log/mysqld.log
    本文著作权归作者 [ wymm ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    取消回复

    发表留言
    回复

    Copyright©2026  All Rights Reserved.  Load:0.017 s
    Theme by OneBlog V3.6.5
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。