MySQL主从复制: MHA

                MySQL主从复制: MHA


前言

上篇文章我们实现了MySQL的主从复制, 但是我们之前就说过, 主从复制是有很多问题的, 我们这篇文章为大家介绍一如何使用MHA来实现MySQL复制集群的高可用

MHA的架构

MHA (Master HA) 实现MySQL主从复制主节点高可用 , 主要实现了

  • Automated master monitoring and failover 自主监控和故障转移

  • Interactive (manual) Master Failover 手动故障转移

  • Non-interactive master failover 非交互式故障转移

  • Online switching master to a different host 在线切换到新主机

项目地址 Google Code

MHA服务有两种角色, 完成相应的功能

  • MHA Master(管理节点)

  • MHA Slave(数据节点)

    MHA Manager通常单独部署在单台主机上 , 用来管理多个Master/Slave集群, 每个集群通常被称为Application 
    MHA Slave通常部署在单台MySQL服务器上, 通过监控和具有解析和清理log功能的脚本来加快故障转移

    MySQL主从复制: MHA

  • MySQL主节点故障时, 按下面的步骤进行转移 

    MySQL主从复制: MHA

MHA的各组件

Manager节点的组件

  • masterha_check_ssh: MHA依赖的SSH环境检测工具

  • masterha_repl: MySQL复制环境检测工具

  • masterha_manager: MHA 服务主程序

  • masterha_check_status: MySQL master节点可用性检测工具

  • masterha_conf_host: 添加或删除配置的节点

  • masterha_stop: 关闭MHA服务的工具

Node节点的组件

  • save_binary_logs: 保存和复制master的二进制日志

  • apply_diff_relay_logs: 识别差异的中继日志应用于于其他slave

  • filter_mysqbinlog: 去除不必要的ROLLBACK事件(MHA已经移除这个工具)

  • purge_relay_logs: 清除中继日志(不会阻塞SQL线程)

自定义扩展组件

  • secondary_check_script: 通过多条网络路由检测master可用性

  • master_ip_failover_script: 更新application使用的masterip

  • shutdown_script: 强制关闭master节点

  • report_script: 发送报告

  • init_conf_load_script: 加载初始配置参数

  • master_ip_online_change_script: 更新master节点ip地址

环境部署

实验环境

节点 IP 功用
node1 172.16.1.2 Master Node
node2 172.16.1.3 Slave Node/Master Node
node3 172.16.1.4 Slave Node
node4 172.16.1.5 Manager Node

实验拓扑

当主节点宕机后, node2节点自动替代成为主节点

blob.png

软件版本

MHA下载地址

软件 版本
MySQL 5.1
MHA_Manager 0.56
MHA_Node 0.54

实验步骤

安装配置mysql

[root@node1 ~]# yum install mysql-server -y
[root@node2 ~]# yum install mysql-server -y
[root@node3 ~]# yum install mysql-server -y
[root@node4 ~]# yum install mysql-server -y

mysql_master_node配置文件

这里不对配置进行过多解释,有兴趣可以看我上篇文章

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table = 1
log-bin=master-log
log-bin-index=1
server_id=1
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

master_slave_node配置文件

我们这里只展示一个节点的配置文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
innodb_file_per_table = 1
log-bin = master-log
log-bin-index = 1
relay-log = relay-log
read_only = 1
server_id=2    #每个从服务器要使用不同的
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

配置主从

MySQL Master节点配置

我们需要创建一个super权限的用户给MHA_Manager管理来控制各节点

mysql> SHOW MASTER STATUS;  #一定要在创建用户前查看并记下POS数值
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000003 |      106 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'rpuser'@'%' IDENTIFIED BY 'passwd';

Query OK, 0 rows affected (0.00 sec)

ENTFIED BY 'passwd'' at line 1mysql> GRANT ALL ON *.* TO 'mhauser'@'%' IDENTIFIED BY 'passwd';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

MySQL Slave节点配置

mysql> CHANGE MASTER TO 
   -> MASTER_HOST='172.16.1.2',
   -> MASTER_USER='rpuser',
   -> MASTER_PASSWORD='passwd',
   -> MASTER_LOG_FILE='master-log.000003',
   -> MASTER_LOG_POS=106;

Query OK, 0 rows affected (0.03 sec)

mysql> START SLAVE;    #启动slave
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW SLAVE STATUS\G;  #查看slave-IO和slave-SQL是否为YES
   Master_Host: 172.16.1.2
   Master_User: rpuser
   Master_Port: 3306
   Connect_Retry: 60
   Master_Log_File: master-log.000003
   Read_Master_Log_Pos: 476
   Relay_Log_File: relay-log.000002
   Relay_Log_Pos: 622
   Relay_Master_Log_File: master-log.000003
   Slave_IO_Running: Yes
   Slave_SQL_Running: Yes

配置MHA

配置前提

我们需要配置每一台主机之间能够互信

每台主机互信配置

我们这里使用一个非常简便的方法来实现

生成密钥后, 复制到各节点主机
[root@node4 ~]# ssh-keygen -P '' -t rsa -f /root/.ssh/id_rsa #在node4生成密钥
[root@node4 ~]# cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node1.anyisalin.com:/root/.ssh/
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node2.anyisalin.com:/root/.ssh/
[root@node4 ~]# scp /root/.ssh/{id_rsa,authorized_keys} node3.anyisalin.com:/root/.ssh/

安装MHA

[root@node4 ~]# yum localinstall mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.54-0.el6.noarch.rpm  #在manager节点上安装这两个包

#在各个node节点安装mha_node
[root@node2 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
[root@node3 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm
[root@node4 ~]# yum localinstall mha4mysql-node-0.54-0.el6.noarch.rpm

创建配置文件

[root@node4 ~]# vim /etc/mha.cnf

   [server default]
   user=mhauser
   password=passwd
   manager_workdir=/data/masterha/app1    
   manager_log=/data/masterha/app1/manager.log
   remote_workdir=/data/masterha/app1
   ssh_user=root
   repl_user=rpuser
   repl_password=passwd
   ping_interval=1

   [server1]
   hostname=172.16.1.2
   candidate_master=1

   [server2]
   hostname=172.16.1.3
   candidate_master=1

   [server3]
   hostname=172.16.1.4

检查环境

启动Masterha前使用自带的检测工具检查一下环境

[root@node4 ~]# masterha_check_ssh --conf=/etc/mha.cnf  #检查ssh, --conf指定配置文件

#最后出现以下字段代表成功
Thu Apr 28 19:02:05 2016 - [info] All SSH connection tests passed successfully.

[root@node4 ~]# masterha_check_repl --conf=/etc/mha.cnf  #检查主从复制

#最后出现以下字段代表成功
MySQL Replication Health is OK.

启动MHA

nohup masterha_manager --conf=/etc/mha.cnf  &> /data/masterha/app1/manager.log  &
# 指定配置文件并且放进程在后台运、剥离与终端的关系

测试故障转移

[root@node4 ~]# masterha_check_status --conf /etc/mha.cnf   #当前主节点为node1
mha (pid:2573) is running(0:PING_OK), master:172.16.1.2

[root@node1 ~]# service mysqld stop  #手动停止主节点

[root@node3 ~]# mysql
mysql> SHOW SLAVE STATUS\G;
 

   Slave_IO_State: Waiting for master to send event
   Master_Host: 172.16.1.3  #已经转换为node2
   Master_User: rpuser
   Master_Port: 3306
   Connect_Retry: 60
   Master_Log_File: master-log.000006
   Read_Master_Log_Pos: 106
   Relay_Log_File: relay-log.000004
   Relay_Log_Pos: 252
   Relay_Master_Log_File: master-log.000006


[root@node2 ~]# mysql
mysql> SHOW GLOBAL VARIABLES LIKE '%read_only%';    #查看, read_only被MHA关闭了
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only     | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

总结

其实我们这套架构不够完整, 如果要投入生产环境使用还需要提供一个自动切换VIP的脚本, 前端使用MySQL专用的读写分离器进行调度, 但是由于时间原因. 这里又不做更多的叙述了, 大家能够知道基本用法相比那些也就是小意思

作者水平很低, 如果有错误及时指出, 如果你觉得本文写的好请点一波赞~(≧▽≦)/~ 
作者: AnyISaIln QQ: 1449472454 
感谢: MageEdu

原创文章,作者:Net18-AnyISalIn,如若转载,请注明出处:http://www.178linux.com/15698

(0)
Net18-AnyISalInNet18-AnyISalIn
上一篇 2016-04-28 14:58
下一篇 2016-04-28 21:37

相关推荐

  • 如何在Linux系统上获取命令的帮助信息

    如何获取命令帮助信息:    1、内建命令可以通过help COMMAND    2、外部命令可以通过man手册获取帮助,COMMAND –help man命令的分段机制:      1-8:        …

    Linux干货 2016-10-30
  • Linux基础介绍

    1、Linux用户: Linux用户分为普通用户和管理员,普通用户的系统操作权限低,用户的误操作对系统数据的破坏程度有限,不会对系统造成灾难性的破坏。而管理员对系统具有绝对的权限,可以修改和设置系统的任何数据,如果误操作,及其容易对系统数据造成不可挽回的破坏,比如执行以下命令 rm  -rf  / 。因此,系统管理员在操作root用户时需…

    Linux干货 2016-07-26
  • ansible进阶(roles应用)

    ansible 进阶 一、roles简介 一个项目从开始到结束,不是简单几十个playbook就可以完事了,当文件数很多,有上百个的话,仅通过简单的includes不停的引用,那最终的结果错综复杂。这个时候ansible roles就可以很好的发挥它的作用了。 roles,字面意思是角色的含义,可以理解为有相互关联功能的集合。我们把安装ntp、mem、ngi…

    2017-01-05
  • 搭建lnmp实现动静分离

    LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。 (nginx主机)web 处理静态内容 172.16.250.149 (fpm server   mariad bserver)处理动态内容 172.16.253.131 以上为两台CentOS7.3主机 试验拓扑图如下:   ==…

    2017-07-22
  • 计算机操作系统与简单命令

    计算机系统的组成 硬件:主机(cpu、内存等),外部设备(输入设备键盘鼠标、输出设备显示屏;硬软盘   等等)。 软件:主要由操作系统和应用程序构成。 计算机硬件的组成部分及工作流程图 输入设备——存储器——CPU运算——输出设备   服务器主要分类有: 塔式服务器:立式PC相像 机架式服务器:统一标准宽度19英寸(48.26c…

    Linux干货 2017-02-14
  • 博客

       这是我的第一篇博客!   平时学习中,总会遇到或大或小的问题,以及一些新的感悟,在当时能够十分清晰记得,但过一些时日,便发现又忘记了。以前十分明白的东西,又变得有些模糊,甚至完全忘记。因此特别需要记录下来,方便日后的查阅或分享给其他遇到类似问题的朋友。    如果以后忘记的某些知识,这时候,翻开以往博客…

    Linux干货 2017-07-11