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. 系统架构
服务器清单 Container List
Container Name | Container IP | PORTS Mapping | Description |
---|---|---|---|
mysql-master | 172.17.0.2 | 33061:3306; 2201:22 | MySQL 主 |
mysql-slave-1 | 172.17.0.3 | 33062:3306; 2202:22 | MySQL 从,MySql 主备用机 |
mysql-slave-2 | 172.17.0.4 | 33063:3306; 2203:22 | MySQL 从 |
mysql-mha | 172.17.0.5 | 2204:22 | MySQL MHA 管理机 |
注意:本次使用 Docker 来构建,默认 Docker 启动时,端口都是 172.17.0.* 依次启动分配的,为保证和以上服务器的 ip 对应,请按照以下顺序依次启动:
- mysql-master
- msyql-slave-1
- mysql-slave-2
- 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 就是刚刚建的
安装 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
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 连接示意图
Navicat 连接 mysql-master 服务器的 MySQL 数据库示意图
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)
效果图:
3.4 安装 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 连接示意图
注意:
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
、mha4mysql-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 开启半同步复制
- mysql-master 开启半同步复制:
# 查看默认密码
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;
- 2 个 mysql-slave 开启半同步复制:
# 查看默认密码
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
时的示意图如下,其余的几个方式一样
在容器 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
检查没有问题后,再来检查 MySQL 的主从复制:
masterha_check_repl --conf=/etc/masterha/mha.cnf
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
示意图:
注意:当完成一次正常的故障转移后,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
切换成功示意图
本文由 Suremotoo 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Nov 27,2020