赞
踩
MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节点故障时,会提升其中拥有最新数据的 slave 节点成为新的master 节点,在此期间, MHA 会通过于其它从节点获取额外信息来避免一致性方面的问题。MHA 还提供了 master 节点的在线切换功能,即按需切换 master/slave 节点。MHA 是由日本人 yoshinorim(原就职于DeNA现就职于FaceBook)开发的 比较成熟的MySQL 高可用方案。MHA 能够在30秒内实现故障切换,并能在故障切换中,最大可能的保证数据一致性。目前淘宝也正在开发相似产品 TMHA, 目前已支持一主一从。
Manager节点:masterha_check_ssh :MHA 依赖的 ssh 环境监测工具;masterha_check_repl :MYSQL 复制环境检测工具;masterga_manager :MHA 服务主程序;masterha_check_status :MHA 运行状态探测工具;masterha_master_monitor :MYSQL master 节点可用性监测工具;masterha_master_swith:master :节点切换工具;masterha_conf_host :添加或删除配置的节点;masterha_stop :关闭 MHA 服务的工具。Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)save_binary_logs :保存和复制 master 的二进制日志;apply_diff_relay_logs :识别差异的中继日志事件并应用于其他 slave;purge_relay_logs :清除中继日志(不会阻塞 SQL 线程);自定义扩展:secondary_check_script :通过多条网络路由检测master的可用性;master_ip_failover_script :更新application使用的masterip;report_script :发送报告;init_conf_load_script :加载初始配置参数;master_ip_online_change_script ;更新master节点ip地址。
Manager节点:masterha_check_ssh :MHA 依赖的 ssh 环境监测工具;masterha_check_repl :MYSQL 复制环境检测工具;masterga_manager :MHA 服务主程序;masterha_check_status :MHA 运行状态探测工具;masterha_master_monitor :MYSQL master 节点可用性监测工具;masterha_master_swith:master :节点切换工具;masterha_conf_host :添加或删除配置的节点;masterha_stop :关闭 MHA 服务的工具。Node节点:(这些工具通常由MHA Manager的脚本触发,无需人为操作)save_binary_logs :保存和复制 master 的二进制日志;apply_diff_relay_logs :识别差异的中继日志事件并应用于其他 slave;purge_relay_logs :清除中继日志(不会阻塞 SQL 线程);自定义扩展:secondary_check_script :通过多条网络路由检测master的可用性;master_ip_failover_script :更新application使用的masterip;report_script :发送报告;init_conf_load_script :加载初始配置参数;master_ip_online_change_script ;更新master节点ip地址。
MHA工作原理总结为以下几条:(1) 从宕机崩溃的 master 保存二进制日志事件(binlog events);(2) 识别含有最新更新的 slave ;(3) 应用差异的中继日志(relay log) 到其他 slave ;(4) 应用从 master 保存的二进制日志事件(binlog events);(5) 提升一个 slave 为新 master ;(6) 使用其他的 slave 连接新的 master 进行复制。
MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。
本次总共使用三台服务器,列表清单如下:
机器名称 | Ip配置 | 角色 | 备注 |
---|---|---|---|
node01 | 192.168.36.138 | manager控制器 | 用于监控管理 |
node02 | 192.168.36.139 | 数据库主服务 | 开启bin-log relay-log关闭relay_log_purge |
node03 | 192.168.36.140 | 数据库从服务器,可以搭建多个 | 开启bin-log relay-log关闭relay_log_purge |
192.168.36.138 node01
192.168.36.139 node02
192.168.36.140 node03
初始主节点 master 的配置
[mysqld]
#复制集群中的各节点的id均必须唯一
server-id=1
#开启binlog 开启二进制日志
log_bin=master-bin
#开启中继日志
relay-log=mysql-relay-bin
#关闭名称解析(非必须)
skip-name-resolve
#设置连接端口
port=6306
#设置mysql数据库的数据的存放目录
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.socksymbolic-links=0
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7[mysqld_safe]
log-error=/vat/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
~
docker cp mysqlMaster:/usr/lib/mysql /mydata/MHACLUSTER/lib/
docker stop MHAMaster && docker rm MHAMaster
docker run --restart=always --privileged=true \
-p 6306:6306 \
--name MHAMaster \
-v /mydata/MHACLUSTER/data:/var/lib/mysql-files \
-v /mydata/MHACLUSTER/conf/my.cnf:/etc/mysql/my.cnf \
-v /mydata/MHACLUSTER/conf/conf.d:/etc/mysql/conf.d \
-v /mydata/MHACLUSTER/logs:/var/log/mysql \
-v /mydata/MHACLUSTER/lib/mysql:/usr/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-e TZ=Asia/Shanghai \
-d mysql:8.0.28
我们修改 slave 的数据库配置文件,从节点都做如下操作:
[mysqld]
#复制集群中的各节点的id均必须唯一
server-id=2
#开启binlog 开启二进制日志
log_bin=master-bin
#开启中继日志
relay-log=mysql-relay-bin
#启用只读属性
read_only = ON
#关闭名称解析(非必须)
skip-name-resolve
#使得更新的数据写进二进制日志中
log_slave_updates = 1
#是否自动清空不再需要中继日志
relay_log_purge = 0
#设置连接端口
port=6306
#设置mysql数据库的数据的存放目录
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.socksymbolic-links=0
#允许最大连接数
max_connections=200
#允许连接失败的次数。
max_connect_errors=10
#服务端使用的字符集默认为UTF8
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7[mysqld_safe]
log-error=/vat/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
如果多个从节点,修改字段
server-id=3
mysql> grant replication slave,replication client on *.* to 'root'@'%' ;
Query OK, 0 rows affected (0.00 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
slave 节点上:
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> CHANGE MASTER TO
MASTER_HOST = 'node02' ,
MASTER_PORT =6306 ,
MASTER_USER = 'root' ,
MASTER_PASSWORD = 'root' ,
MASTER_LOG_FILE = 'master-bin.000003' ,
MASTER_LOG_POS = 157 ,
GET_MASTER_PUBLIC_KEY = 1 ;
Query OK, 0 rows affected, 10 warnings (0.01 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)mysql> show slave status\G;
在 master 上进行授权
grant all on *.* to 'admin'@'192.168.%.%' identified by 'admin';自己定义用户名 密码
[root@node02 MHACLUSTER]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rbYnr/nqds2rhBRcTIky9IoYfl9dSivxU6LIYj/2qgE root@node02
The key's randomart image is:
+---[RSA 2048]----+
| .. +o. |
| oo..o |
| . o= o o |
| . o o o O * |
| E = + S B |
| + + o + . |
| . = + .o |
| o +o+o o |
| ...+BO+... |
+----[SHA256]-----+
在所有机器上都执行完成后,在Node01下查看
scp authorized_keys root@node02:~/.ssh/scp authorized_keys root@node03:~/.ssh/
可以在机器上通过ssh验证是否不需要密码就可以连接
四个节点都需安装:mha4mysql-node-0.58-0.el7.norch.rpmManager 节点另需要安装:mha4mysql - manager - 0.58 -0.el7.noarch.rpm注意版本不一样下载的版本不一样 mha4mysql-node-0.58-0.el7.norch.rpm支持mysql5.7以上对于5.6版本的可以下载mha4mysql-node-0.56-0.el6.norch.rpm
git下载地址:https://github.com/yoshinorim/mha4mysql-manager/releases
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
使用Yum安装
上传到服务器上yum install -y mha4mysql-node-0.58-0.el7.noarch.rpmyum install -y mha4mysql-manager-0.58-0.el6.noarch.rpm
初始化MHA,进行配置
mkdir /etc/mha_mastervim /etc/mha_master/mha.cnf
配置文件内容如下;
- user=root
- password=root
- #mha_master自己的工作路径
- manager_workdir=/etc/mha_master/app1
- # mha_master自己的日志文件
- manager_log=/etc/mha_master/manager.log
- #/每个远程主机的工作目录在何处
- remote_workdir=/mydata/mha_master/app1
- master_binlog_dir=/mydata/MHACLUSTER/data/mysql
-
- #基于ssh的密钥认证
- ssh_user=root
- #数据库用户名
- repl_user=root
- #数据库密码
- repl_password=root
- #ping间隔时长
- ping_interval=1
- [server1]
- #节点2主机地址
- hostname=node02
- #端口不是3306
- port=6306
- ssh_port=22
- master_binlog_dir=/mydata/MHACLUSTER/data/mysql
- #将来可不可以成为master候选节点/主节点
- candidate_master=1
- [server2]
- hostname=node03
- ssh_port=22
- candidate_master=1
- port=6306
- master_binlog_dir=/mydata/MHACLUSTER/data/mysql
[root@node01 admin]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf
Sun May 22 15:23:15 2022 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sun May 22 15:23:15 2022 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Sun May 22 15:23:15 2022 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
Sun May 22 15:23:15 2022 - [info] Starting SSH connection tests..
Sun May 22 15:23:16 2022 - [debug]
Sun May 22 15:23:15 2022 - [debug] Connecting via SSH from root@node02(192.168.36.139:22) to root@node03(192.168.36.140:22)..
Sun May 22 15:23:16 2022 - [debug] ok.
Sun May 22 15:23:16 2022 - [debug]
Sun May 22 15:23:16 2022 - [debug] Connecting via SSH from root@node03(192.168.36.140:22) to root@node02(192.168.36.139:22)..
Sun May 22 15:23:16 2022 - [debug] ok.
Sun May 22 15:23:16 2022 - [info] All SSH connection tests passed successfully.
[root@node01 admin]# masterha_check_repl --conf=/etc/mha_master/mha.cnf
nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
masterha_check_status -conf=/etc/mha_master/mha.cnf
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。