架构图

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 = 0log-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
#一定要同步proxy_heart_beat的数据到binlog中,cetus检查复制延迟的功能依赖这个库的数据
binlog-do-db=proxy_heart_beat
binlog-do-db=members#调优参数
#数据缓冲区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;

部署与配置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的状态
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
#启动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 &

模拟故障恢复

#模拟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

备库重搭

#从主库导出数据
mysqldump -uroot -pRoot@2020 -S /var/lib/mysql/mysql.sock --default-character-set=utf8 -q --single-transaction --master-data --databases members proxy_heart_beat > /tmp/members-cetus.sql
#停止复制线程,删除从库的数据
stop slave
reset slave all
drop database members
drop database proxy_heart_beat
#将数据导入到从库,如果从库也开启了binlog,记得先执行reset master
mysql -uroot -pRoot@2020 --default-character-set=utf8 < members-cetus.sql
#配置主从关系
CHANGE MASTER TO MASTER_HOST='192.168.56.101',MASTER_PORT=3306,MASTER_USER='replication',MASTER_PASSWORD='Repl@2020'

联动读写分离中间件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, 配置为2则cetus会启动两个子进程,不要超过CPU核心数
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
#主库的IP和端口
proxy-backend-addresses=192.168.56.101:3306
#从库的ip和端口
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

注意事项

  1. 每一次故障切换之后mha的进程就会停掉
  2. 开启了binlog,show master status就会有信息
  3. reset master不能用于有任何slave 正在运行的主从关系的主库
  4. 发生故障切换的时候MHA manager会将master的信息,从配置文件中删掉
  5. 挂掉的master恢复成slave,需要设置为只读,但是这个只读知识针对普通用户的,对超级用户无效
  6. 每一次故障切换之后,都要将mha配置文件,cetus配置文件,mysql配置文件检查一遍再重新启动mha进程
  7. cetus,mysql设置为开机自启动
  8. 权限管理,只有搭建数据库的同学和DBA才能登录数据库后台,其他同学通过普通用户连接cetus的方式登入数据库。
  9. 查询的时候不要开启事务,如果开启了事务cetus会强制将查询路由到主库
  10. binlog一定要同步proxy_heart_beat库,cetus依赖这个库的数据检查复制延迟
  11. 如果从库与主库之间的延迟超过了binlog的保存时间,需要进行备库重搭

常见问题

问题一:ERROR 1040 (HY000): Too many connections
解决办法:show variables like ‘%max_connections%’;调大max_connections,注意要考虑机器配置,每一个连接都会消耗进程能打开的最大文件数
问题二:复制延迟
解决办法:slave开启并行复制,添加以下参数,mysql版本至少要是5.7

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

参考文档

cetus + mha高可用方案
cetus官方文档
mysql5.7官方文档

MHA+Cetus+Mysql搭建读写分离的高可用集群相关推荐

  1. mysql lvs 读写分离_mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 目录 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方案 ...

  2. Linux 搭建 MariaDB Galera Cluster 高可用集群

    MariaDB Galera Cluster 集群介绍 MariaDB Galera Cluster(下文简称MGC集群),是一套在MySQL innodb存储引擎上面实现多主.数据实时同步以及强一致 ...

  3. kubeadm一键搭建kubernetes1.14.1高可用集群

    一,基础环境配置 环境 版本 debian09 Debian 4.9.144-3 (2019-02-02) x86_64 GNU/Linux kubectl 1.14.1 kubeadmin 1.14 ...

  4. 采用 redis主从 + 哨兵(sentinel) + vip漂移搭建一套redis高可用集群

    一.单个实例 当系统中只有一台redis运行时,一旦该redis挂了,会导致整个系统无法运行. 单个实例 二.备份 由于单台redis出现单点故障,就会导致整个系统不可用,所以想到的办法自然就是备份( ...

  5. 采用ipvsadm管理工具,及Keepalived软件检测服务器的状态,搭建负载均衡的高可用集群

    前言 ipvsadm是Linux虚拟服务器的管理命令,是用于设置.维护和检查Linux内核中虚拟服务器列表的命令.Linux虚拟服务器可用于基于两个或更多个节点的集群构建可扩展的网络服务.群集的活动节 ...

  6. Ansible搭建hadoop3.1.3高可用集群

    一.节点信息 内核版本:3.10.0-1062.el7.x86_64 系统版本:Red Hat Enterprise Linux Server release 7.7 (Maipo) 节点 ip 内存 ...

  7. 手动搭建k8s-1.16.6高可用集群之部署worker节点-部署kubelet组件

    kubelet 运行在每个 worker 节点上,接收 kube-apiserver 发送的请求,管理 Pod 容器,执行交互式命令,如 exec.run.logs 等. kubelet 启动时自动向 ...

  8. Mycat - 实现数据库的读写分离与高可用

    前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:"读课文第三段".我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:&qu ...

  9. mysql架构 视频_企业常见MySQL架构应用实战(高可用集群系统+调优经验)视频课程...

    第一章 MySQL企业常用架构应用实战(主从复制+性能调优) 1.企业级MySQL发行版Percona Server.MariaDB选型 2.常用MYSQL性能调优策略之系统级别调优(1) 3.常用M ...

最新文章

  1. cc arm linux gcc,(80分请教):armcc 与 arm-elf-gcc的区别?
  2. 趣谈网络协议笔记-二(第十七讲)
  3. oh-my-zsh upgrade problem
  4. ubuntu中mysql怎么退出命令_Ubuntu下MySQL简单操作
  5. var模型的matlab实现_Eviews中VAR模型的操作、脉冲响应分析和方差分解的实现
  6. TCP基础知识 复习
  7. 不相交集类及其应用生成迷宫
  8. 反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)加入自己的思考(pytorch函数)(二)
  9. 安卓直播详细教程(一)-----bilibili开源播放器
  10. rHadoop分布式安装与配置
  11. ALINETEK 2.8寸 TFTLCD驱动原理
  12. oracle12c不使用cdb模式,Oracle 12c实现手工建库而非CDB及CDB创建的方法
  13. mybati-plus自定义sql异常Invalid bound statement (not found)封装的sql查询正常
  14. 试分析培正强智教务系统选课卡顿的原因
  15. linux更改库文件vfp,linux交叉编译的库在链接时提示:xxx uses VFP register arguments xxx does not...
  16. UVA 10187 校长的烦恼
  17. PlatoFarm进展不断,接连上线正式版以及推出超级原始人NFT
  18. MacBook M1配置Pytorch
  19. SQL语言数据库自学整理1:聚合函数(Aggregate Founction) 2022.3.8
  20. 清除U盘隐藏区域(去除U盘启动)

热门文章

  1. xp序列号大全可通过正版验证的XP序列号发布
  2. (一)MFC读取并显示一幅位图图像,并获取鼠标点击位置的像素坐标和灰度值
  3. C++ 复数类编写小练习
  4. 安装linux7 没有图形化界面,CentOs7 安装后无图形界面,安装图形界面(yum groupinstall GNOME Desktop Graphical Administration ...
  5. 软件性能常用三大指标
  6. 求一个无序数组的中位数。
  7. Jetpack学习与实践
  8. zeng studio的项目窗口PHP Explorer
  9. 衡量数据“像不像”——协方差与相关系数
  10. 为什么服务器远程登录不上网,服务器远程登录不上的处理方法