前言
MySQL 高可用集群
MySQL 高可用集群是通过第三方软件实现的故障转移技术,通常是通过 MHA+Keepalived 或者 MHA+ 脚本等来实现,本例子将采用 Keepalived 实现。
准备
系统硬件
滴滴云服务器(DC2):安全可靠,拥有极高的性价比高,为开发者的需求而设计。适合大中小型用户购买使用。
本文示例采用:通用型 2核CPU 4GB内存 500G的EBS 云盘的服务器配置
数量:3 台,2 台 MySQL 主从服务器,1 台 MHA 管理服务器
依赖软件
系统:CentOS 7.4
MySQL 5.7.24
daemontools-0.76.tar.gz
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
Keepalived v1.2.13
安装过程
1. 登录2台服务器
SSH 登录购买的滴滴云 DC2 主机
1 2 |
ssh dc2-user@ip |
2. 安装并配置 MySQL 主从复制关系
两台服务器的 MySQL 都安装完成后开始配置主从复制关系。(如果不会安装 MySQL 可以参考另一篇如何安装 MySQL 的文章:如何在滴滴云 DC2 上搭建 MySQL 服务)。
在主库上建立从库账号
1 2 3 |
mysql>CREATE USER 'repl'@'ip' IDENTIFIED BY '****'; mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'ip' ; |
从库执行 change master 命令指向主库,配置的是 GTID 复制,所以不需要 binlog 的信息。
1 2 |
mysql>change master to master_host = 'master_ip', master_port = port, master_heartbeat_period = 10, master_user ='repl', master_password = '******',master_auto_position = 1; |
需要注意的地方:
- server_id 不能相同
- 主从开启 GTID 复制
3. 建立主从复制关系后,校验一下复制是否成功开启
登录从库,查看 IO 和 SQL 线程是否启动
1 2 |
mysql> show slave status\G; |
4. 安装 MHA
登录到第三台 DC2 的服务器安装 MHA,可以下载最新的 MHA: https://github.com/yoshinorim/mha4mysql-manager
1 2 3 4 5 6 7 |
yum -y install perl-DBI yum -y install perl-DBD-mysql yum -y install perl-Time-HiRes yum -y install perl-Config-Tiny yum -y install perl-Log-Dispatch yum -y install perl-Parallel-ForkManager |
1 2 3 |
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm |
在两台 MySQL 服务器安装 MHA Node
1 2 3 |
yum -y install perl-DBD-mysql rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm |
在 etc 目录下建立 MHA 文件夹
1 2 |
mkdir -p /etc/mha/ |
创建 manager 日志目录
1 2 3 |
mkdir -p /var/log/mha/app1 chmod 755 /var/log/mha/app1 |
配置 app1.cnf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
vim /etc/mha.d/app1.cnf [server default] manager_log=/var/log/mha/app1/app1.log manager_workdir=/var/log/mha/app1 [server1] candidate_master=1 hostname=master_ip [server2] candidate_master=1 hostname=slave_ip |
配置 masterha_default.cnf 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
vim /etc/mha.d/masterha_default.cnf [server default] ssh_user=root user=mha password=mha_password repl_user=repl repl_password=repl_password master_binlog_dir= /data/mysql #MySQL的binlog所在目录 remote_workdir=/var/log/mha #mysql主从work目录,需要在mysql主从上创建目录 ping_interval=3 master_ip_failover_script=/etc/mha.d/script/master_ip_failover report_script= /etc/mha.d/script/send_master_failover_mail |
5. 配置 SSH 互信和 MHA 用户
MySQL 主从服务器配置户型:
生成 pub 秘钥,一直回车就可以,生成成功后复制 id_rsa.pub 里面的秘钥到从库,同样从库也是先生成秘钥再复制到主库服务器。
1 2 |
cd ~/.ssh |
MHA 管理端到 MySQL Node 的互信配置,生成秘钥,同时复制到 MySQL 的两台服务器上。
创建MHA用户:
登录到 MySQL 主库
1 2 3 |
mysql> CREATE USER 'mha'@'%' IDENTIFIED BY 'mha2018REPL'; mysql> GRANT all privileges ON *.* TO 'mha'@'%'; |
校验 MHA 的 SSH 互信配置与 MySQL 复制状态
1 2 3 |
masterha_check_ssh --conf=/etc/mha.d/app1.cnf masterha_check_repl --conf=/etc/mha.d/app1.cnf --global_conf=/etc/mha.d/masterha_default.cnf |
MHA 的脚本修改 master_ip_failover
、master_ip_online_change
、send_master_failover_mail
可以把例子的脚本复制下来,放到 /etc/mha/script
的目录下,适当按需修改内容。
6. Keepalived 安装
在两台 MySQL 服务器上安装 Keepalived
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
yum install -y keepalived vrrp_script mysql_5001 { script "/etc/keepalived/checkmysql.sh" interval 60 } vrrp_instance VI_82 { state BACKUP nopreempt interface eth0 virtual_router_id 82 priority 100 advert_int 5 authentication { auth_type PASS auth_pass 1111 } track_script { mysql_5001 } virtual_ipaddress { 192.168.1.188 } } |
1 2 3 4 5 6 7 8 9 |
vim checkmysql.sh res = `ps -ef | grep -v grep | grep mysql | wc -l` if [ $res > 0 ]; then exit 0 else exit 1 fi |
7. 设置守护程序
1 2 3 4 5 6 7 8 9 10 |
#tar zxf daemontools-0.76.tar.gz # cd admin/daemontools-0.76/ # sed -i 's/extern int errno;/#include <errno.h>/1' ./src/error.h #./package/install #sed -i '$acsh -cf \x27\/command\/svscanboot &\x27' /etc/rc.d/rc.local #sh /etc/rc.local #nohup sh /command/svscanboot & #ps -ef | grep svscanboot |
1 2 3 |
mkdir /service/app1/run chmod 750 /service/app1/run |
1 2 3 4 |
vim /service/app1/run #!/bin/sh exec masterha_manager --global_conf=/etc/mha/masterha_default.cnf --conf=/etc/mha/app1.cnf --wait_on_monitor_error=60 --wait_on_failover_error=60 --ignore_last_failover --last_failover_minute=6 >> /var/log/mha/app1/app1.log 2>&1 |
启动 app1
1 2 |
svc -u /service/app1 |
停止
1 2 |
svc -d /service/app1 |
本文作者:陈俊川