简单的MySql主从已经不能满足线上项目了
准备工作
xxx.224.185.172正式库
xxx.224.185.52 测试库
xxx.224.185.169 从库
xxx.224.177.163 从库
xxx.224.185.53 控制台
工具
Xtrabackup:数据备份工具
MHA:高可用主从切换
Nginx:数据库代理,固定主从IP(主从切换不用重启微服务)
监控工具待定,MySQLMTOP,Navicat Monitor
工具安装
MySql调整
虚拟机linux搭建MySql集群(以及自己踩的坑) - 简书 (jianshu.com)
跳过mysql安装和配置主从,如果是docker安装mysql
需要挂载配置文件和日志文件
docker run --name mysqlmaster -e MYSQL_ROOT_PASSWORD=my-secret-pw -p3307:3306 -v /usr/local/mysql/conf/my.cnf:/etc/mysql/my.cnf -v /var/lib/mysql:/var/lib/mysql -d zudp/mysqlmaster:5.7
配置半同步复制
Master节点
登录MySQL,在MySQL命令行执行下面命令安装插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
show variables like '%semi%';
使用vi /etc/my.cnf,修改MySQL配置文件
# 自动开启半同步复制
rpl_semi_sync_master_enabled=ON
rpl_semi_sync_master_timeout=1000
重启MySQL服务
systemctl restart mysqld
Slave节点
两台Slave节点都执行以下步骤。
登录MySQL,在MySQL命令行执行下面命令安装插件
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
使用vi /etc/my.cnf,修改MySQL配置文件
# 自动开启半同步复制
rpl_semi_sync_slave_enabled=ON
重启服务
systemctl restart mysqld
测试半同步状态
首先通过MySQL命令行检查参数的方式,查看半同步是否开启。
show variables like '%semi%';
然后通过MySQL日志再次确认。
cat /var/log/mysqld.log
可以看到日志中已经启动半同步信息,例如:
Start semi-sync binlog_dump to slave (server_id: 2), pos(mysql-bin.000005, 154)
MHA安装
4台机器互通
防火墙设置
xxx.224.185.53是MHA Manager服务器
在四台服务器上分别执行下面命令,生成公钥和私钥(注意:连续按换行回车采用默认值)
ssh-keygen -t rsa
在三台MySQL服务器分别执行下面命令,密码输入系统密码,将公钥拷到MHA Manager服务器上
ssh-copy-id xxx.224.185.53
之后可以在MHA Manager服务器上检查下,看看.ssh/authorized_keys文件是否包含3个公钥
cat /root/.ssh/authorized_keys
执行下面命令,将MHA Manager的公钥添加到authorized_keys文件中(此时应该包含4个公钥)
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
从MHA Manager服务器执行下面命令,向其他三台MySQL服务器分发公钥信息。
scp /root/.ssh/authorized_keys root@xxx.224.185.172:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@xxx.224.185.169:/root/.ssh/authorized_keys
scp /root/.ssh/authorized_keys root@xxx.224.177.163:/root/.ssh/authorized_keys
可以MHA Manager执行下面命令,检测下与三台MySQL是否实现ssh互通。
ssh xxx.224.185.172
exit
ssh xxx.224.185.169
exit
ssh xxx.224.177.163
exit
MHA下载和安装
MySQL5.7对应的MHA版本是0.5.8,下载地址
https://github.com/yoshinorim/mha4mysql-manager/releases/tag/v0.58
https://github.com/yoshinorim/mha4mysql-node/releases/tag/v0.58
三台MySQL服务器需要安装node
MHA Manager服务器需要安装manager和node
MHA 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安装
在MHA Manager服务器安装mha4mysql-node和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 perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
MHA 配置文件
MHA Manager服务器需要为每个监控的 Master/Slave 集群提供一个专用的配置文件,而所有的Master/Slave 集群也可共享全局配置。(只要再manager配置即可)
创建目录
#目录说明
#/var/log (CentOS目录)
# /mha (MHA监控根目录)
# /app1 (MHA监控实例根目录)
# /manager.log (MHA监控实例日志文件)
mkdir -p /var/log/mha/app1
touch /var/log/mha/app1/manager.log
配置监控全局配置文件
vim /etc/masterha_default.cnf
[server default]
#主库用户名,在master mysql的主库执行下列命令建一个新用户
#create user 'mha'@'%' identified by '123123';
#grant all on *.* to mha@'%' identified by '123123';
#flush privileges;
user=mha
password=123123
port=3306
#ssh登录账号
ssh_user=root
#从库复制账号和密码
repl_user=root
repl_password=’数据库密码’
port=3306
#ping次数
ping_interval=1
#二次检查的主机
secondary_check_script=masterha_secondary_check -s xxx.224.185.172 -s
xxx.224.185.169 -s xxx.224.177.163
配置监控实例配置文件
先使用mkdir -p /etc/mha命令创建目录,然后使用vim /etc/mha/app1.cnf 命令编辑文件
[server default]
#MHA监控实例根目录
manager_workdir=/var/log/mha/app1
#MHA监控实例日志文件
manager_log=/var/log/mha/app1/manager.log
#[serverx] 服务器编号
#hostname 主机名
#candidate_master 可以做主库
#master_binlog_dir binlog日志文件目录
[server1]
hostname=xxx.224.185.172
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server2]
hostname=xxx.224.185.169
candidate_master=1
master_binlog_dir="/var/lib/mysql"
[server3]
hostname=xxx.224.177.163
candidate_master=1
master_binlog_dir="/var/lib/mysql"
MHA 配置检测
执行ssh通信检测
在MHA Manager服务器上执行:
masterha_check_ssh --conf=/etc/mha/app1.cnf
检测MySQL主从复制
在MHA Manager服务器上执行:
masterha_check_repl --conf=/etc/mha/app1.cnf
出现“MySQL Replication Health is OK.”证明MySQL复制集群没有问题。
MHA Manager启动
在MHA Manager服务器上执行:
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --
ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
查看监控状态命令如下:
masterha_check_status --conf=/etc/mha/app1.cnf
查看监控日志命令如下:
tail -f /var/log/mha/app1/manager.log
Xtrabackup安装
每台数据库服务器安装Xtrabackup,控制台服务器不用装Xtrabackup。
1、下载地址:
2、登录服务器:
cd /usr/local/src,通过Xftp上传下载好的包到src目录下
3、解压:
tar xf Percona-XtraBackup-2.4.21-r5988af5-el7-x86_64-bundle.tar
4、安装:
yum install percona-xtrabackup-24-2.4.21-1.el7.x86_64.rpm -y
5、执行:
which xtrabackup
6、执行:
innobackupex -v
Nginx安装
略过
高可用实现
Nginx配置(例)
Nginx的作用是主从切换后,微服务不需要修改配置文件来更换主从ip,通过nginx代理的方式保证数据库连接ip固定。
stream{
server {
listen 8010;
proxy_connect_timeout 100s;
proxy_timeout 3000s;
proxy_pass masterdb ;
}
upstream masterdb {
server xxx.224.185.172:3306 weight=5 max_fails=10 fail_timeout=30000s;
}
server {
listen 8011;
proxy_connect_timeout 100s;
proxy_timeout 3000s;
proxy_pass slavedb ;
}
upstream slavedb {
server xxx.224.185.169:3306 weight=5 max_fails=10 fail_timeout=30000s;
server xxx.224.185.163:3306 weight=5 max_fails=10 fail_timeout=30000s;
}
}
在nacos配置的是1主1从,单实际上从库在nginx做了负载是1主2从。
主库宕机处理
主库宕机后MHA Manager会将一个从库升级为主库,
查看MHA Manager日志
tail -200f /var/log/mha/app1/manager.log
例:
查看MHA日志,可以看到哪台slave切换成了master
show master status;
打开nginx配置文件,修改代理的主库和从库地址;将新主库ip写到主库位置,从库删除新主库ip。
stream{
server {
listen 8010;
proxy_connect_timeout 100s;
proxy_timeout 3000s;
proxy_pass masterdb ;
}
upstream masterdb {
server xxx.224.185.169:3306 weight=5 max_fails=10 fail_timeout=30000s;
}
server {
listen 8011;
proxy_connect_timeout 100s;
proxy_timeout 3000s;
proxy_pass slavedb ;
}
upstream slavedb {
server xxx.224.185.163:3306 weight=5 max_fails=10 fail_timeout=30000s;
}
}
再手动将原主库启动,作为从库加入。
从库加入
传统从库加入需要主库停止写入,使用xtrabackup后可以在不影响主库的情况下加入从库
通过Xtrabackup工具热备主库数据
innobackupex --defaults-file=/usr/local/mysql/conf/my.cnf--user=root --password=*密码* --port=3306 --host=xxx.224.185.172 /home/xhr/onlineback/
应用日志到备份文件,确保在线热备数据处于一致性状态
innobackupex --apply-log /home/xhr/onlineback/2023-03-12_23-07-10(最新)/
将备份好的文件,传送到从库所在服务器
scp -r /home/xhr/onlineback/* root@xxx.224.185.169:/home/xhr/onlineback
在主库中对待处理的从库进行主从授权
就是主从的授权
create user 'zudp'@'%' identified by 'zudp';
grant replication slave on *.* to 'zudp'@'%';
flush privileges;
主库操作结束。
从库mysql配置要加上
#要复制数据库的名称(必要)
replicate-do-db=zudp-telecom=dev
备份从库一数据目录下的所有文件,同时将接收的备份文件拷贝到从库数据目录
\cp-rf /home/xhr/onlineback/2023-03-12_23-07-10/* /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql/*
就是datadir全替换
查看binlog版本
cat /home/xhr/onlineback/2023-03-12_23-07-10/xtrabckup_binlog_info
mysql-bin.000055 154(查看到的信息)
从库同步,就是从备份的binlog位置开始同步
change master to master_host='xxx.224.185.172',master_user='root', master_password='*密码*',master_port=3306,master_log_file='mysql-bin.000055',master_log_pos=154;
start slave;
在nginx配置中加上从库负载。
操作记录