基于docker的keepalived+MySQL主从实现MySQL高可用

news2024/11/25 22:43:24

因生产需要对MySQL做高可用,同时,资源有限,因此采用双节点主从+keepalived方式实现高勇。另外因需要大批量部署MySQL集群,需要采用模板化部署,本方案采用将MySQL容器化,实现MySQL模板化配置部署。

部署环境及软件:centos7.6、两个节点、keepalived-2.2.7、MySQL5.7.30

MySQL容器化部署配置参数

mysql采用mysql官方基础镜像mysql5.7
主节点ip:192.168.112.121
从节点ip:192.168.112.122
在主从节点上分别部署mysql容器,启动脚本

MySQL主从节点关键配置如下:

主节点(192.168.112.121)my.cnf配置

[client]
port=3306
default-character-set=utf8

[mysqld]
port=3306
server-id=1
log-bin=mysql-bin
binlog_do_db=xxx_db
binlog_format=mixed
character-set-server=utf8

从节点(192.168.112.122)my.cnf配置

[client]
port=3306
default-character-set=utf8

[mysqld]
port=3306
server-id=2
log-bin=mysql-bin
binlog_do_db=xxx_db
binlog_format=mixed
character-set-server=utf8

MySQL启动脚本

主数据库192.168.112.121

#!/bin/bash
docker rm -f msyql-server-1 || true
BASE_DIR=/home/services/mysql/mysql-1
docker run -d -p 3306:3306 \
   --name mysql-server-1 \
   --privileged=true --user=mysql \
   -e MYSQL_ROOT_PASSWORD=xxxx \
   -v $BASE_DIR/conf/my.cnf:/etc/mysql/my.cnf \
   -v $BASE_DIR/data:/var/lib/mysql \
   mysql:5.7

从数据库192.168.112.122

#!/bin/bash
docker rm -f msyql-server-2 || true
BASE_DIR=/home/services/mysql/mysql-1
docker run -d -p 3306:3306 \
   --name mysql-server-2 \
   --privileged=true --user=mysql \
   -e MYSQL_ROOT_PASSWORD=xxxx \
   -v $BASE_DIR/conf/my.cnf:/etc/mysql/my.cnf \
   -v $BASE_DIR/data:/var/lib/mysql \
   mysql:5.7

启动数据库之后做数据库主从配置

MySQL主从配置

登录主数据库创建主从同步账户slave_user,并查看master状态,记录下file、psition值,配置mysql从库时使用
操作步骤如下:

#授权slave_user复制权限
grant replication slave on *.* to slave_user@'%' identified BY '15dGt73@Adm';
flush PRIVILEGES;
# 需要登录验证账户及密码是否正确,如果能够正常登录,则继续后续步骤,否则需要排查原因并解决
mysql -h192.168.112.121 -uslave_user -p15dGt73@Adm
#查看master状态,找到master_log_file和MASTER_LOG_POS的值
show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     2117| probe_db      |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
# 选择从数据库执行
change master TO
MASTER_HOST='192.168.112.121',
master_port=3306,
master_user='slave_user',
master_password='15dGt73@Adm',
master_log_file='mysql-bin.000003',
MASTER_LOG_POS=2117;

验证从节点Slave_IO_Running、Slave_SQL_Running都为yes则主从配置成功
在这里插入图片描述
验证数据库主从同步是否生效,
第一组测试:在主库创建probe_db数据库,从库自动创建probe_db数据库,经验证从库自动创建;

第二组测试:数据库添加表,从库是否会自动创建数据表
在主数据库中执行创建数据库,如果从数据库也自动创建,则表示主从同步生效

CREATE TABLE `probe_db`.`ping_test_result` (
  `id` INT NOT NULL,
  `ip` VARCHAR(32) NOT NULL,
  `package_loss_ratio` FLOAT NOT NULL)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_esperanto_ci;

从数据库自动创建表
第三组测试:从主数据插入一组数据,验证是否会将数据同步到从库;

INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(1, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(2, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(3, '8.8.8.8', 0.1);

检测从库也是自动生产3条数据,数据同步生效
第四组测试:往从库里插入一组数据,验证从库是否自动将数据同步到主库;

INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(4, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(5, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(6, '8.8.8.8', 0.1);

检测主库也是自动生产3条数据,数据同步生效

第五组测试:关闭主库,往从库里插入一组数据,验证从库在主库正常启动后是否自动将数据同步到主库;

INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(7, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(8, '8.8.8.8', 0.1);
INSERT INTO ping_test_result(id, ip, package_loss_ratio) VALUES(9, '8.8.8.8', 0.1);

到此主从同步配置完成,下面开始配置keepalived服务。

keepalived主从配置

keepalived主要是需要将各种配置项配置正确
keepalived主节点:192.168.112.121
keepalived从节点:192.168.112.122
接下来是安装keepalived服务

安装必要的依赖包
yum -y install gcc openssl-devel popt-devel psmisc
cd /home/services/
wget https://www.keepalived.org/software/keepalived-2.2.7.tar.gz
tar -zxvf keepalived-2.2.7.tar.gz
cd keepalived-2.2.7
./configure --prefix=/opt/keepalived
make && make install

#存放配置文件并将keepalived启动脚本存在合适的位置
mkdir -p /etc/keepalived
cp keepalived/etc/keepalived/keepalived.conf.sample /etc/keepalived/keepalived.conf
cp keepalived/etc/init.d/keepalived /etc/init.d/
cp keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp bin/keepalived /usr/sbin/

在为主从节点做配置前,
1、需要查看网卡,主从节点的网络均是ens33
2、配置主从节点
3、创建/etc/keepalived/restart.sh

#!/bin/bash
#当mysql服务异常时,将keepalived应用停止,可以及时将vip切换到另一个节点上
killall keepalived

4、其他配置请参考外部资料
https://blog.csdn.net/D1179869625/article/details/126198495

主节点192.168.112.121配置文件如下:

!Confiquration File for keepalived
global defs {
	notification email {
		xxx1@qq.com
		xxx2@qq.com
		xxx3@qq.com
	}
	notification_email_from xxx0@qq.com
	smtp_server 10.xx.xx.x
	smtp_connect_timeout 30
	router_id LVS_MASTER
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
	vrrp_instance VI_1{
	    state BACKUP
		interface ens33
		virtual_router_id 51
		priority 90
		advert_int 1
		authentication{
		  auth_type PASS
		  auth_pass 1539
		}	
		virtual_ip_address {
		  192.168.112.120
		}
	}
	virtual_server 192.168.112.121 3306 {
	delay_loop 6
	1b_algo rr
	1b_kind NAT
	persistence_timeout 50
	protocol TCP
	real_server 192.168.112.121 3306{
	   notify_down /etc/keepalived/restart.sh
		TCP_CHECK {
			connect_ip 192.168.112.121
			connect_port 3306
			connect_timeout 3
			nb_get_retry 33
			delay_before_retry 3
		}
	}
}

经验证,将virtual_server服务配置到对应3306端口,一旦数据库异常,将会做故障迁移到另一个数据库实例上。

从节点192.168.112.122配置

!Confiquration File for keepalived
global defs {
	notification email {
		xxx1@qq.com
		xxx2@qq.com
		xxx3@qq.com
	}
	notification_email_from xxx0@qq.com
	smtp_server 10.xx.xx.x
	smtp_connect_timeout 30
	router_id LVS_SLAVE
	vrrp_skip_check_adv_addr
	vrrp_strict
	vrrp_garp_interval 0
	vrrp_gna_interval 0
}
	vrrp_instance VI_1{
	    state BACKUP
		interface ens33
		virtual_router_id 51
		priority 90
		advert_int 1
		authentication{
		  auth_type PASS
		  auth_pass 1539
		}	
		virtual_ip_address {
		  192.168.112.120
		}
	}
	virtual_server 192.168.112.122 3306 {
	delay_loop 6
	1b_algo rr
	1b_kind NAT
	persistence_timeout 50
	protocol TCP
	real_server 192.168.112.122 3306{
	   notify_down /etc/keepalived/restart.sh
		TCP_CHECK {
			connect_ip 192.168.112.122
			connect_port 3306
			connect_timeout 3
			nb_get_retry 33
			delay_before_retry 3
		}
	}
}

在两节点上配置keepalived服务为开机自启动并启动服务

systemctl enable keepalived && systemctl start keepalived

检测朱从节点服务状态为下图则表示服务正常运行,

在这里插入图片描述
测试一:通过vip(192.168.112.120)地址连接MySQL数据库,如果能正常连接则表示VIP生效;
测试二:关闭其中一个节点的keepalived服务,如果能正常连接则表示keepalived服务生效,否则异常,需要检查keepalived服务配置;
测试三:关闭其中一个数据库服务,如果能正常连接,则表示运行正常,否则异常,需要检查keepalived服务配置是否有误;
测试四:如果关闭主节点keepalived服务,并关闭从节点MySQL服务,如果无法访问,则表示正常。
至此整个高可用方案验证完成。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC学习笔记--上篇

SpringMVC学习笔记 1、SpringMVC 1.1、什么是SpringMVC Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。 1.2、SpringMVC的特点 Spring MVC的特点: 轻量级,简单易学高效 , 基于请求响应的MVC框架与Spring兼容…

Python深度学习-有向图合并、排序、最长路径计算

一、有向图方向、权重表示方法 Python通常使用有向图中边的起点和终点来表示边的方向。例如,如果有一条从节点A到节点B的边,则可以使用以下方式表示该有向边: graph {A: {B: 1} }在这个例子中,节点A和节点B之间存在一条权重为1…

谷歌插件下载Redux DevTools管理Redux数据

我们在做 react-redux开发时 很多时候可能无法确定自己的数据有没有成功导进来 这里就有个不错的谷歌插件推荐给大家 大家可以下载我的资源 谷歌插件Redux DevTools 这里 我们打开 Google Chrome浏览器 然后 直接在谷歌浏览器上访问 chrome://extensions/ 如果你的第一次进入 …

【网络安全】学过编程就是黑客?

我们不可否认的是黑客为我们带来了巨大的财产损失于危机,即使其最初的思想是正确的。 个人主页:【😊许思王】 文章目录 前言黑客 💻起源🚗发展👣黑客守则(真的假的🤔)黑…

合并cyclonedx格式的bom文件

1.工具下载 https://github.com/CycloneDX/cyclonedx-cli/releases 2.操作记录 Usage: cyclonedx [options] [command] Options: --version Show version information -?, -h, --help Show help and usage information Commands: add Add information to a BOM (currently…

【图像处理】:相机对焦的原理和实现方法

相机对焦的原理和实现方法 1 原理介绍:1.1点扩散函数“原理:1.2 测距原理:对焦的本质是测距:1.3.相位检测只原理: 2.实现方法2 1 原理介绍: 对焦有三种思路: 1.1点扩散函数“原理: 也就是观测画面中线条边缘的对比度,对比度最高…

微信小程序代码审核,提示需要添加文娱-其他视频类目

这个解决办法有三个 一个是按照指引去申请资质 第二个是通过后端写一个鉴权接口,审核时候去通过接口返回的布尔值去隐藏掉视频模块,通过后再显示出来 第三个是服务除视频内容外还存在其他形式的情况可以通过引入第三方视频插件来解决,但是…

初识Golang,集简洁与性能与一体的语言

文章目录 一、Go语言介绍二、Go语言特性三、Go语言用途四、开发环境搭建五、建立工作区并创建Go程序六、入口文件基本代码介绍七、go命令介绍7.1 基本命令7.2 build 与 run命令7.3 install命令介绍 八、命名规范8.1 变量规范定义8.2 关键字8.3 保留字8.4 需要注意的问题 道阻且…

AIGC 爆火,浪潮信息要做大模型的数据存储大底座

AIGC 在 2023 年爆火,各类大模型层出不穷,参数动辄达到千亿数量级。这些背后,数据的类型和形式也走向复杂多样。例如大模型会采用到我们真实物理世界中的文字、视觉、音频、3D、雷达、多谱等复杂多样的不同模态信号和数据,数据则又…

【Android复习笔记】系统进程(一)

Android 系统进程有哪些 先来一个整体结构图从宏观上理解Android系统的进程结构布局: 这里我们简单总结一下: 系统的第一个进程其实是0号进程(又叫swapper进程/Idle进程) 0号进程fork出了1号进程(init进程)和2号进程(kthreadd进程) 1号进程是所有普通用户进程的祖先,2号进程…

利用Adobe Acrobat DC实现图片和PDF互相转换

一、图片转PDF 可以实现多张或者单张图片转PDF! 这个需要使用到Adobe Acrobat DC的文件合并功能,因为Adobe Acrobat DC的文件合并,不仅可以合并多个pdf文件,也支持合并图片文件。 如图,直接选中多张图片合成即可: 添…

微服务系列文章之 Redisson实现分布式锁(3)

一、概述 1、技术架构 项目总体技术选型 SpringBoot2.4.5 Maven3.5.4 Redisson3.5.4 lombok(插件)2、加锁方式 该项目支持 自定义注解加锁 和 常规加锁 两种模式 自定义注解加锁 DistributedLock(value"goods", leaseTime5)public String lockDecreaseStock(…

84. 求1+2+…+n

链接: 链接 题目: 求 12…n12…n,要求不能使用乘除法、forfor、whilewhile、ifif、elseelse、switchswitch、casecase 等关键字及条件判断语句 (A?B:C)(A?B:C)。 数据范围 1≤n≤500001≤n≤50000。 样例 输入:10输出&#xff1…

【MySQL】不允许你不会使用组合查询

🎬 博客主页:博主链接 🎥 本文由 M malloc 原创,首发于 CSDN🙉 🎄 学习专栏推荐:LeetCode刷题集 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正&#xff0…

ASEMI-1N4007是什么二极管,1N4007是什么类型的二极管

编辑-Z 1N4007是一种常见的二极管,属于快恢复二极管(Fast Recovery Diode)的一种。它是一种高压、高电流的整流二极管,常用于电源电路中的整流器。1N4007的最大反向电压为1000V,最大正向电流为1A,具有较低…

第十七章 原理篇:Deformable DETR

参考教程: 论文:https://arxiv.org/pdf/2010.04159.pdf 源码:https://github.com/fundamentalvision/Deformable-DETR 文章目录 Deformable ConvDeformable DETR计算量MethodDeformable Attention ModuleDeformAttn计算量Multi-scale Defor…

JVM学习笔记(二)

学习黑马视频:01_什么是jvm_哔哩哔哩_bilibili 一、JVM内存结构 程序计数器 虚拟机栈 本地方法栈 堆 方法区 程序计数器、栈、本地方法栈,都是线程私有的。堆、方法区是线程共享的区域。 1. 虚拟机栈(JVM Stacks) 1&#xff09…

avue 自定义按钮修改后触发表单自带的校验方法;avue表单提交

代码&#xff1a; <avue-form :option"option" v-model"publishForm" ref"publishForm" submit"handleSubmit"><template slot-scope"{size}" slot"menuForm"><el-button :size"size" …

LayUi之选项卡的详解(附源码讲解)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于LayUi的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.选项卡是什么 二.选项卡在什么时候使用…

最新软件工程毕业设计选题推荐100例

文章目录 0 简介1 如何选题2 最新软件工程毕设选题3 最后 0 简介 学长搜集分享最新的软件工程业专业毕设选题&#xff0c;难度适中&#xff0c;适合作为毕业设计&#xff0c;大家参考。 学长整理的题目标准&#xff1a; 相对容易工作量达标题目新颖 1 如何选题 最近非常多的…