MHA+Cetus+Mysql搭建读写分离的高可用集群
程序员文章站
2022-03-10 15:25:32
安装MySQL卸载#检查rpm -qa|grep mariadb#卸载rpm -e --nodeps mariadb-libs#复查rpm -qa|grep mariadb安装Yum Repositorywget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpmyum -y install mysql57-community-release-el7-8.noarch.rpmyum clean all...
Centos配置
免密登录
#先修改hostname(也会影响relay-log的名字,如果主从复制已经开始了,再修改hostname会导致主从复制断开),避免后续ssh key相互覆盖
hostnamectl set-hostname db1
#在一台机器执行生成ssh key的命令,然后copy到其他机器上,循环集群中的所有机器
ssh-keygen -t rsa
#将本机的公钥写入到其他机器(**包括自己**)的authorized_keys文件
ssh-copy-id -i ~/.ssh/id_rsa.pub 192.168.56.101
关闭防火墙
#先关闭防火墙,slave和master都关掉,会影响主从同步
systemctl status firewalld.service
systemctl stop firewalld.service
systemctl disable firewalld.service
安装MySQL并配置主从
卸载mariadb
#检查
rpm -qa|grep mariadb
#卸载
rpm -e --nodeps mariadb-libs
#复查
rpm -qa|grep mariadb
安装Yum Repository
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm
yum -y install mysql57-community-release-el7-8.noarch.rpm
yum clean all
yum makecache
安装mysql-server
#安装
yum install mysql-community-server
#修改配置文件以无密码方式登入mysql
vim /etc/my.cnf#增加选项skip-grant-tables
#启动
systemctl start mysqld.service
#刷新权限
flush privileges;
#修改密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
修改master和candidate master配置
#master和candidate master半同步复制配置
plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
rpl_semi_sync_master-enabled=1
rpl_semi_sync_slave_enabled=1
#主从架构通用配置
server-id=1#candidate master设置为2
#启用gtid类型,否则就是普通的复制架构
gtid_mode=ON
#强制GTID的一致性
enforce-gtid-consistency=true
#禁止SQL线程在执行完一个relay log后自动将其删除,可用于主备切换之后的数据恢复,注意监控磁盘使用率
relay_log_purge = 0
log-bin=mysql-bin
#三种模式 STATEMENT(有可能主从数据不一致,日质量小)、ROW(产生大量二进制日志)、MIXED
binlog-format=ROW
binlog_cache_size=128m
max_binlog_cache_size=512m
max_binlog_size=256M
expire-logs-days=7
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys
#调优参数
#数据缓冲区buffer pool大小,建议使用物理内存的 75%
innodb_buffer_pool_size = 3G
#将buffer pool拆分成多个实例,建议每个实例大小在1G左右,但是不要超过CPU核心数
innodb_buffer_pool_instances=3
#开启慢查询日志,用于后续优化sql
slow_query_log = 1
long_query_time = 3
slow_query_log_file = /var/log/mysql/slow.log
#每5次写入事件,刷一次盘
sync-binlog=5
#缓冲池预热
innodb_buffer_pool_load_at_startup = 1
#开启后会将所有的死锁记录到error_log中,会带来性能损耗
innodb_print_all_deadlocks = 1
slave配置到master的关联
CHANGE MASTER TO MASTER_HOST='192.168.56.102',MASTER_PORT=3306,MASTER_USER='replication',MASTER_PASSWORD='Repl@2020',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
#不写在配置文件里的原因是,随时可能发生故障切换
set global read_only=1
创建mysql账号
#创建远程登录mysql的账号
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Root@2020' WITH GRANT OPTION;
flush privileges;
#创建用于同步的账号
grant replication slave on *.* to 'replication'@'%' identified by 'Repl@2020';
flush privileges;
#删除账户以及权限
drop user root@'localhost';
部署与配置MHA
部署MHA Node
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
部署MHA manager
#安装epel源
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装MHA manager
yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles
#先安装node,再安装manager,有依赖关系
rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm
Manager配置文件
mkdir -p /etc/mha/app1/logs
mkdir -p /etc/mha/app1/workdir/
touch
[server default]
manager_log=/etc/mha/app1/logs/manager.log
manager_workdir=/etc/mha/app1/workdir/
master_binlog_dir=/var/lib/mysql
#设置mysql数据库的用户名密码,主库从库创建用户的时候要保持一致
user=root
password=Root@2020
#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failover
ping_interval=2
#设置复制用户的密码
repl_password=123
#设置复制环境中的复制用户名
repl_user=repl
#设置ssh的登录用户名
ssh_user=root
#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
shutdown_script=""
#设置发生切换后发送的报警的脚本
report_script=""
[server1]
hostname=192.168.56.101
port=3306
[server2]
hostname=192.168.56.102
port=3306
#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
candidate_master=1
#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0
启动与检查
#启动MHA manager
nohup masterha_manager --conf=/etc/mha/app1/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /etc/mha/app1/logs/manager.log 2>&1 &
#检查MHA manager的状态
masterha_check_status --conf=/etc/mha/app1/app1.cnf
#检查免密登录的状态
masterha_check_ssh --conf=/etc/mha/app1/app1.cnf
#检查主从复制的状态
masterha_check_repl --conf=/etc/mha/app1/app1.cnf
模拟故障恢复
#模拟master down机
service mysqld stop
#去mha manager所在的节点查看切换日志,里边有一条CHANGE MASTER语句比较重要,可以用来恢复故障主机
grep MASTER /etc/mha/app1/logs/manager.log
#拿到CHANGE MASTER语句之后登录到故障主机执行如下命令
#先启动mysql
service mysqld start
#然后登录mysql,重新配置主从关系
CHANGE MASTER TO MASTER_HOST='192.168.56.101', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='replication', MASTER_PASSWORD='xxx';
start slave;
#然后设置只读
set global read_only=1
#检查MHA的配置文件,因为每次故障切换,MHA都会将故障主机从配置文件里清除掉
vim /etc/mha/app1/app1.cnf
#检查cetus的配置文件,MHA与cetus联动之后也会将新的master配置到proxy-backend-addresses,挂掉的master配置到proxy-read-only-backend-addresses
cat /usr/local/cetus/conf/proxy.conf
#之后再执行mha的检查脚本,检查出来有问题就修改,直至检查通过再启动mha manager
masterha_check_ssh --conf=/etc/mha/app1/app1.cnf
masterha_check_repl --conf=/etc/mha/app1/app1.cnf
联动读写分离中间件Cetus
cetus安装
#安装包下载,记得下载release版本
[cetus release包下载地址](https://github.com/session-replay-tools/cetus/releases)
#安装依赖包
yum install cmake gcc glib2-devel flex mysql-devel gperftools-libs zlib-devel -y
#在源码主目录下创建独立的目录build,并转到该目录下
mkdir build/
cd build/
CFLAGS='-g -Wpointer-to-int-cast' cmake ../ -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/cetus -DSIMPLE_PARSER=ON
make install
#安装一个mysql客户端,后续用来管理cetus,和查看代理的后端数据库的状态
yum install mysql
Cetus配置
配置文件初始化
#Cetus运行前还需要编辑配置文件,配置文件说明:https://github.com/session-replay-tools/cetus/blob/master/doc/cetus-rw-profile.md
cd /usr/local/cetus/conf
#需要改动
cp proxy.conf.example proxy.conf
#需要改动
cp users.json.example users.json
#不用做特殊改动
cp variables.json.example variables.json
proxy.conf介绍
# For mode-switch
daemon = true
# Loaded Plugins
plugins=proxy,admin
# Defines the number of worker processes.
worker-processes=2
# Proxy Configuration, For example: MySQL master and salve host ip are both 192.0.0.1
proxy-address=0.0.0.0:6001
proxy-backend-addresses=192.168.56.101:3306
proxy-read-only-backend-addresses=192.168.56.102:3306
# Admin Configuration
admin-address=0.0.0.0:7001
admin-username=admin
admin-password=admin
# Backend Configuration, use test db and username created
default-db=members
default-username=root
default-pool-size=100
max-resp-size=10485760
long-query-time=1000
# File and Log Configuration, put log in /data and marked by proxy port, /data/cetus needs to be created manually and has rw authority for cetus os user
max-open-files = 65536
pid-file = cetus6001.pid
plugin-dir=lib/cetus/plugins
log-file=/usr/local/cetus/logs/cetus_6001.log
log-level=debug
# Check salve delay
disable-threads=false
check-slave-delay=true
slave-delay-down=5
slave-delay-recover=1
# For trouble
keepalive=true
verbose-shutdown=true
log-backtrace-on-crash=true
# For performance
enable-tcp-stream=true
enable-fast-stream=true
# For MGR
group-replication-mode=0
users.json需要配置连接后端数据库的用户名密码
{
"users": [
{
"user": "root",
#应用连接cetus的时候使用的密码
"client_pwd": "Root@2020",
#cetus连接后端数据库的时候使用的密码
"server_pwd": "Root@2020"
}
]
}
创建心跳表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for tb_heartbeat
-- ----------------------------
DROP TABLE IF EXISTS `tb_heartbeat`;
CREATE TABLE `tb_heartbeat` (
`p_id` varchar(128) NOT NULL,
`p_ts` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`p_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 1;
启动脚本
sudo /usr/local/cetus/bin/cetus --defaults-file=/usr/local/cetus/conf/proxy.conf --conf-dir=/usr/local/cetus/conf
#验证是否启动成功
mysql --prompt="admin>" --comments -h127.0.0.1 -P7001 -uadmin -padmin
#开机自启, 配置之后就可以使用service命令启停cetus了
touch /etc/init.d/cetus
chkconfig --add cetus
chkconfig cetus on
mha与cetus联动
#文件替换
scp /root/cetus-2.3.7/mha_ld/src/* root@192.168.56.101:/usr/share/perl5/vendor_perl/MHA/
scp /root/cetus-2.3.7/mha_ld/masterha_secondary_check root@192.168.56.101:/usr/bin/
chmod +x /usr/bin/masterha_secondary_check
#mha配置修改,增加如下几项
proxy_conf=/etc/mha/app1/cetus.cnf
#新增一个cetus.cnf内容如下
middle_ipport=192.168.56.104:7001
middle_user=admin
middle_pass=admin
注意事项
- 删除show slave status\G信息,stop slave;reset slave all;
- 开启了binlog,show master status就会有信息
- reset master不能用于有任何slave 正在运行的主从关系的主库
- 发生故障切换的时候MHA manager会将master的信息,从配置文件中删掉
- 挂掉的master恢复成slave,需要设置为只读
- MHA架构中mysql主从会来回切换,每一次故障切换之后,都要将mha配置文件,cetus配置文件,mysql配置文件检查一遍
- cetus,mysql最好都设置为开机自启动
常见问题
问题一:ERROR 1040 (HY000): Too many connections
解决办法:show variables like ‘%max_connections%’;调大max_connections,注意要考虑机器配置
问题二:复制延迟
解决办法:slave开启并行复制,添加以下参数
slave-parallel-type=LOGICAL_CLOCK
#建议与CPU核心数保持一致
slave-parallel-workers=2
#创建mysql.slave_master_info表,记录master信息
master_info_repository=TABLE
#那么slave就会在,每N个事件后,更新mysql.slave_master_info表
sync_master_info=1
创建mysql.slave_relay_info表来记录同步的位置信息
relay_log_info_repository=TABLE
#能避免由于从库relay log损坏导致的主从不一致的情形
relay_log_recovery=ON
问题三:wait连接数过多
解决办法:wait_timeout=1800
本文地址:https://blog.csdn.net/JB324/article/details/110187931
上一篇: 微服务架构下 CI/CD 如何落地
下一篇: 从Proxy到Vue3数据绑定