构建高可用MYSQL主从复制集群
一、项目描述
项目名称:
使用zabbix监控的高可用mysql主从复制集群
项目环境:
系统版本 | IP | 主机名 | 角色 |
CentOS 7.9.2009 | 192.168.8.128 | mysql-master | 主服务器 |
CentOS 7.9.2009 | 192.168.8.131 | mysql-slave | 从服务器 |
CentOS 7.9.2009 | 192.168.8.26 | mysql-router-1 | 路由中间件-1 |
CentOS 7.9.2009 | 192.168.8.204 | mysql-router-2 | 路由中间件-2 |
CentOS 7.9.2009 | 192.168.8.178 | master-zabbix | 监控主机 |
项目描述:
利用Keepalived构建一个高可用的MYSQL集群,提供读写分离、半同步模式的主从复制等功能,使用zabbix对集群进行监控,确保业务的稳定。
项目步骤:
1、准备好五台虚拟机,安装好centos7的操作系统,做好初始化工作,例如:配置IP地址,更改主机名,关闭防火墙和selinux;
2、编写脚本使用二进制安装的的方式在master服务器和slave服务器上一键安装好MySQL;
3、在MySQL集群服务器是配置好主从复制,一主一从,并且验证主从复制的效果;
4、在两个mysql-router节点安装好mysqlrouter中间件,配置好读写分离;
5、在两个mysql-router节点上安装好Keepalived,做好相关配置,实现双VIP,互为master和backup,实现高可用
6、在监控主机上安装zabbix,配置好监控整个集群服务器的CPU、内存、磁盘、和mysql服务以及微信告警;
7、测试验证读写分离和高可用,以及告警验证
遇到的问题一:重启mysql服务失败
故障原因: ERROR! The server quit without updating PID file
解决办法:查看日志,发现是mysql的配置文件my.cnf中开起慢日志的命令slow_query_log写成了
slow_qurey_log,更正过来就好了
遇到的问题二:关闭了firewalld 测试机还是无法使用VIP访问master服务器
故障原因:mysql-router节点中的 iptables 规则链阻止了测试机的访问
解决办法:iptables -F 清空了规则链
项目心得:
通过这个项目我对MySQL主从复制、HA、负载均衡以及MYSQL读写分离有了更加深刻的理解,认识到了部署一个项目过程中细心有非常重要的,并且需要提前规划项目架构;我在项目过程中也遇到了很多问题,自己都花时间去一一解决了,这也锻炼了自己的解决问题的能力。
二、项目拓扑结构
三、搭建mysql基于GTID模式的主从复制
GTID的概念:
GTID是在整个复制环境中对一个事务的唯一标识,全局唯一,一个事务对应一个GTID代替传统的binlog+pos复制,使用master_auto_position=1自动匹配GTID断点进行复制,在slave端也必须开起binlog,slave在接受master的binlog时,会校验GTID值
原理:
master更新数据时,会在事务前产生GTID,异同记录到binlog日志中,slave端的i/o 线程将变更的binlog,写入到本地的relay log中,sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录,如果有记录,说明该GTID的事务已经执行,slave会忽略,如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
搭建步骤:
1、二进制安装mysql
在mysql-master和mysql-slave上都安装mysql
版本:mysql-5.7.37
安装包可以去官网下载:MySQL :: 下载 MySQL Community Server
二进制安装脚本如下:
#!/bin/bash
#解压mysql二进制安装包
tar xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz
#移动MySQL解压后的文件到/usr/local下改名叫mysql
mv mysql-5.7.37-linux-glibc2.12-x86_64 /usr/local/mysql
#新建组和用户 mysql
groupadd mysql
#mysql这个用户的shell 是/bin/false 属于mysql组
useradd -r -g mysql -s /bin/false mysql
#关闭firewalld防火墙服务,并且设置开机不要启动
service firewalld stop
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久关闭selinux
sed -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config#新建存放数据的目录
mkdir /data/mysql -p
#修改/data/mysql目录的权限归mysql用户和mysql组所有,这样mysql用户可以对这个文件夹进行读写了
chown mysql:mysql /data/mysql/
#只是允许mysql这个用户和mysql组可以访问,其他人都不能访问
chmod 750 /data/mysql/
#进入/usr/local/mysql/bin目录
cd /usr/local/mysql/bin/
#初始化mysql
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql &>passwd.txt#让mysql支持ssl方式登录的设置./mysql_ssl_rsa_setup --datadir=/data/mysql/#获得临时密码
tem_passwd=$(cat passwd.txt |grep "temporary"|awk '{print $NF}')
#$NF表示最后一个字段
# abc=$(命令) 优先执行命令,然后将结果赋值给abc
#修改PATH变量,加入mysql bin目录的路径
#临时修改path变量的值
PATH=/usr/local/mysql/bin/:$PATH
#重新启动Linux系统后也生效,永久修改
echo 'PATH=/usr/local/mysql/bin:$PATH' >>/root/.bashrc#复制support-files里的mysql.server文件到/etc/init.d/目录下叫mysqld
cp ../support-files/mysql.server /etc/init.d/mysqld
#修改/etc/init.d/mysqld脚本文件里面的datadir目录的值
sed -i '70c datadir=/data/mysql' /etc/init.d/mysqld#生成/etc/my.cnf配置文件
cat >/etc/my.cnf <<EOF
[mysqld_safe]
[client]
socket=/data/mysql/mysql.sock
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
[mysql]
auto-rehash
prompt=\\u@\\d \\R:\\m mysql>
EOF#启动mysqld服务
service mysqld start
#设置mysqld服务开机启动/sbin/chkconfig mysqld on
#将mysqld添加到Linux系统的管理服务名单里
/sbin/chkconfig --add mysqld
#修改密码(初次修改密码需要使用--connetc-expired-password 选项 -e 后面接的表示是在MySQL里面需要执行的命令 execute 执行)
mysql -uroot -p$tem_passwd --connect-expired-password -e "set password='123456'"
2、配置master和slave上的相关设置
修改配置文件:vim /etc/my.cnf
配置master:
[mysqld].....
general_log # 开起二进制日志
server_id = 1 #设置server_id ,主从不能一样
gtid-mode=ON
enforce-gtid-consistency=ON
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second
.....
配置slave:
vim /etc/my.cnf[mysqld].....
server_id = 2 #添加server_id 配置
log_bin
gtid-mode=ON
enforce-gtid-consistency=ON
log_slave_updates=ON
rpl_semi_sync_slave_enabled=1
.....
配置半同步还需要安装一个插件:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; #安装插件
3、在master上创建给slave过来复制二进制日志的用户
创建用户:
root@(none) 10:57 mysql>create user 'chen_slave'@'%' identified by '123456';
授权用户可以有复制权限:
grant replication slave on *.* to 'chen_slave'@'%' identified by '123456';
4、在slave上添加授权信息
CHANGE MASTER TO MASTER_HOST='192.168.8.128', #master ip地址MASTER_USER='chen_slave', # master上拥有复制权限的用户名MASTER_PASSWORD='123456', # master的密码MASTER_PORT=3306, #开放的端口MASTER_AUTO_POSITION=1 #事务id,从1开始
5、给master上做全备,导出数据到slave,保持master和slave的原始数据一致
使用mysqldump给主服务做备份
mysqldump -uroot -p'123456' --all-databases >/backup/all_db.sql
使用scp传输到从服务器上并导入
#传输
scp /backup/all_db.sql root@192.168.8.131:/#导入
mysql -uroot -p'123456' <all_db.sql
6、在slave上启动salve服务,查看IO线程和SQL线程是否启动
启动slave服务:
root@(none) 18:58 mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
查看slave的状态:IP线程和SQL线程都是yes表示启动成功
root@(none) 19:00 mysql>show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.8.128Master_User: chen_slaveMaster_Port: 3306Connect_Retry: 60Master_Log_File: localhost-bin.000012Read_Master_Log_Pos: 154Relay_Log_File: localhost-relay-bin.000020Relay_Log_Pos: 375Relay_Master_Log_File: localhost-bin.000012Slave_IO_Running: YesSlave_SQL_Running: Yes
查看master的状态:
root@test 19:09 mysql>show master status;
+----------------------+----------+--------------+------------------+----------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+----------------------------------------+
| localhost-bin.000013 | 336 | | | dbccc6ea-c1e8-11ec-bdbc-000c29a39b44:1 |
+----------------------+----------+--------------+------------------+----------------------------------------+
reset slave :在从服务器上清除填写的master的信息
基于GTID复制的优点:
1、方便进行故障转移,记录master最后事务的GTID值。
2、slave不会丢失master的任何修改(开起了log_slave_updates)
四、使用MySQL Router实现读写分离
读写分离的优势:
负载均衡,提高并发能力
MySQL Router 部署图
1、在mysql-router-1和mysql-router-2上安装MySQL Router中间件
版本:mysql-router-8.0.29
下载地址:MySQL :: Download MySQL Router
解压:
tar xf mysql-router-community-8.0.29-1.el7.x86_64.rpm
就OK了
日志:/var/log/mysqlrouter
2、配置/etc/mysqlrouter/mysqlrouter/conf文件
[routing:read_write]
bind_address = 0.0.0.0 #监听请求的IP地址(0.0.0.0表示监听主机上的所有地址)
bind_port = 7001 #监听请求的端口
mode = read-write
destinations = 192.168.8.131:3306 # 转发的目标
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9[routing:read_only]
bind_address = 0.0.0.0
bind_port = 7002
mode = read-only
destinations = 192.168.8.128:3306
max_connections = 65535
max_connect_errors = 100
client_connect_timeout = 9
查看服务是否起来
[root@localhost mysqlrouter]# netstat -anplut|grep mysql
tcp 0 0 0.0.0.0:7001 0.0.0.0:* LISTEN 4790/mysqlrouter
tcp 0 0 0.0.0.0:7002 0.0.0.0:* LISTEN 4790/mysqlrouter
3、验证读写分离的效果
[root@localhost ~]# mysql -h 192.168.8.26 -P 7001 -uyeye -p'123456';
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.37-log MySQL Community Server (GPL)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.yeye@(none) 20:00 mysql>
五、使用Keepalived实现高可用
原理:
VRRP原理及配置 - 榕霖 - 博客园 (cnblogs.com)
1、在mysql-router-1和mysql-router-2上安装Keepalived
yum install keepalived -y
2、修改配置文件,配置好双VIP
mysql-router-1
vrrp_instance VI_1 {state MASTER # 状态interface ens33 #监听的网卡virtual_router_id 111 #虚拟路由idpriority 120 #优先级,高的成为masteradvert_int 1 # 隔多久发一次通告报文authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.8.186 #vip}
}vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 222priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.8.188}
}
mysql-router-2
vrrp_instance VI_1 {state BACKUP # 状态interface ens33 #监听的网卡virtual_router_id 111 #虚拟路由idpriority 100 #优先级,高的成为masteradvert_int 1 # 隔多久发一次通告报文authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.8.186 #vip}
}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 222priority 120advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.8.188}
}
3、测试验证
使用VIP登录mysql,模拟其中一台mysql-router宕机的情况
脑裂:
现象:master和backup上都有VIP,用户可以通过master上的VIP进行连接也可以通过backup上的VIP进行连接。
产生的原因:
- virtual_router_id 不一致
- 防火墙阻止了master和backup之间的通信
- 网络故障
- 高可用服务器上心跳网卡地址等信息配置不正确,导致发送心跳失败
解决办法:
- 添加冗余的心跳线
- 做好做脑裂现象的监控报警
- 设置仲裁机制
构建高可用MYSQL主从复制集群相关推荐
- 使用Docker搭建高可用Mysql数据库集群
文章目录 前言 正文 选择哪一种搭建集群的方式 PXC Replication 安装docker Docker操作的基本命令 安装PXC集群 负载均衡 双机热备 具体实现细节 安装keepalived ...
- RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群
目录 一.构建RabbitMQ集群 1. 启动多个RabbitMQ节点 2. 加入集群 3. 配置镜像队列 二.HAProxy负载均衡 1. 安装HAProxy 2. 配置HAProxy 3. 启动 ...
- MyCAT+MySQL 搭建高可用企业级数据库集群
第1章 课程介绍 课程介绍 1-1 MyCAT导学 试看 1-2 课程介绍 第2章 MyCAT入门 这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的, ...
- 百度可观测系列 | 如何构建亿级指标的高可用 TSDB 存储集群?
[百度云原生导读]在前一篇<采集亿级别指标,Prometheus 集群方案这样设计中>,我们为大家介绍了针对针对亿级指标场景,百度云原生团队基于Prometheus 技术方案的研究,包括资 ...
- win2012故障转移mysql集群_Windows 2012 系统搭建高可用故障转移集群
Windows 2012 系统搭建高可用故障转移集群 一.故障转移集群介绍 1.1系统介绍 故障转移群集是针对具有长期运行的内存中状态或具有大型的.频繁更新的数据状态的应用程序而设计.这些应用程序称为 ...
- RHCS套件实现高可用负载均衡集群(三)——共享存储
注:此博文在博文"RHCS套件实现高可用负载均衡集群(二)"的基础上完成 实验开始前设置实验环境 target端配置--server3 [root@server3 ~]# yum ...
- RHCS套件实现高可用负载均衡集群(二)——Fence设备
注:此博文在博文"套件实现高可用负载均衡集群(一)"的基础上完成 环境: 物理机:172.25.54.250,作为fence server1:172.25.54.1 , serve ...
- 高可用的MongoDB集群
高可用的MongoDB集群 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l 面向集合的存储:适合存储对象及JSON ...
- 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群
1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络: Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...
- 汇总-13台虚拟机搭建一个高可用负载均衡集群架构
要求 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下. 设计你认为合理的架构,用visio把架构图画出来 搭建lnmp.tomcat+jdk环境 三个站点分别为:dis ...
最新文章
- windows下运行多个tomcat的配置
- gcovr 安装_Kudu 1.8.0 编译安装配置
- 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
- Linux内核生成版本号的一些研究
- C语言学习笔记---结构体指针
- case when then的用法-leetcode交换工资
- 自学python顺序-Django 学习顺序及入门要求?
- 广义线性模型(GLM, Generalized Linear Model)
- python爬取网页代码_python爬虫爬取网页的内容和网页源码不同?
- 路由器多区域 OSPF 配置
- 【经验总结】word2010没有“标题2、标题3”样式的解决办法
- 新浪微博登陆页面html代码,仿新浪微博登陆邮箱提示效果的js代码
- <<飞 鸟 集>> 泰戈尔
- 【设计模式从青铜到王者】第二篇:UML类图与面向对象编程
- linux下google浏览器字体不清晰,google浏览器的字体模糊的原因是什么_怎么解决 - 驱动管家...
- 内连接、外连接、全外连接、交叉连接用法汇总(个人记录使用)
- 电子科大信软互+班 程算I 2021机考真题
- 【STM32】使用STM32cubeMX的库读写FLASH数据
- win10滑动关机代码bat_win10滑动关机代码bat_win10设置自动关机和取消自动关机的bat命令...
- 10分钟教你如何自动化操控浏览器——Selenium测试工具
热门文章
- 前装车联网常见术语解释
- 2013年系统架构师考试题详解
- 日韩移动定位业务发展启示
- 麦语言和python区别_放弃文华财经,自己编程实现期货程序化交易
- iframe嵌入的页面只能在iframe中跳转显示问题以及高度自适应内容问题
- 姓名: 张轩瑞(小名happy) 性别: 男 年龄:3周岁 走失时间: 2018年7月1日下午4:30 家属电话:18735352768
- R语言编程技术(2)
- 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
- Android签名验证与反调试机制的对抗技术
- mysql5.5启动图解_MySQL5.5.19安装图解_MySQL