1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > MHA+Cetus+Mysql搭建读写分离的高可用集群

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

时间:2023-01-02 07:37:35

相关推荐

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

架构图

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.servicesystemctl stop firewalld.servicesystemctl disable firewalld.service

安装MySQL并配置主从

卸载mariadb

#检查rpm -qa|grep mariadb#卸载rpm -e --nodeps mariadb-libs#复查rpm -qa|grep mariadb

安装Yum Repository

wget /get/mysql57-community-release-el7-8.noarch.rpmyum -y install mysql57-community-release-el7-8.noarch.rpmyum clean allyum makecache

安装mysql-server

#安装yum install mysql-community-server#修改配置文件以无密码方式登入mysqlvim /etc/f#增加选项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=1rpl_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(产生大量二进制日志)、MIXEDbinlog-format=ROWbinlog_cache_size=128mmax_binlog_cache_size=512mmax_binlog_size=256Mexpire-logs-days=7binlog-ignore-db=performance_schemabinlog-ignore-db=information_schemabinlog-ignore-db=sys#一定要同步proxy_heart_beat的数据到binlog中,cetus检查复制延迟的功能依赖这个库的数据binlog-do-db=proxy_heart_beatbinlog-do-db=members#调优参数#数据缓冲区buffer pool大小,建议使用物理内存的 75%innodb_buffer_pool_size = 3G#将buffer pool拆分成多个实例,建议每个实例大小在1G左右,但是不要超过CPU核心数innodb_buffer_pool_instances=3#开启慢查询日志,用于后续优化sqlslow_query_log = 1long_query_time = 3slow_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@',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@' WITH GRANT OPTION;flush privileges;#创建用于同步的账号grant replication slave on *.* to 'replication'@'%' identified by 'Repl@';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 /repo/epel-7.repo #安装MHA manageryum 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.rpmrpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

Manager配置文件

mkdir -p /etc/mha/app1/logsmkdir -p /etc/mha/app1/workdir/touch [server default]manager_log=/etc/mha/app1/logs/manager.logmanager_workdir=/etc/mha/app1/workdir/master_binlog_dir=/var/lib/mysql#设置mysql数据库的用户名密码,主库从库创建用户的时候要保持一致user=rootpassword=Root@#设置监控主库,发送ping包的时间间隔,尝试三次没有回应的时候自动进行failoverping_interval=2#设置复制用户的密码repl_password=123#设置复制环境中的复制用户名repl_user=repl#设置ssh的登录用户名ssh_user=root#设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)shutdown_script=""#设置发生切换后发送的报警的脚本report_script=""[server1]hostname=192.168.56.101port=3306[server2]hostname=192.168.56.102port=3306#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slavecandidate_master=1#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的mastercheck_repl_delay=0

启动与检查

#检查MHA manager的状态masterha_check_status --conf=/etc/mha/app1/f#检查免密登录的状态masterha_check_ssh --conf=/etc/mha/app1/f#检查主从复制的状态masterha_check_repl --conf=/etc/mha/app1/f#启动MHA managernohup masterha_manager --conf=/etc/mha/app1/f --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语句之后登录到故障主机执行如下命令#先启动mysqlservice 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/f#检查cetus的配置文件,MHA与cetus联动之后也会将新的master配置到proxy-backend-addresses,挂掉的master配置到proxy-read-only-backend-addressescat /usr/local/cetus/conf/proxy.conf#之后再执行mha的检查脚本,检查出来有问题就修改,直至检查通过再启动mha managermasterha_check_ssh --conf=/etc/mha/app1/fmasterha_check_repl --conf=/etc/mha/app1/f

备库重搭

#从主库导出数据mysqldump -uroot -pRoot@ -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 slavereset slave alldrop database membersdrop database proxy_heart_beat #将数据导入到从库,如果从库也开启了binlog,记得先执行reset mastermysql -uroot -pRoot@ --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@'

联动读写分离中间件Cetus

cetus安装

#安装包下载,记得下载release版本[cetus release包下载地址](/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=ONmake install#安装一个mysql客户端,后续用来管理cetus,和查看代理的后端数据库的状态yum install mysql

Cetus配置

配置文件初始化

#Cetus运行前还需要编辑配置文件,配置文件说明:/session-replay-tools/cetus/blob/master/doc/cetus-rw-profile.mdcd /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-switchdaemon = true# Loaded Pluginsplugins=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.1proxy-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 Configurationadmin-address=0.0.0.0:7001admin-username=adminadmin-password=admin# Backend Configuration, use test db and username createddefault-db=membersdefault-username=root#连接池大小default-pool-size=100max-resp-size=10485760long-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 usermax-open-files = 65536pid-file = cetus6001.pidplugin-dir=lib/cetus/pluginslog-file=/usr/local/cetus/logs/cetus_6001.loglog-level=debug# Check salve delaydisable-threads=falsecheck-slave-delay=trueslave-delay-down=5slave-delay-recover=1# For troublekeepalive=trueverbose-shutdown=truelog-backtrace-on-crash=true# For performanceenable-tcp-stream=trueenable-fast-stream=true# For MGRgroup-replication-mode=0

users.json需要配置连接后端数据库的用户名密码

{"users": [{"user": "root",#应用连接cetus的时候使用的密码"client_pwd": "Root@",#cetus连接后端数据库的时候使用的密码"server_pwd": "Root@"}]}

创建心跳表

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/cetuschkconfig --add cetuschkconfig 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/f#新增一个f内容如下middle_ipport=192.168.56.104:7001middle_user=adminmiddle_pass=admin

注意事项

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。