MySQL第五讲 MySQL-MHA集群搭建

       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, 目前已支持一主一从。

 MHA 服务

MHA 服务有两种角色, MHA Manager(管理节点)和 MHA Node(数据节点):
MHA Manager:
  通常单独部署在一台独立机器上管理多个 master/slave 集群(组),每个master/slave 集群称作一个 application ,用来管理统筹整个集群。
MHA node:
 运行在每台 MySQL 服务器上(master/slave/manager),它 通过监控具备解析 和清理 logs 功能的脚本来加快故障转移。
     主要是接收管理节点所发出指令的代理,代理需要运行在每一个 mysql 节点上。简单讲 node 就是用来收集从节点服务器上所生成的 bin-log 。对比打算提升为新的主节点之上的从节点的是否拥有并完成操作,如果没有发给新主节点在本地 应用后提升为主节点。
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 之间都需要ssh实现无密码 互连,只有这样,在 Master 出故障时, Manager 才能顺利的连接进去,实现主从切换功能
提供的工具
  MHA会提供诸多工具程序, 其常见的如下所示:
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集群

 MHA 对 MYSQL 复制环境有特殊要求,例如各节点都要开启二进制日志及继日志,各从节点必须显示启用其read-only属性,并关闭relay_log_purge功能等,这里对配置做事先说明。

本次总共使用三台服务器,列表清单如下:

机器名称Ip配置角色备注
node01192.168.36.138manager控制器用于监控管理
node02192.168.36.139数据库主服务开启bin-log relay-log关闭relay_log_purge
node03192.168.36.140数据库从服务器,可以搭建多个开启bin-log relay-log关闭relay_log_purge
 为了方便我们后期的操作,我们在各节点的/etc/hosts文件配置内容中添加如 下内容:
192.168.36.138   node01
192.168.36.139   node02
192.168.36.140   node03

初始主节点 master 的配置 

我们需要修改 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.sock

symbolic-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 节点依赖的配置

  我们修改 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.sock

symbolic-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

配置一主多从复制架构

master 节点上:
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;

 

 安装配置MHA

 在 master 上进行授权

 在所有 Mysql 节点授权拥有管理权限的用户可在本地网络中有其他节点上远程 访问。 当然, 此时仅需要且只能在 master 节点运行类似如下 SQL 语句即可。
grant all on *.* to 'admin'@'192.168.%.%' identified by 'admin';
自己定义用户名 密码

准备ssh互通环境

  MHA集群中的各节点彼此之间均需要基于ssh互信通信,以实现远程控制及数据管理功能。简单起见,可在Manager节点生成密钥对儿,并设置其可远程连接本地主机后, 将私钥文件及authorized_keys文件复制给余下的所有节点即可,下面操作在所有节点上操作:

[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下查看

 几台机器的公钥都已经在 authorized_keys 这个文件中了,接着,我们只需要把这个文件发送至另外两台机器,这三台机器就可以实现 ssh 无密码互通了:
scp authorized_keys root@node02:~/.ssh/
scp authorized_keys root@node03:~/.ssh/

 可以在机器上通过ssh验证是否不需要密码就可以连接

 安装 MHA 包

 在本步骤中, Manager节点需要另外多安装一个包。具体需要安装的内容如下:
四个节点都需安装:mha4mysql-node-0.58-0.el7.norch.rpm
Manager 节点另需要安装: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

 下载地址:https://centos.pkgs.org/

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.rpm
yum install -y mha4mysql-manager-0.58-0.el6.noarch.rpm

初始化MHA,进行配置

     Manager 节点需要为每个监控的 master/slave 集群提供一个专用的配置文件,而所有的 master/slave 集群也可共享全局配置 。全局配置文件 默认 /etc/masterha_default.cnf ,其为 可选配置 。如果仅监控一组 master/slave 集群,也可直接通过 application 的配置来提供各服务器的默认配置 信息。而每个 application 的配置文件路径为自定义。具体操作见下一步骤。

定义 MHA 管理配置文件

 为MHA专门创建一个管理用户, 方便以后使用, 在mysql的主节点上, 三个 节点自动同步:
mkdir /etc/mha_master
vim /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
对四个节点进行检测
1:检测各节点间 ssh 互信通信配置是否 ok, 我们在 Manager 机器上输入下述命令来检测
[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.
 如果最后一行显示为 [info]All SSH connection tests passed successfully.则表示成功。
2)检查管理的MySQL复制集群的连接配置参数是否OK
[root@node01 admin]# masterha_check_repl --conf=/etc/mha_master/mha.cnf
启动 MHA
nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &
启动成功以后,我们来查看一下 master 节点的状态:
masterha_check_status -conf=/etc/mha_master/mha.cnf
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员路同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值