Mysql实战之高可用HMA
author:JevonWei
版权声明:原创作品
主节点高可用
MHA是一款开源的MySQL的高可用程序,他为MySQL主从复制架构提供了automating master failover功能。MHA在监控到master节点故障时,会提升
其中拥有最新数据的slave节点成为新的master节点。在此期间,MHA会通过其他从节点获取额外信息来避免一致性方面的额问题。MHA还提供了master
节点切换功能,即按需切master/slave节点
MHA服务有两种角色,MHA Manager(管理节点)和HMA Node(数据节点)
MHA Manager:通常部署在一台独立机器上管理多个master/slave集群,每个master/slave集群称作一个application;
MHA node:运行在每台MySQL服务器上(master/slave/manager),他通过监控具备解析和清理logs功能的脚本来加快故障转移。
MHA组件
Manager节点
-masterha_check_ssh:MHA依赖的SSH环境检测工具
-masterha_check_repl:MySQL复制环境检测工具
-masterha_manager:MHA服务主程序
-masterha_check_status:MHA运行状态检测工具
-masterha_master_monitor:MySQL master节点可用性检测工具
-masterha_master_switch:master节点切换工具
-masterha_conf_host:添加或删除配置节点
-masterha_stop:关闭MHA服务的工具
Node节点
-save_binary_logs:保存和复制master的二进制日志
-apply_diff_relay_logs:识别差异的中继日志事件并应用于其他slave
-filter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已不在使用这个工具)
-purge_relay_logs:清除中继日志(不会阻塞SQL线程)
自定义扩展
-sccondary_check_script:通过多条网络路由检测master的可用性
-master_ip_failover_script:更新application使用的masterrip
-shutdown_script:强制关闭master节点
-report_script:发送报告
-init_conf_load_script:加载初始化配置参数
-master_ip_online_change_script:更新master节点ip地址
构建高可用HMA架构
节点角色
mysql-master 172.16.252.82
mysql-slave1 172.16.252.92
mysql-slave2 172.16.252.100
manager 172.16.252.67
配置各节点之间可以通过主机名通信
[root@manager ~]# vim /etc/hosts
172.16.252.82 mysql-master
172.16.252.92 mysql-slave1
172.16.252.100 mysql-slave2
172.16.252.67 manager
其他各主机依次配置主机名解析文件
mysql-master
[root@mysql-master ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 1
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
[root@mysql-master ~]# systemctl start mariadb
[root@mysql-master ~]# mysql
授权一个有权限做主从复制的用户
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
MariaDB [(none)]> FLUSH PRIVILEGES;
查看master节点的状态,记录二进制文件的位置信息,用于从节点的复制起点
MariaDB [(none)]> SHOW MASTER STATUS;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-log.000001 | 501 | | |
+-------------------+----------+--------------+------------------+
mysql-slave1
[root@mysql-slave1 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 2
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
read_only = ON
relay_log_purge = OFF
[root@mysql-slave1 ~]# systemctl start mariadb
[root@mysql-slave ~]# mysql
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'read_only'; \\查看数据库为只读
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
连接主节点数据库
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.198.139',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=501;
启动从节点复制进程
MariaDB [(none)]> START SLAVE;
查看SLAVE节点的状态
MariaDB [(none)]> SHOW SLAVE STATUS\G;
连接manager的用户
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
mysql-slave2
root@mysql-slave2 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
server_id = 3
relay-log = relay-log
log-bin = master-log
skip_name_resolve = ON
innodb_file_per_table = ON
read_only = ON
relay_log_purge = OFF
[root@mysql-slave2 ~]# systemctl start mariadb
[root@mysql-slave ~]# mysql
MariaDB [mydb]> SHOW GLOBAL VARIABLES LIKE 'read_only'; \\查看数据库为只读
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| read_only | ON |
+---------------+-------+
连接主节点数据库
MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.198.139',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_LOG_FILE='master-log.000001',MASTER_LOG_POS=501;
启动从节点复制进程
MariaDB [(none)]> START SLAVE;
查看SLAVE节点的状态
MariaDB [(none)]> SHOW SLAVE STATUS\G;
连接manager的用户
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
mysql-master(master/slave上都需有此用户权限来连接manager)
MariaDB [(none)]> GRANT ALL ON *.* TO 'mha'@'172.16.%.%' IDENTIFIED BY 'mhapass';
MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'172.16.%.%' IDENTIFIED BY 'replpass';
MHA安装
github官网下载manager到本地
[root@manager ~]# ls mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
[root@manager ~]# yum install ./mha4mysql-* 安装MHA程序包
复制mha4mysql-node-0.56-0.el6.noarch.rpm程序包到各节点上
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-master:/root
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-slave1:/root
[root@manager ~]# scp mha4mysql-node-0.56-0.el6.noarch.rpm mysql-slave2:/root
mysql-master、mysql-slave1和mysql-slave2节点依次安装mha4mysql-node-0.56-0.el6.noarch.rpm程序包
[root@mysql-master ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mysql-slave1 ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
[root@mysql-slave2 ~]# yum -y install ./mha4mysql-node-0.56-0.el6.noarch.rpm
配置各节点之间SSH互信的通信环境
HMA
[root@manager ~]# ssh-keygen -t rsa -P '' 生成ssh秘钥文件
[root@manager ~]# ssh-copy-id -i .ssh/id_rsa.pub root@manager
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@mysql-master:/root/.ssh
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@mysql-slave1:/root/.ssh
[root@manager ~]# scp -p .ssh/id_rsa .ssh/authorized_keys root@mysql-slave2:/root/.ssh
[root@mysql-master ~]# ssh -o StrictHostKeyChecking=no mysql-slave1 直接连接mysql-slave主机,无询问,无提示
初始化HMA
manager
[root@manager ~]# mkdir /data/masterha
[root@manager ~]# mkdir /data/masterha/app
[root@manager ~]# mkdir /etc/masterha
[root@manager ~]# vim /etc/masterha/app.cnf
[server default]
user=mha
password=mhapass \\node节点连接manager的用户
manager_workdir=/data/masterha/app
manager_log=/data/masterha/app/manager.log
remote_workdir=/data/masterha/app
ssh_user=root
repl_user=repluser
repl_password=replpass
ping_interval=1
[server1]
hostname=172.16.252.82
candidate_master=1
[server2]
hostname=172.16.252.92
candidate_master=1
[server3]
hostname=172.16.252.100
candidate_master=1
测试后端主机的SSH连接
[root@manager ~]# masterha_check_ssh --conf=/etc/masterha/app.cnf
测试后端主机的集群
[root@manager ~]# masterha_check_repl --conf=/etc/masterha/app.cnf
测试运行HMA程序
[root@manager ~]# masterha_manager --conf=/etc/masterha/app.cnf
查看HMA集群的状态
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app.cnf
Mysql实战之高可用HMA的更多相关文章
- MySQL数据库的优化(下)MySQL数据库的高可用架构方案
MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...
- mysql数据库的高可用方法总结
高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一 些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无 ...
- 浅谈mysql主从复制的高可用解决方案
1.熟悉几个组件(部分摘自网络)1.1.drbd —— DRBD(Distributed Replicated Block Device),DRBD号称是 "网络 RAID" ...
- MySQL集群(四)之keepalived实现mysql双主高可用
前面大家介绍了主从.主主复制以及他们的中间件mysql-proxy的使用,这一篇给大家介绍的是keepalived的搭建与使用! 一.keepalived简介 1.1.keepalived介绍 Kee ...
- MySQL系列:高可用架构之MHA
前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...
- MySQL数据库的高可用方案总结
高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...
- MySQL的keepalived高可用监控脚本
MySQL的keepalived高可用监控脚本 MySQL(或者其它服务)的keepalived高可用监控脚本 开发脚本需求 :我们知道,keepalive是基于虚拟ip的存活来判断是否抢占maste ...
- mysql-master-ha 实现mysql master的高可用。
常用的mysql 高可用有下面几种方案: 名称 原理 特点 mysqlmha Perl脚本对mysql master做心跳,master down了以后,选举new master ,是要改代理层的 ...
- 25 mysql怎么保证高可用
上一篇介绍了binlog的基本内容,在主备关系中,是每个备库接收主库的binlog并执行. 正常情况下,只要主库执行更新生成的所有的binlog,都可以传到备库并被正确执行,备库就能跟主库一致的状态, ...
随机推荐
- swift 命名空间实现的设计思考:extension YKKit where Base == String
设计问题:谁来构造.构造什么.怎么添加新功能 关键词:本体.客体.构造.映射.功能. 别名:桥接变量.型变变量.容器变量.适配变量,构造变量: 目的:添加命名空间.添加新功能. 原则:不修改本体的实现 ...
- NOIP2018赛前停课集训记(10.24~11.08)
前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...
- AJAXA进行分页(2)
查询功能是开发中最重要的一个功能,大量数据的显示,我们用的最多的就是分页. 在ASP.NET 中有很多数据展现的控件,比如用的最多的GridView,它同时也自带了分页的功能.但是我们知道用GridV ...
- mysql添加、移除服务
sc delete 服务名 路径/bin/mysqld --install 服务名
- JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法
servlet层中的代码如下: package com.swift.jztk.servlet; import java.io.IOException; import javax.servlet.Ser ...
- docker部署Ceph分布式存储集群
1.环境准备 3台virtualbox虚拟机,用来安装ceph集群,已用docker-machine安装上了docker,每台虚拟机虚拟创建一个5G的硬盘,用于存储osd数据,例如:/dev/sdb ...
- MySQL - RIGHT JOIN
RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行. RIGHT JOIN 关键字语 ...
- 第五篇:selenium调用IE问题(Protected Mode settings are not the same for all zones)
代码信息: driver = webdriver.Ie()driver.get('http://www.baidu.com') 问题描述: raise exception_class(message, ...
- CentOS6 x86_64最小化安装优化脚本
#!/bin/bash #centos6. x86_64系统最小化安装优化脚本 #系统基础优化,建议以root运行 if [ $USER != "root" ];then echo ...
- jQuery具体实例介绍什么时候用ajax,ajax应该在什么地方使用
网站开发时,ajax是一个非常方便的工具,它具有和表单相同的功能完成前端和后台之间的交互!它起到局部刷新的功能!那什么时候用ajax呢?下面给大家介绍几个实例,首先应该分为两类: 一.在用表单和aj ...