MySQL MHA 系统构建
in 代码 with 0 comment

MySQL MHA 系统构建

in 代码 with 0 comment

MySQL MHA 系统构建

使用 Docker 来构建 1 主 2 从的半同步复制的 MySQL 集群,并使用 MHA 来对 MySQL 集群进行监控,实现 MySQL 集群的故障转移。

01. 系统软件版本

Linux 构建:Docker version 19.03.13

Linux 版本:CentOS 7.9.2009

MySQL 版本:MySQL 5.7.31

MHA 版本:0.58-0.el7.centos

辅助软件: Docker Desktop

02. 系统架构

MHA

服务器清单 Container List

Container NameContainer IPPORTS MappingDescription
mysql-master172.17.0.233061:3306;
2201:22
MySQL 主
mysql-slave-1172.17.0.333062:3306;
2202:22
MySQL 从,MySql 主备用机
mysql-slave-2172.17.0.433063:3306;
2203:22
MySQL 从
mysql-mha172.17.0.52204:22MySQL MHA 管理机

注意:本次使用 Docker 来构建,默认 Docker 启动时,端口都是 172.17.0.* 依次启动分配的,为保证和以上服务器的 ip 对应,请按照以下顺序依次启动:

  1. mysql-master
  2. msyql-slave-1
  3. mysql-slave-2
  4. Mysql-mha

03. 软件安装

3.1 创建 centos7_mysql:5.7.31 镜像

使用 Docker 拉取 CentOS 7.8 镜像到本地,启动该镜像为 centos 容器,注意 Docker 镜像源地址。

# 拉取 CentOS 7.9.2009 镜像
docker pull centos:centos7.9.2009
# 创建容器 centos 
docker run -dit --privileged --name centos-mysql -p 22:22 centos:centos7.9.2009 /usr/sbin/init
# 进入容器
docker exec -it centos-mysql /bin/bash

注意,如果提示 22 端口被监听占用,可任意改用其他未使用过的端口,比如: 222:22

完整示例:docker run -dit --privileged --name centos-mysql -p 222:22 centos:centos7.9.2009 /usr/sbin/init

创建完在 Docker Desktop 中可以查看到如下信息, 第一个 centos_mysql 就是刚刚建的

docker-containers

安装 SSH,MySQL 等软件。

## 换源 aliyun
yum -y install wget
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
yum clean all && yum makecache


## 安装 SSH 
yum -y install openssh-server
# 修改 root 密码为 root
echo 'root:root'|chpasswd
# 修改系统语言编码
echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile
source /etc/profile
# 修改系统时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 重启 sshd 
systemctl enable sshd
systemctl restart sshd


## 安装 MySQL
# 下载 mysql 源
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
# 安装 mysql 源
rpm -ivh mysql80-community-release-el7-3.noarch.rpm 
# 更新源
yum clean all && yum makecache
# 关闭 8.0 版本,开启 5.7 版本
yum-config-manager --disable mysql80-community 
yum-config-manager --enable mysql57-community 
# 安装 mysql-community-server
yum install -y mysql-community-server
# 查看 mysql 状态,先不要启动 mysql!!!
systemctl status mysqld.service

安装完 MySQL 之后,导出 centos 容器。

# 导出 centos, centos-mysql
docker export  centos-mysql  > centos7_mysql57.tar
# 导入 centos7_mysql57.tar 为本地镜像
docker import centos7_mysql57.tar
# 镜像重命名 “镜像 id” 就填写对应的镜像 ID 号
docker tag 镜像id centos7_mysql:5.7.31

docker-desktop-images

3.2 创建 MySQL 1 主 2 从容器

导出完毕后,关闭 centos 容器,然后使用 centos7_mysql:5.7.31 镜像创建 3 个容器。

# 创建容器 mysql-master
docker run -dit  --privileged  --name mysql-master -p 33061:3306 -p 2201:22 centos7_mysql:5.7.31 /usr/sbin/init

# 创建容器 mysql-slave-1
docker run -dit  --privileged  --name  mysql-slave-1 -p 33062:3306 -p 2202:22 centos7_mysql:5.7.31 /usr/sbin/init

# 创建容器 mysql-slave-2
docker run -dit  --privileged  --name mysql-slave-2 -p 33063:3306 -p 2203:22 centos7_mysql:5.7.31 /usr/sbin/init

创建好这 3 个 mysql 容器后,就可以使用 ssh 工具进入容器了,注意区分端口号,用户名密码用安装 SSH 时设置的。

注意:使用 SSH 连接时,ip 地址为本机:127.0.0.1,并非虚拟机的虚拟 ip(172.17.0.*),端口为启动容器时候的代理端口

如:mysql-master -p 33061:3306 -p 2201:22 33061 代理的是 3306 端口,2201 代理的是 22 端口

mysql-master ssh 连接示意图

ssh-tools

Navicat 连接 mysql-master 服务器的 MySQL 数据库示意图

docker-mysql-master-navicat

3.3 创建 mysql-mha 容器

# 创建 mysql-mha 容器
docker run -dit --privileged --name mysql-mha -p 2204:22 centos:7.9.2009 /usr/sbin/init
# 进入容器
docker exec -it mysql-mha /bin/bash

## 安装 SSH 
yum -y install openssh-server
# 修改 root 密码
echo 'root:root'|chpasswd
# 修改系统语言编码
echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile
source /etc/profile
# 修改系统时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 重启 sshd 
systemctl enable sshd
systemctl restart sshd

安装完 SSH 就可以用 ssh 工具进入容器了,端口号为 2204。

使用 SSH 连接上 4 个容器后,安装 MHA。

如果不知道 Docker 各个容器的 ip,可以使用以下命令查看

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

效果图:

display-docker-container-ip

3.4 安装 MHA

安装前,我们再看一下 MHA 的结构图,如下:

MHA

mha4mysql-node-0.58-0.el7.centos.noarch.rpm 文件传入这 4 个容器中,把 mha4mysql-manager-0.58-0.el7.centos.noarch.rpm 传入 mysql-mha 容器中

这两个文件下载地址:

链接: https://pan.baidu.com/s/1LE7lyanlk5ZV4VK_fSo9hg
密码: ge4o

传输工具可以使用: FileZilla 等这类工具,连接方式同 SSH

FileZilla 连接示意图

fileZilla

注意: mha4mysql-node-0.58-0.el7.centos.noarch.rpmmha4mysql-manager-0.58-0.el7.centos.noarch.rpm 这两个包的版本的文件只支持 CentOS7

首先在 MySQL 主从 这 3 个容器上安装 mha4mysql-node 包以及需要的依赖

## 安装 epel 源
yum install -y wget
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
# 安装 perl 依赖
yum install -y perl-DBD-MySQL
## 安装 node 注意文件位置
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

mysql-mha 上安装 mha4mysql-node 和 mha4mysql-manager 包

## 安装 epel 源,适用于 CentOS7
yum install -y wget
wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all && yum makecache
# 安装 perl 依赖
yum install -y perl-DBD-MySQL
yum install -y perl-Config-Tiny
yum install -y perl-Log-Dispatch
yum install -y perl-Parallel-ForkManager
## 安装 node
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
## 安装 manager
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

04. MySQL 集群半同步复制

4.1 修改配置文件

修改 mysql-master 的 mysqld.cnf:

# 修改 master mysqld.cnf
vi /etc/my.cnf


# master id
server_id=1
# 开启二进制日志
log-bin=mysql-bin

# 忽略系统库的数据同步
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys

修改 mysql-slave-1 的 mysqld.cnf:

# 修改 mysql-slave-1 mysqld.cnf
vi /etc/my.cnf


# slave id
server-id=2
# 中继日志
relay_log=mysql-relay-bin
# 只读关闭
read_only=0

# master 备用机开启
log-bin=mysql-bin
# 忽略的库,要和主库保持一致!!!!!!
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys

修改 mysql-slave-2 的 mysqld.cnf:

# 修改 mysql-slave-2 mysqld.cnf
vi /etc/my.cnf


# slave id
server-id=3
# 中继日志
relay_log=mysql-relay-bin
# 只读
read_only=1
# 忽略的库,要和主库保持一致!!!!!!
binlog-ignore-db=information_schema 
binlog-ignore-db=mysql 
binlog-ignore-db=performance_schema 
binlog-ignore-db=sys

配置完毕,启动 3 台 MySQL:

# 启动 mysqld,卡住使用 ctrl+c 返回
systemctl start mysqld

执行 systemctl start mysqld 如果一直卡住, Ctrl+C退出就行,只要 mysql 命令行工具可以正常连接基本上没什么影响

4.2 开启半同步复制

# 查看默认密码
cat /var/log/mysqld.log | grep password
# 初始密码登录
mysql -uroot -p

# 修改root密码,请确认密码规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# master开启授权
grant replication slave on *.* to 'root'@'%' identified by 'root';
grant all privileges on *.* to 'root'@'%' identified by 'root';

# 安装 半同步复制 master 插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';

# 开启 半同步复制 插件
set global rpl_semi_sync_master_enabled=1;
# 修改同步时间 1000 ms
set global rpl_semi_sync_master_timeout=1000;

# 刷新
flush privileges;

# 查看 master 状态,若为空请重启 MySQL
show master status;

show-master-status

# 查看默认密码
cat /var/log/mysqld.log | grep password
# 初始密码登录
mysql -uroot -p

# 修改root密码,请确认密码规则
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
# 开启远程登录
grant all privileges on *.* to 'root'@'%' identified by 'root';

# slave 设置 master
change master to master_host='172.17.0.2',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=869;

# 安装 半同步复制 slave 插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

# 开启 半同步复制 插件
set global rpl_semi_sync_slave_enabled=1;

# 刷新
flush privileges;

# 开启 slave
start slave;

# 查看 slave 状态
show slave status \G

05. 开启 MHA

5.1 配置 SSH 登录无密码验证

4 个容器 间配置 SSH 登录无密码验证

## 配置 SSH 登录无密码验证
yum -y install openssh-clients
# 配置 ssh key,默认即可,会在 /root/.ssh/ 生成 id_rsa 和 id_rsa.pub 文件
ssh-keygen -t rsa

在容器 mysql-master(172.17.0.2) 中执行:

# 配置 SSH 登录无密码验证
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.3
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.4

执行 ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.3 时的示意图如下,其余的几个方式一样

ssh-no-password

在容器 mysql-slave-1(172.17.0.3) 中执行:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.2
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.4

在容器 mysql-slave-2(172.17.0.4) 中执行:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.2
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.3

在容器 mysql-mha(172.17.0.5) 中执行:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.2
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.3
ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.17.0.4

5.2 配置 manager

mysql-mha(172.17.0.5) 中创建 mha 配置文件,先提前把该文件及目录创建出来

cd /etc
mkdir masterha
cd masterha
touch mha.cnf

然后再编辑 mha.cnf 的内容

# 创建 mha 配置文件
vi /etc/masterha/mha.cnf

mha.cnf 文件内容:

[server default]
# mysql user and password
user=root
password=root
ssh_user=root
# working directory on the manager
manager_workdir=/var/log/masterha/mha
# working directory on MySQL servers
remote_workdir=/var/log/masterha/mha
# log file
manager_log=/var/log/masterha/MHA.log

# mysql-master
[server1]
hostname=172.17.0.2

# mysql-slave-1
[server2]
hostname=172.17.0.3
# 作为备用主节点
candidate_master=1

# mysql-slave-2
[server3]
hostname=172.17.0.4

5.3 检查 manager

配置完成后,首先来检查容器间的 SSH:

masterha_check_ssh --conf=/etc/masterha/mha.cnf

masterha_check_ssh

检查没有问题后,再来检查 MySQL 的主从复制:

masterha_check_repl --conf=/etc/masterha/mha.cnf

masterha_check_repl

5.4 启动 manager

检查完成没有问题后,启动 manage 查看,没有错误 Ctrl + C 退出即可,再使用后台启动的方式

masterha_manager --conf=/etc/masterha/mha.cnf

后台启动:

# 后台启动
nohup masterha_manager --conf=/etc/masterha/mha.cnf < /dev/null > /var/log/masterha/mha/mha.log 2>&1 &

后台启动可查看 manager 状态

masterha_check_status --conf=/etc/masterha/mha.cnf
# 输出
mha (pid:17594) is running(0:PING_OK), master:172.17.0.2

示意图:

MHA-status


注意:当完成一次正常的故障转移后,manager 进程将会终止。


手动停止 manager-暂时不需要手动

masterha_stop --conf=/etc/masterha/mha.cnf

5.5 测试

去 **mysql-master(172.17.0.2)**上手动停止 mysql-master 服务

systemctl stop mysqld

然后去 mysql-mha(172.17.0.5) 查看 mysql-mha 输出:

tail -400f MHA.log

切换成功示意图

MHA-change-master