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,都可以传到备库并被正确执行,备库就能跟主库一致的状态, ...
随机推荐
- BZOJ 4128: Matrix
BZOJ 4128: Matrix 标签(空格分隔): OI BZOJ 大步小步 矩阵 费马小定理 Time Limit: 10 Sec Memory Limit: 128 MB Descriptio ...
- 实现带查询功能的ComboBox控件
实现效果: 知识运用: ComboBox控件的AutoCompleteMode属性 public AutoCompleteMode AutoCompleteMode{get;set;} //属性值为枚 ...
- GMap.Net解决方案之在WinForm和WPF中使用GMap.Net地图插件的开发
在做地理位置相关的开发时,总是面临高额地图引擎费用让大部分用户望而却步,加之地图数据又是天价,那么GMap.NET就是首选了,它本身就是开源免费,服务器可以在本地缓存,以后访问时就可以直接访问. 可以 ...
- iOS 控制section不悬停 --- iOS开发系列 ---项目中成长的知识八
一般情况下,tableview中的section是会默认不随着tableview的滚动而滚动的,而是会等到属于这个section的cell滑完过后,然后往上顶(不知道大家能不能听懂=_=!) 有些时候 ...
- vue框架初学习的基本指令
学习地址:<ahref="https: cn.vuejs.="" org="" "="" targe ...
- linux常用指令学习记录
前言 本文主要为学习贴,用来记录一些 linux上的常用指令 以供参考. 文件内容查看 cat 从上往下阅读文件内容 cat [-AbEnTv] ${FILE_NAME) cat -n /etc/is ...
- 精读《Epitath 源码 - renderProps 新用法》
1 引言 很高兴这一期的话题是由 epitath 的作者 grsabreu 提供的. 前端发展了 20 多年,随着发展中国家越来越多的互联网从业者涌入,现在前端知识玲琅满足,概念.库也越来越多.虽然内 ...
- [原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作
[原创]使用python对视频/音频文件进行详细信息采集,并进行去重操作 转载请注明出处 一.关于为什么用pymediainfo以及pymediainfo的安装 使用python对视频/音频文件进行详 ...
- Spark MLlib(下)--机器学习库SparkMLlib实战
1.MLlib实例 1.1 聚类实例 1.1.1 算法说明 聚类(Cluster analysis)有时也被翻译为簇类,其核心任务是:将一组目标object划分为若干个簇,每个簇之间的object尽可 ...
- Android 获取当前应用的版本号+版本号比较
前言:因为项目更新的时候需要一些版本号的信息,后台返回两个string,一个是最低兼容版,一个是最新版.所以拿到数据后要比较一下,所以封装了一个Common包来处理. Step 1 废话不多说, ...