一、项目描述

项目名称:

使用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主从复制集群相关推荐

  1. 使用Docker搭建高可用Mysql数据库集群

    文章目录 前言 正文 选择哪一种搭建集群的方式 PXC Replication 安装docker Docker操作的基本命令 安装PXC集群 负载均衡 双机热备 具体实现细节 安装keepalived ...

  2. RabbitMQ:使用Docker构建RabbitMQ高可用负载均衡集群

    目录 一.构建RabbitMQ集群 1. 启动多个RabbitMQ节点 2. 加入集群 3. 配置镜像队列 二.HAProxy负载均衡 1. 安装HAProxy 2. 配置HAProxy 3. 启动 ...

  3. MyCAT+MySQL 搭建高可用企业级数据库集群

    第1章 课程介绍 课程介绍 1-1 MyCAT导学 试看 1-2 课程介绍 第2章 MyCAT入门 这一章中,我们将回顾了垂直切分,水平切分,分库分表等基础概念,然后快速回如何安装和启动MyCAT的, ...

  4. 百度可观测系列 | 如何构建亿级指标的高可用 TSDB 存储集群?

    [百度云原生导读]在前一篇<采集亿级别指标,Prometheus 集群方案这样设计中>,我们为大家介绍了针对针对亿级指标场景,百度云原生团队基于Prometheus 技术方案的研究,包括资 ...

  5. win2012故障转移mysql集群_Windows 2012 系统搭建高可用故障转移集群

    Windows 2012 系统搭建高可用故障转移集群 一.故障转移集群介绍 1.1系统介绍 故障转移群集是针对具有长期运行的内存中状态或具有大型的.频繁更新的数据状态的应用程序而设计.这些应用程序称为 ...

  6. RHCS套件实现高可用负载均衡集群(三)——共享存储

    注:此博文在博文"RHCS套件实现高可用负载均衡集群(二)"的基础上完成 实验开始前设置实验环境 target端配置--server3 [root@server3 ~]# yum ...

  7. RHCS套件实现高可用负载均衡集群(二)——Fence设备

    注:此博文在博文"套件实现高可用负载均衡集群(一)"的基础上完成 环境: 物理机:172.25.54.250,作为fence server1:172.25.54.1 , serve ...

  8. 高可用的MongoDB集群

    高可用的MongoDB集群 MongoDB 是一个可扩展的高性能,开源,模式自由,面向文档的数据库. 它使用 C++编写.MongoDB 包含一下特点: l  面向集合的存储:适合存储对象及JSON ...

  9. 总结 Underlay 和 Overlay 网络,在k8s集群实现underlay网络,网络组件flannel vxlan/ calico IPIP模式的网络通信流程,基于二进制实现高可用的K8S集群

    1.总结Underlay和Overlay网络的的区别及优缺点 Overlay网络:  Overlay 叫叠加网络也叫覆盖网络,指的是在物理网络的 基础之上叠加实现新的虚拟网络,即可使网络的中的容器可 ...

  10. 汇总-13台虚拟机搭建一个高可用负载均衡集群架构

    要求 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,具体需求如下. 设计你认为合理的架构,用visio把架构图画出来 搭建lnmp.tomcat+jdk环境 三个站点分别为:dis ...

最新文章

  1. windows下运行多个tomcat的配置
  2. gcovr 安装_Kudu 1.8.0 编译安装配置
  3. 码农节快乐|一个系统,高效解决复杂事件采集-计算-实时触达
  4. Linux内核生成版本号的一些研究
  5. C语言学习笔记---结构体指针
  6. case when then的用法-leetcode交换工资
  7. 自学python顺序-Django 学习顺序及入门要求?
  8. 广义线性模型(GLM, Generalized Linear Model)
  9. python爬取网页代码_python爬虫爬取网页的内容和网页源码不同?
  10. 路由器多区域 OSPF 配置
  11. 【经验总结】word2010没有“标题2、标题3”样式的解决办法
  12. 新浪微博登陆页面html代码,仿新浪微博登陆邮箱提示效果的js代码
  13. <<飞 鸟 集>> 泰戈尔
  14. 【设计模式从青铜到王者】第二篇:UML类图与面向对象编程
  15. linux下google浏览器字体不清晰,google浏览器的字体模糊的原因是什么_怎么解决 - 驱动管家...
  16. 内连接、外连接、全外连接、交叉连接用法汇总(个人记录使用)
  17. 电子科大信软互+班 程算I 2021机考真题
  18. 【STM32】使用STM32cubeMX的库读写FLASH数据
  19. win10滑动关机代码bat_win10滑动关机代码bat_win10设置自动关机和取消自动关机的bat命令...
  20. 10分钟教你如何自动化操控浏览器——Selenium测试工具

热门文章

  1. 前装车联网常见术语解释
  2. 2013年系统架构师考试题详解
  3. 日韩移动定位业务发展启示
  4. 麦语言和python区别_放弃文华财经,自己编程实现期货程序化交易
  5. iframe嵌入的页面只能在iframe中跳转显示问题以及高度自适应内容问题
  6. 姓名: 张轩瑞(小名happy) 性别: 男 年龄:3周岁 走失时间: 2018年7月1日下午4:30 家属电话:18735352768
  7. R语言编程技术(2)
  8. 【IOS网络通信】socket第三方库 AsyncSocket(GCDAsyncSocket)
  9. Android签名验证与反调试机制的对抗技术
  10. mysql5.5启动图解_MySQL5.5.19安装图解_MySQL