一、环境版本
环境和软件版本 | 版本 |
---|---|
VMware Workstation | 15pro |
Centos | 7.5 |
Mysql | 5.7.28 |
MHA | 0.58 |
二、架构介绍
MHA高可用集群总共使用了4台机器,3台用于搭建Mysql一主两从集群,另外1台用于搭建MHA用于整个集群的监控。整体如下:
IP | 角色 | 权限 |
---|---|---|
192.168.137.201 | 主库 | 可读写 |
192.168.137.202 | 从库 | 只读 |
192.168.137.203 | 从库 | 只读 |
192.168.137.204 | MHA | 监控和健康检查 |
架构图:
三、Mysql主从搭建
3.1 软件安装
三台机器都要安装
#下载
wegt https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
#解压
tar xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar
mysql-community-embedded-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.28-1.el7.x86_64.rpm
mysql-community-libs-5.7.28-1.el7.x86_64.rpm
mysql-community-test-5.7.28-1.el7.x86_64.rpm
mysql-community-common-5.7.28-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.28-1.el7.x86_64.rpm
mysql-community-client-5.7.28-1.el7.x86_64.rpm
mysql-community-server-5.7.28-1.el7.x86_64.rpm
#要移除CentOS自带的mariadb-libs,不然会提示冲突
rpm -qa | grep mariadb
rpm -e mariadb-libs-5.5.41-2.el7_0.x86_64 --nodeps
#安装
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-devel-5.7.28-1.el7.x86_64.rpm
#初始化用户
mysqld --initialize --user=mysql
#找到当前初始化的密码
grep "password" /var/log/mysqld.log
#启动服务
systemctl start mysqld
#配置开机自启
systemctl enable mysqld
#修改默认密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
#允许远程连接
grant all on *.* to root@'%' identified by 'password' with grant option;
flush privileges;
3.2 主从配置
修改Master配置文件
character-set-server=utf8
# binlog
server-id=100
log_bin=mysql-bin
binlog_format=MIXED
sync-binlog=1
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
#relay_log配置
relay_log=mysql-relay-bin
log_slave_updates=1
relay_log_purge=0
修改从节点配置
#bin log
log_bin=mysql-bin
#服务id,从库1是200,从库2是300
server-id=200
sync-binlog=1
binlog_format=MIXED
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
#relay log
relay_log=mysql-relay-bin
log_slave_updates=1
relay_log_purge=0
read_only=1
重启服务
systemctl restart mysqld
主库给从库授权,在主库执行以下命令
grant replication slave on *.* to root@'%' identified by 'passsword';
grant all privileges on *.* to root@'%' identified by 'passsword';
#刷新权限
flush privileges;
#获取当前主库的binlog日志和偏移位置,给后面从库配置同步使用
show master status;
配置从库开启同步
stop slave;
change master to master_host='192.168.137.201',master_port=3306,master_user='root',master_password='password',master_log_file='mysql-bin.000004',master_log_pos=154;
# 开启同步
start slave;
3.4 配置半同步复制
半同步复制需要依赖于插件完成
Master节点:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
修改配置文件
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
Slave节点:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
修改配置文件
rpl_semi_sync_slave_enabled=1
最后别忘了都要重启实例,可以通过show variables like '%semi%'
查看半同步复制是否开启。
四、MHA高可用搭建
4.1 环境检查
搭建MHA之前需要先保证服务器之间是ssh互通,这里配置成免密登录。在四台服务器上分别执行下面命令,生成公钥和私钥。
ssh-keygen -t rsa
服务器之间分别执行ssh-copy-id命令,将公钥拷到对应服务器上,以192.168.137.201那台服务器为例,执行以下命令
ssh-copy-id 192.168.137.202
ssh-copy-id 192.168.137.203
ssh-copy-id 192.168.137.204
在对应的服务器上查看是否存在指定公钥,也可以用ssh ip的方式,看是否可以直接访问。
cat /root/.ssh/authorized_keys
4.2 MHA下载
MySQL5.7对应的MHA版本是0.5.8,所以在GitHub上找到对应的rpm包进行下载,MHA manager和
node的安装包需要分别下载:
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
三台MySQL服务器需要安装node,MHA Manager服务器需要安装manager和node。
分别在四台服务器上安装mha4mysql-node,MHA的Node依赖于perl-DBD-MySQL,所以要先安装perl-DBD-MySQL。
yum install perl-DBD-MySQL -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
另外单独对MHA Manager服务器安装mha4mysql-manager,MHA的manager又依赖了perl-Confifig-Tiny、perl-Log-Dispatch、perl-Parallel-ForkManager,也分别进行安装。
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm
yum install perl-DBD-MySQL -y
yum install perl-Config-Tiny -y
yum install perl-Log-Dispatch -y
yum install perl-Parallel-ForkManager -y
wget https://github.com/yoshinorim/mha4mysql-node/releases/download/v0.58/mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
wget https://github.com/yoshinorim/mha4mysql-manager/releases/download/v0.58/mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rp
4.3 配置文件
MHA需要对每个监控的 Master/Slave 集群提供一个专用的配置文件。而所有的Master/Slave 集群也可共享全局配置。
初始化配置文件
mkdir /home/mha/log/app
touch /home/mha/log/manager.log
增加全局配置文件,这个路径不能变,后面节点健康默认就是拿这个路径下的配置文件
vim /etc/masterha_default.cnf
[server default]
#用户名
user=root
#密码
password=123456
#ssh登录账号
ssh_user=root
#主从复制账号
repl_user=root
#主从复制密码
repl_password=password
#设置监控主库,发送ping包的时间间隔
ping_interval=1
#设置发生切换之后发送的报警脚本
#report_script=/usr/local/send_report
#二次检查的主机,实现多路监测master的可用性
secondary_check_script=masterha_secondary_check -s 192.168.137.201 -s 192.168.137.202 -s 192.168.137.203
增加配置监控实例配置文件
vim /etc/mha/app1.cnf
[server default]
manager_log=/home/mha/log/manager.log
manager_workdir=/home/mha/log/app
[server2]
candidate_master=1
hostname=192.168.137.202
master_binlog_dir="/var/lib/mysql"
password=Xian@0107
port=3306
[server3]
candidate_master=1
hostname=192.168.137.203
master_binlog_dir="/var/lib/mysql"
password=Xian@0107
port=3306
[server1]
candidate_master=1
hostname=192.168.137.201
master_binlog_dir="/var/lib/mysql"
password=Xian@0107
port=3306
4.4 MHA配置检测
#检查节点之间是否互通
masterha_check_ssh --conf=/etc/mha/app1.cnf
#检测Mysql主从配置
masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。
4.5 监控启动
在MHA服务器上执行
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf
--ignore_last_failover < /dev/null > /home/mha/log/manager.log 2>&1 &
查看进程是否正常启动
ps -ef | grep masterha_manager
查看监控状态
masterha_check_status --conf = /etc/mha/app1.cnf
查看监控日志
tail -f /home/mha/log/manager.log
4.6 高可用测试
把201那台机器的mysql实例关掉模拟主节点殆机,查看监控日志可以看到那台slave切换成了master。(假设当前是202被重新选为主节点)
启动殆机的节点,配置该节点作为从节点挂载到新的主节点下面。
change master to master_host='192.168.127.202',master_port=3306,master_user='root',master_password ='password',master_log_file='xxx',master_log_pos=xxx;
# 开启同步
start slave;
使用MHA在线切换命令将原主切换回来,切换之前需要修改对应集群的MHA配置文件,补上殆机被去掉的节点内容。
vim /etc/mha/app1.cnf
masterha_master_switch --conf=/etc/mha/app1.cnf --master_state=alive -- new_master_host=192.168.137.201 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
最后会显示新的master切换回到201那台机器,这时候也可以通过查看从节点的同步状态可以看到当前master的信息。
五、遇到的问题
5.1 主从配置
配置主从同步的时候要注意授权问题,不要忘记授权,不然后面MHA主从切换时,从库升级为主库会切换失败
grant replication slave on *.* to root@'%' identified by 'passsword';
5.2 主库切换
主库殆机后,对应节点的配置信息就会被移除,所以节点恢复的时候,不要忘了修改mha对应集群的配置文件,补上殆机的节点信息,不然使用MHA在线切换回原主的时候,MHA会因为找到节点信息而认为节点一直是处于殆机状态而导致切换失败。