MySQL高可用MHA集群

MHA 简介

MHA(Master High Availability)它由日本DeNA公司youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
MHA软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

MHA工作原理

从宕机崩溃的master保存二进制日志事件(binlog events)
识别含有最新更新的slave
应用差异的中继日志(relay log)到其他的slave
应用从master保存的二进制日志事件(binlog events)
提升一个slave为新的master
使其他的slave连接新的master进行复制

MHA工具

masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 故障转移(自动或手动)
masterha_conf_host 添加或删除配置的server信息


MHA集群的搭建及恢复

环境准备:

  1. 4台centos 7主机,
    172.18.153.7做mha manage主机
    172.18.153.17做MySQL master主机
    172.18.153.27做MySQL slave1主机
    172.18.153.37做MySQL slave2主机
  2. mha manage服务器 安装mha4mysql-manager-0.56-0.el6.noarch.rpm和mha4mysql-node-0.56-0.el6.noarch.rpm,节点机安装mha4mysql-node-0.56-0.el6.noarch.rpm
    mha下载

实验步骤

  1. 配置时间同步

    #mha服务器上ntpServer
    [[email protected] ~]# vim /etc/ntp.conf
    restrict 127.0.0.1   #限制可以同步的主机
    restrict ::1
    restrict 172.18.153.0 mask 255.255.255.0
    server 127.127.1.0   #以该主机的时间为标准
    [[email protected] ~]#systemctl restart ntpd
    [[email protected] ~]#systemctl restart ntpd  #开机自启动
    #其他主机ntpclient
    [[email protected] ~]# vim /etc/ntp.conf
    server 172.18.153.7 iburst    #确认ntpserver
    [[email protected] ~]# ntpdate 172.18.153.7  #生效
  2. 配置ssh的等效性(免密登陆)
    #mha manage
    [[email protected] ~]# cd .ssh/
    [[email protected] .ssh]# ssh-keygen
    [[email protected] .ssh]# ssh-copy-id localhost
    [[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
    [[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
    [[email protected] ~]# rsync -rav /root/.ssh [email protected]:/root/
    #其他主机
    [[email protected] ~]# vim /etc/ssh/ssh_config
    StrictHostKeyChecking no  #ssh首次连接某主机不要询问yes|no
  3. 配置主从服务器
    #mysql master
    [[email protected] ~]#  vim /etc/my.cnf
    [mysqld]
    server_id=1
    datadir=/mysql/data
    innodb_file_per_table
    socket=/var/lib/mysql/mysql.sock
    log_bin=/mysql/logbin/master-bin
    binlog_format=row
    skip_name_resolve
    [[email protected] ~]# systemctl restart mariadb.service
    [[email protected] ~]# mysql
    MariaDB [(none)]> show master status;
    +-------------------+-----------+
    | Log_name          | File_size |
    +-------------------+-----------+
    | master-bin.000001 |       245 |
    +-------------------+-----------+
    MariaDB [(none)]> grant replication slave on *.* to [email protected]‘172.18.153.%‘ identified by ‘centos‘;
    #MySQL slave1与MySQLslave2一样
    [[email protected] ~]#  vim /etc/my.cnf
    [mysqld]
    [mysqld]
    server_id=2
    datadir=/mysql/data
    log_bin=/mysql/logbin/slave-log
    read_only=1
    relay_log_purge=0
    skip_name_resolve=1
    [[email protected] ~]# systemctl restart mariadb.service
    [[email protected] ~]# mysql
    MariaDB [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST=‘172.18.153.17‘,
    ->   MASTER_USER=‘repluser‘,
    ->   MASTER_PASSWORD=‘centos‘,
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE=‘master-bin.000001‘,
    ->   MASTER_LOG_POS=245,
    ->   MASTER_CONNECT_RETRY=10;
    MariaDB [(none)]> start slave;
    MariaDB [(none)]> show slave status\G;
  4. 配置mha
    #mha manage安装mha manage 和mha node
    [[email protected] ~]# yum -y localinstall mha4mysql-*   #安装软件
    #其他主机安装mha node
    [[email protected] ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
    #mha managae
    [[email protected] ~]# mysql
    MariaDB [(none)]> grant all on *.* to [email protected]‘172.18.153.%‘ identified by ‘centos‘;
    [[email protected] ~]# mkdir /etc/mha
    [[email protected] ~]# vim /etc/mha/app1.conf
    [server default]
    user=mhauser
    password=centos
    manager_workdir=/data/mastermha/app1/
    manager_log=/data/mastermha/app1/manager.log
    master_binlog_dir=/mysql/logbin
    remote_workdir=/data/mastermha/app1/
    ssh_user=root
    repl_user=repluser
    repl_password=centos
    ping_interval=1
    [server1]
    hostname=172.18.153.17
    candidate_master=1
    [server2]
    hostname=172.18.153.27
    candidate_master=1
    [server3]
    hostname=172.18.153.37

    mha 参数说明:

    hostname

    配置MySQL服务器的机器名或是IP地址,这个配置项是必须的,而且只能配置在[server_xxx]这个块下面。

    candidate_master

    这个参数的作用是当设计candidate_master = 1时,这个服务器有较高的优先级提升为新的master(还要具备: 开启binlog, 复制没有延迟)。 所以当设置了candidate_master = 1的机器在master故障时必然成为新的master. 但这是很有用的设置优先级的一个参数。
    如果设置了多台机器的caddidate_master = 1 , 优先策略依赖于块名字([server_xxx]). [server_1] 优衔权高于[server_2].

    user

    用于管理MySQL的用户名。这个最后需要root用户,因为它需要执行:stop slave; change master to , reset slave.

    password

    MySQL的管理用户的密码

    repl_user

    MySQL用于复制的用户,也是用于生成CHANGE MASTER TO 每个slave使用的用户。 这个用户必须有REPLICATION SLAVE权限在新的Master上。

    master_binlog_dir

    master上用于存储binary日志的全路径。这个参数用于当master上mysql死掉后,通过ssh连到mysql服务器上,找到需要binary日志事件

    manager_workdir

    用于指定mha manager产生相关状态文件全路径。 如果没设置 默认是/var/tmp

    manager_log

    指定mha manager的绝对路径的文件名日志文件

    ping_interval

    这个参数设置MHA Manager多长时间去ping一下master(执行一些SQL语句). 当失去和master三次偿试,MHA Manager会认为MySQL Master死掉了。也就是说,最大的故障切换时间是4次ping_interval的时间,默认是3秒。

    remote_workdir

    用于指定mha node产生相关状态文件全路径

  5. 检查mha
    #mha manage
    [[email protected] ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
    [[email protected] ~]# masterha_check_repl --conf=/etc/mha/app1.conf
  6. 运行mha
    #mha manage
    [[email protected] ~]# nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log &  #放到后端运行,把运行结果放到文件里,检测文件
  7. 模拟故障,直接关掉mysql master
    #mha manage上,监控日志文件,MySQL master 关闭以后日志文件立马刷新
    [[email protected] ~]# tailf /data/mastermha/app1/manager.log
    Started automated(non-interactive) failover.
    The latest slave 172.18.153.27(172.18.153.27:3306) has all relay logs for recovery.
    Selected 172.18.153.27(172.18.153.27:3306) as a new master.
    172.18.153.27(172.18.153.27:3306): OK: Applying all logs succeeded.
    172.18.153.37(172.18.153.37:3306): This host has the latest relay log events.
    Generating relay diff files from the latest slave succeeded.
    172.18.153.37(172.18.153.37:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.18.153.27(172.18.153.27:3306)
    172.18.153.27(172.18.153.27:3306): Resetting slave info succeeded.
    Master failover to 172.18.153.27(172.18.153.27:3306) completed successfully.
    [[email protected] ~]# tailf mharun.log
    Tue Oct 16 20:10:15 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
    Tue Oct 16 20:10:15 2018 - [info] Reading application default configuration from /etc/mha/app1.conf..
    Tue Oct 16 20:10:15 2018 - [info] Reading server configuration from /etc/mha/app1.conf..
    Tue Oct 16 20:15:12 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
    Tue Oct 16 20:15:12 2018 - [info] Reading application default configuration from /etc/mha/app1.conf..
    Tue Oct 16 20:15:12 2018 - [info] Reading server configuration from /etc/mha/app1.conf..
  8. 在切换成功后,再开启旧的主,将旧的主设置为从。
    [[email protected] ~]# vim /etc/my.cnf #增加两行配置
    [mysqld]
    read_only=ON
    relay_log_purge=0
    [[email protected] ~]# systemctl restart mariadb.service
    [[email protected] ~]# mysql
    Master [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST=‘172.18.153.27‘,
    ->   MASTER_USER=‘repluser‘,
    ->   MASTER_PASSWORD=‘centos‘,
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE=‘slave-log.000003‘,
    ->   MASTER_LOG_POS=245,
    ->   MASTER_CONNECT_RETRY=10;
    Master [(none)]> start slave;
    Master [(none)]> show slave status\G;
  9. 完成了mha数据库集群搭建和MySQL主从数据库破坏后的恢复。

    错误解决

错误1:检查数据库复制情况的时候报错
Mon Jun 29 18:02:41 2015 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln255] Got MySQL error when connecting 192.168.0.4(192.168.0.4:3306) :1045:Access denied for user ‘monitor‘@‘192.168.0.4‘ (using password: YES), but this is not mysql crash. Check MySQL server settings.
解决方法:所有数据库节点都要创建监控用户,监控用户必须要
只在master上创建监控用户:但是会被复制,在MySQL主从服务器中执行
grant all on . to [email protected]‘172.18.153.%‘ identified by ‘centos‘;
错误2:检查数据库复制情况的时候报错
Tue Oct 16 20:06:17 2018 - [error][/usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm, ln122] Got error when getting nod
Tue Oct 16 20:06:17 2018 - [error][/usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm, ln123]
bash: apply_diff_relay_logs: command not found
Tue Oct 16 20:06:17 2018 - [error][/usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm, ln150] node version on 172.18.153age installed ?
at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm line 374.
Tue Oct 16 20:06:17 2018 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln424] Error happened on checki on 172.18.153.27 not found! Is MHA Node package installed ?
at /usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm line 374.
...propagated at /usr/share/perl5/vendor_perl/MHA/ManagerUtil.pm line 151.
Tue Oct 16 20:06:17 2018 - [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln523] Error happened on monito
Tue Oct 16 20:06:17 2018 - [info] Got exit code 1 (Not master dead).
MySQL Replication Health is NOT OK!
解决方法:你的mha node服务器中没有检测到mha4mysql-node,重新安装即可,yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
错误3:检查数据库复制情况的时候报错
Mon Apr 13 20:02:15 2015 - [warning] relay_log_purge=0 is not set on slave vdbsrv2(172.16.16.12:3306).
解决方法:在MySQL从服务器上mysql -e ‘set global relay_log_purge=0‘
relay_log_purge:是否自动清空不再需要中继日志时。默认值为1(启用)。

原文地址:http://blog.51cto.com/13805636/2301083

时间: 2024-10-09 14:24:47

MySQL高可用MHA集群的相关文章

Redis高可用复制集群实现

redis简单介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库.Redis 与其他 key - value 缓存产品有以下三个特点: 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用. 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储. 支持数据的备份,即master-slave模式的数据备份. Redis的持久化 RDB:snapshotting 二进制格式:按

搭建高可用mongodb集群(四)—— 分片(经典)

转自:http://www.lanceyan.com/tech/arch/mongodb_shard1.html 按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么

高可用RabbitMQ集群安装配置

RabbitMQ集群安装配置+HAproxy+Keepalived高可用 rabbitmq 集群 消息队列 RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主

搭建高可用mongodb集群—— 分片

从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图: 上图中有个TDDL,是taobao的一

搭建高可用mongodb集群(四)—— 分片

转载自LANCEYAN.COM 按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句

搭建高可用mongodb集群(三)—— 深入副本集内部机制

http://www.lanceyan.com/tech/mongodb_repset2.html 在上一篇文章<搭建高可用mongodb集群(二)—— 副本集> 介绍了副本集的配置,这篇文章深入研究一下副本集的内部机制.还是带着副本集的问题来看吧! 副本集故障转移,主节点是如何选举的?能否手动干涉下架某一台主节点. 官方说副本集数量最好是奇数,为什么? mongodb副本集是如何同步的?如果同步不及时会出现什么情况?会不会出现不一致性? mongodb的故障转移会不会无故自动发生?什么条件会

搭建高可用mongodb集群(一)——配置mongodb

搭建高可用mongodb集群(一)--配置mongodb 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病. 高性能,Nosql通过简单的key-value方式获取数据,非常快速.还有N

搭建高可用MongoDB集群(四):分片

按照上一节中<搭建高可用mongodb集群(三)-- 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!"分片"就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而

【转】搭建高可用mongodb集群(四)—— 分片

按照上一节中<搭建高可用mongodb集群(三)—— 深入副本集>搭建后还有两个问题没有解决: 从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚