基于双vip+GTID的半同步主从复制集群项目(MySQL集群)

news/2024/4/27 19:18:35/文章来源:https://blog.csdn.net/qq_57629191/article/details/137121602

项目标题:基于keepalived+GTID的半同步主从复制MySQL集群

准备七台机器,其中有四台时MySQL服务器,搭建主从复制的集群,一个master,2个slave服务器,一个延迟备份服务器。同时延迟备份服务器也可以充当异地备份服务器,数据从master或者slave上导出,然后rsync到备份服务器。

2台MySQL router服务器,安装好keeplived软件,实现高可用的读写分离服务。

一台ansible中控服务器,显现对MySQL整个集群内的服务器进行批量管理。

项目步骤:

搭建好4台MySQL数据库服务器,安装好mysql系统

  1. 每台机器都要安装mysql,使用scp将mysql文件传过去,安装好;

对于ansible中控机,需要安装ansible:

配置好ansible:

yum install epel-release -y;

yum install ansible -y;

  1. 搭建好一台master,三台半同步slave机(开启二进制日志,安装半同步插件,开启半同步配置参数)

在master上新建一个授权用户,给slave复制二进制文件使用:

root@(none) 06:52  mysql>grant replication slave on *.* to 'project'@'192.168.10.%' identified by 'Sanchuang123#';

一台配置成master机,打开二进制文件,安装半同步插件,开启半同步配置参数;其余几台根据各自的配置参数配置好;

配置好后,service mysqld stop 以及service mysqld start;

至此,一台master、两台slave机,一台延迟备份的slave机你,一台ansible都配置好了。

3、将master机的数据库导出成一个sql文件all_db.sql。

安装ansible服务器,通过ansible导入数据到各台机器

1、ansible配置文件中定义主机清单,把管理的主机IP写进去:
[db]

192.168.10.144

192.168.10.145

192.168.10.146

192.168.10.147

[dbslaves]

192.168.10.145

192.168.10.146

192.168.10.147

2、让ansible中控机与所有的MySQL节点服务器建立免密通道,测试通道是否建立成功。

3、在ansible机器上拿到master的基础数据:scp root@192.168.10.144:/root/all_db.sql拿到sql文件。

将基础数据上传到所有slave机器上:ansible -m copy -a “src=/root/all_db.sql dest=/root” dbslaves

将数据库还原:每台机器使用mysql -uroot -p </root/all_db.sql单独恢复。

错误一:恢复数据的时候报错了

原因:打开了gtid,影响了数据的恢复

解决:关掉配置好的gtid,service mysqld restart重启mysqld服务器,在重传数据。

此时,基础数据都准备好了。

最后再把GTID功能打开,启动主从复制功能;

1、在所有slave上指定master:

root@(none) 01:20  mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.144',

    -> MASTER_USER='project',

    -> MASTER_PASSWORD='Sanchuang123#',

    -> MASTER_PORT=3306,

    -> MASTER_AUTO_POSITION=1;

root@(none) 01:20  mysql>start slave;

错误二:配置完之后,slave中的I/O线程没有被打开(之后延迟备份那台slave的线程打开了)。

原因:受到以前配置的影响,slave的GTID比master上的GTID还大,也就是slave上的数据比master上的数据还多。

解决:在所有的slave上清除master信息和slave信息。

root@(none) 01:20  mysql>reset master;

root@(none) 01:20  mysql>stop slave;

root@(none) 01:20  mysql>reset slave all;

root@(none) 01:20  mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.144',

    -> MASTER_USER='project',

    -> MASTER_PASSWORD='Sanchuang123#',

    -> MASTER_PORT=3306,

    -> MASTER_AUTO_POSITION=1;

root@(none) 01:20  mysql>start slave;

root@(none) 01:20  mysql>show slave status\G;(查看是否打开I/O线程)

检测主从复制是否配置正确;此时GTID编号都一样。

延迟备份的slave机的配置:开启延迟备份功能,从slave1延迟备份数据

root@(none) 01:20  mysql>reset master;

root@(none) 01:20  mysql>stop slave;

root@(none) 01:20  mysql>reset slave all;

root@(none) 01:20  mysql>CHANGE MASTER TO MASTER_HOST='192.168.10.145',

    -> MASTER_USER='project',

    -> MASTER_PASSWORD='Sanchuang123#',

    -> MASTER_PORT=3306,

    -> MASTER_AUTO_POSITION=1;

root@(none) 01:20  mysql>CHANGE MASTER TO MASTER_DELAY=100;(单位是秒)

root@(none) 01:20  mysql>start slave;

测试延迟备份是否成功;

在master上创建备份脚本和备份任务,每天2:30同步数据

备份脚本:

[root@sc-master backup]# cat alldb.sh

#!/bin/bash

mkdir -p /backup

mysqldump -uroot -p'Sanchuang123#' --all-databases --triggers --routines --events >/backup/$(date +%Y%m%d%H%M%S)_all_db.sql

scp /backup/$(date +%Y%m%d%H%M%S)_all_db.sql 192.168.10.144:/backup

设置计划任务:

Crontab -e

30 2 * * * bash /backup/alldb.sh

实现读写分离的部署:MySQL router

下载MySQL router包,rpm安装,修改配置文件,开启服务。

在master上建立两个授权用户,一个读用户,一个写用户:

root@(none) 01:20  mysql>grant select on *.* to ‘scread’@’%’ identified by ‘Sanchuang123#’;

root@(none) 01:20  mysql>grant all on *.* to ‘scwrite’@’%’ identified by ‘Sanchuang123#’;

启动MySQL router机器:service mysqlrouter restart;

在客户端(虚拟机)上测试读写分离的效果,使用两个账号一个读,一个写。

client----------->MySQL router--------------->master/slave

登录不同的用户,测试完读写分离。

读写分离的关键点:其实是用户的权限,让不同的用户连接不同的端口,最后仍然要到后端的mysql服务器里去验证是否有读写的权限,MySQL router只是做了读写的分流,让应用程序去连接不同的端口。

主要是用户权限的控制,有写权限的用户使用读的端口也可以写。读的用户走写的通道也只能读。

其他的中间件:mycat数据库中间件,使用Java编写。

使用keepalived排除MySQL router的单点故障,实现高可用

关于keepalived知识点:

C语言编写的路由软件,基于传输层的,提供给Linux系统简单而强大的负载均衡和高可用性能。

高可用HA:不会出现单点故障,一个坏了,另外的能顶替,不影响工作,有备份。

实现HA常用软件:heartbeat、keepalived、HAproxy

Keepalived2大核心功能:

-->1、负载均衡loadbalance:ipvs====》lvs软件在Linux内核中已经安装,不需要单独安装。

    -->2、高可用:底层基于vrrp协议,虚拟路由器冗余协议。

Vrrp协议:虚拟路由冗余协议。一组路由器协同工作,但仍不同的角色,有master角色,有backup角色:master状态的路由器会承担实际的数据流量转发任务;backup状态的路由器监听master路由器的状态,并在master路由器发生故障时,接替其工作,从而保证业务的平滑切换。

Master是选举上来的;

Vip:虚拟IP地址,这个IP飘到哪里,哪一台机器就是master;谁成为master谁就成为默认网关。

VRRP协议报文是从同一个组播224.0.0.18上传出去的。只有机器上运行了vrrp协议就会收这个报文,然后选举优先级最高的机器成为master,vip飘到这个机器上。

Vrrp协议工作在哪里?--网络层

Vrrp的工作原理:

选举master:

·所有的路由器或者服务器发送vrrp宣告报文,进行选举,必须是相同的vrid和认证密码的,优先级高的服务器或者路由器会被选举为master,其他机器是backup;

·Master定时发送vrrp宣告报文,以便向backup路由器告知自己的存活情况。默认是间隔一秒。

·接收master设备发送的vrrp宣告报文,判断master设备状态是否正常。如果超过一秒没有收到vrrp报文,就认为master挂了,开始重新选举新的master,vip就会漂移到新的master上。

下载mysql router软件,修改配置文件,启用服务,一共配置了两台mysql router。

使用两台机器是为了避免单点故障。使用keepalived实现高可用。

两台机器都安装keepalived:yum insatll keepalived -y

修改配置文件:密码认证,vip,优先级,监听接口,虚拟路由id的编号(两台要一样),一台设置成master,一台设置成backup。

重启服务service keepalived restart;

错误三:使用ip add查看发现,两台MySQL router都被选为master,出现脑裂现象

原因:未关闭防火墙,所以两台机器不能正常通信

解决:service firewalld stop;重启服务service keepalived restart;再ip add就会发现只有一台的IP地址是vip;

脑裂现象:多态机器出现vip。

  1. 虚拟路由id不一样
  2. 网络通信有问题
  3. 认证密码不一样

脑裂有没有危害?如果有危害对业务有什么影响?

答案:没有危害,能正常访问,反而还有负载均衡的作用。脑裂恢复的时候,还是有影响的,会短暂的中断,影响业务。

测试:当master挂掉之后,backup会马上顶上:

此时,vip飘在mysql router 1上面,使用service keepalived stop关闭服务,第二台MySQL router就监听不到master的宣告了,使用ip add就能看到vip已经飘到了mysql router 2上。当mysql router 1恢复服务后,master又会回到MySQL router 1上。

注:

为了实现读写分离,在MySQL router中设置了两个端口,一个实现读7001,一个实现写7002。在MySQLrouter中配置keepalived的配置文件时,bind_address(绑定本机地址)要配置成0.0.0.0,也就是随机ip,因为这个ip是vip分配的,实现MySQL router一个网卡有多个IP。MySQL router其实只是一个分流的工具,主要是用户权限的控制:让不同的用户连接不同的端口,最后仍然是后端的服务器去验证是否有读写的权限。

只有一台MySQL router容易出现单点故障,所以使用keepalived实现HA,keepalived中的vrrp协议实现master的切换。

Keepalived使用组播方式,IP包里的目的IP是一个组播地址。

Keepalived实现主备切换:通过选举比较虚拟ip和路由ip是不是一样的,比较优先级,确定master,配置虚拟ip。当master挂掉了,backup通过监听马上就会发现收不到master的宣告了,虚拟ip就会飘到backup上。

双vip的实现:会有一台router是闲置的,为了避免资源浪费,实现双虚拟ip

做两个vrrp实例,两个vip,两个实例互为主备。

在router1的配置文件中在配置一个backup实例,即一个实例是master,一个实例是backup,虚拟地址要再找一个(192.168.2.186);

在router2的配置文件中在配置一个,master实例,即一个实例是master,一个实例是backup,虚拟地址也是192.168.2.186;

刷新服务:service keepalived restart;

此时ip add:router1的IP是192.168.2.187,router2的IP是192.168.2.186。如果其中一台挂掉了,另一台就会有两个vip,两台机器互为主备。

此时用户怎么知道用哪个?

答:同一个域名对应两个ip,使用dns域名解析做负载均衡。(买一个域名,添加多个ip,就能实现dns解析实现负载均衡实验中用的私网ip,实际上我们要用公网ip)

User----->dns--轮询算法-->192.168.2.187,192.168.2.186

高可用的开源架构:MMM,MHA

OLTP联机事务处理和OLAP联机分析处理:OLTP主要是对数据的增删改,侧重实时性;OLAP主要是对数据的查询,侧重大数据量查询。

MySQL的压力测试工具:Tpcc、Sysbench。

Sysbench的使用:

官方下载MySQL安装源,

Yum install mysql-community-devel automake libtool;

使用香港服务器下载sysbench源码包,传递到当前服务器,下载相关软件,解决软件依赖;

错误四:有很多软件依赖,一直报错;mysql相关库报错有一个密钥;

解决:进入缓存路径,yum localinstall mysql-community-* ,使用localinstall安装下载好的安装包。

安装好sysbench,配置相关文件。

准备一台测试机test-client:

Yum install epel-release源去安装sysbench

Yum install sysbench -y

使用sysbench进行压力测试;

Sysbench实现失败:测试服务器连接中间件服务器时,一定要去连接写的端口7002,不然会导致写数据到从服务器上,因为有两个服务器,会轮询调动到不同的机器,找不到数据库。

要使用写的用户去连接,不然权限不够。

测试结果良好。

压力测试工具:tpcc

Wget下载安装包;解压安装包;安装;

在其他的服务器上连接到读写分离器上,创建tpcc库;

需要在测试的服务器master上创建tpcc库,需要导入表到tpcc库中,需要将tpcc的create_table.sql和add_fkey_idx.sql从test-client服务器上远程拷贝到master上;

然后在master服务器上导入create_table.sql和add_fkey_idx.sql:

Mysql -uroot  ‘Sanchuang123#’ tpcc <create_table.sql

Mysql -uroot  ‘Sanchuang123#’ add_fkey_idx.sql

加载数据:

进行测试中:模拟写入数据,内存、cpu等消耗很小;

基于keeplived+gtid半同步主从复制的MySQL集群

#基于GTID的半同步主从复制的搭建过程:

  1. 安装好4台MySQL服务器系统和MySQL软件,安装好半同步相关的插件,开启GTID功能;
  2. 选一台做master,其他的做slave(有一台做延迟备份服务器);
  3. 配置好ansible服务器,定义好主机清单;
  4. 在master上导出基础数据到ansible上,然后ansible下发到所有slave服务器上;
  5. 在所有slave机器上导入基础数据。
  6. 开启GTID功能,启动主从复制服务
  7. 配置延迟备份服务器,从slave1上那二进制日志
  8. 在master上创建一个计划任务每天进行数据库的备份,编写备份脚本,master和ansible服务器之间建立双向免密通道,方便同步数据。Ansible也可以做一个异地备份服务器。
  9. 在一台服务器上安装部署了MySQL router,实现读写分离
  10. 安装keepalived实现高可用,配置两个vrrp实例实现双vip的高可用功能。
  11. 在dns域名里面添加同一个名字对应2个vip,实现dns的负载均衡。
  12. 集群的压力测试,sysbench进行测试。

项目心得:

  1. 一定要规划好整个集群的架构,配置要细心,脚本要提前准备好,边做边修改;
  2. 防火墙和selinux一定要记得关闭;
  3. 对MySQL的集群高可用有深入了解
  4. 对自动化批量部署和监控有更加多的应用和理解
  5. Keepalived的配置需要更加细心和IP地址的规划有了新的认识
  6. 对双vip的使用,添加了两条负载均衡记录,实现dns轮询,达到两个vip负载均衡器上的分流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1026731.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的介绍以及其发展历史

文章目录 前言一、技术是推动社会发展的基本动力1.人为什么能成为万物之长呢&#xff1f;2.人为什么要发明工具&#xff0c;进行进化呢&#xff1f;3.人是如何发明工具的&#xff1f;4.为什么要有不同的岗位和行业&#xff1f; 二、计算机(操作系统)发展的基本脉络1.第一台计算…

Java安全 反序列化(4) CC1链-LazyMap版

Java安全 反序列化(4) CC1链-LazyMap版 实验环境:存在漏洞的版本 commons-collections3.1-3.2.1 jdk 8u71之后已修复不可利⽤ 文章目录 Java安全 反序列化(4) CC1链-LazyMap版一.跟踪挖掘CC1_LazyMap原理二.完整CC1_Lazy版Poc 接着上一篇文章我们通过ChainedTransFormer实现任意…

面试算法-122-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {return dfs(…

在面对API的安全风险,WAAP全站防护能做到哪些?

随着数字化转型的加速&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为企业间和企业内部系统交互的核心组件。在应用程序开发过程中&#xff0c;API能够在不引起用户注意的情况下&#xff0c;无缝、流畅地完成各种任务。例如从一个应用程序中提取所需数据并传递给…

SinoDB系统数据库

在SinoDB数据库的一个实例中&#xff0c;存在多个数据库&#xff0c;分为系统数据库和用户数据库。系统数据库在实例初始化时自动创建&#xff0c;存放实例级别上的监控信息、数据字典信息&#xff0c;用户能够访问而不能修改这些数据。用户数据库由用户根据需要创建&#xff0…

[STM32] Keil 创建 HAL 库的工程模板

Keil 创建 HAL 库的工程模板 跟着100ASK_STM32F103_MINI用户手册V1.1.pdf的第7章步骤进行Keil工程的创建。 文章目录 1 创建相关文件夹2 创建“main.c/h”和“stm32f1xx_clk.c/h”3 复制CMSIS和HAL库4 创建新的Keil工程5 添加组文件夹和工程文件6 配置Keil设置 1 创建相关文件…

项目2-用户登录

1.创建项目 2.引入前端代码并检查是否有误 3.定义接口 需求分析 对于后端开发⼈员⽽⾔, 不涉及前端⻚⾯的展⽰, 只需要提供两个功能 1. 登录⻚⾯: 通过账号和密码, 校验输⼊的账号密码是否正确, 并告知前端 2. ⾸⻚: 告知前端当前登录⽤⼾. 如果当前已有⽤⼾登录, 返回登录的账…

用搜索引擎收集信息-常用方式

1&#xff0c;site csdn.net &#xff08;下图表示只在csdn网站里搜索java&#xff09; 2&#xff0c;filetype:pdf &#xff08;表示只检索某pdf文件类型&#xff09; 表示在浏览器里面查找有关java的pdf文件 3&#xff0c;intitle:花花 &#xff08;表示搜索网页标题里面有花…

学习或复习电路的game推荐:nandgame(NAND与非门游戏)、Turing_Complete(图灵完备)、logisim工具

https://www.nandgame.com/ 免费 https://store.steampowered.com/app/1444480/Turing_Complete/ 收费&#xff0c;70元。据说可以导出 Verilog &#xff01; logisim及其衍生版本 都需要安装java环境。 http://www.cburch.com/logisim/ 是原版&#xff0c; 下载页面&#…

53 initrd/initramfs 相关

前言 呵呵 这里主要是 探究一下 根文件系统 相关的东西 以及 附加了一些 系统启动的相关信息 计算机启动 硬件重置寄存器 设置初始化数据 计算机访问 0xffff0, 执行 bios 的代码, bios 选择启动设备, 然后执行 启动设备 boolloader 的代码 bootloader 将 boot.img 加载…

【小尘送书-第十五期】Excel函数与公式应用大全for Excel 365 Excel

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…

Spring Boot 3 极速搭建OAuth2认证框架

本篇环境 Java 17Spring Boot 3.2.3Spring Authorization Server 1.2.3开发工具 SpringToolSuite4Spring Boot 3.2.3 需要JDK 17及之上的版本。 项目初始化 项目可以使用Spring的初始化器生成, 也可以创建一个Maven类型的项目。 项目创建后的目录结构如下: 项目配置 使用 …

机器学习——决策树特征选择准则

机器学习——决策树特征选择准则 决策树是一种强大的机器学习模型&#xff0c;它可以用于分类和回归任务。决策树通过树状结构对数据进行分类&#xff0c;每个内部节点表示一个特征&#xff0c;每个叶节点表示一个类别或一个数值。在决策树构建的过程中&#xff0c;特征的选择…

Python RPA简单开发实践(selenium登陆浏览器自动输入密码登陆)

打开csdn博客&#xff0c;简单版 class BS:def __init__(self, url):self.url url# self.password password# self.username usernamedef login_url(self):from selenium import webdriver# 不自动关闭浏览器option webdriver.ChromeOptions()option.add_experimental_opt…

C++从入门到精通——命名空间

命名空间 前言一、命名空间引例什么是命名空间 二、命名空间定义正常的命名空间定义嵌套的命名空间多个相同名称的命名空间 三、命名空间使用加命名空间名称及作用域限定符使用using将命名空间中某个成员引入使用using namespace 命名空间名称引用引用命名空间和引用头文件有什…

Zookeeper的系统架构

先看一张图&#xff1a; ZooKeeper 的架构图中我们需要了解和掌握的主要有&#xff1a; 1&#xff1a; ZooKeeper分为服务器端&#xff08;Server&#xff09; 和客户端&#xff08;Client&#xff09;&#xff0c;客户端可以连接到整个ZooKeeper服务的任意服务器上&#xff…

Redis高级面试题-2024

说说你对Redis的理解 Redis是一个基于Key-Value存储结构的开源内存数据库&#xff0c;也是一种NoSQL数据库。 它支持多种数据类型&#xff0c;包括String、Map、Set、ZSet和List&#xff0c;以满足不同应用场景的需求。 Redis以内存存储和优化的数据结构为基础&#xff0c;提…

java反射应用:调用一个公共方法来间接调取其它各类方法

1.公共方法里用反射 2.通过反射调取进来的其它方法里&#xff0c;该方法想要调用另一个beanA来查询数据库&#xff0c;用Autowired 是不行的 因为beanA载入不了。这时需要利用上下文对象来获取beanA,来实现该方法里再查库的目的。 // / 方法4 import org.springframework.con…

Redis进阶(持久化、复制、集群、多线程、缓存)

Redis进阶 1.Redis持久化1.1 什么是Redis持久化&#xff1f;为什么需要持久化&#xff1f;1.2 Redis持久化方式——RDB(Redis DataBase)1.2.1 什么是RDB&#xff1f;1.2.2 备份文件位置1.2.3 触发RDB的方式1.2.3.1 自动触发1.2.3.2 手动触发1.2.3.3 其他触发方式 1.2.4 RDB优缺…

人工智能与大数据、云计算等其他技术的关联和区别是什么?

人工智能&#xff08;AI&#xff09;、大数据和云计算是当今科技领域的三大热门技术&#xff0c;它们之间存在密切的关联&#xff0c;但也有一些明显的区别。以下是它们之间的关联和区别&#xff1a; AI-321 | 专注于AI工具分享的网站 AI工具集 | 人工智能工具箱 | 全球顶尖AI…