Docker方式创建keepalived连接MGR集群

记录一下简单的搭建步骤以便后期查验

目录

  • 前言
  • 步骤
    • 1. 安装环境
    • 2. 重新制作镜像
    • 3. 导入新镜像
    • 4. 创建容器

前言

假设已经搭建了MySQL8的MGR集群方式(一主两从)。

MGR本身有故障转移重新选举新的主节点功能,但是上游的应用程序需要自己手动修改数据库连接地址重新指向主节点。

为了了能不用手动方式切换主节点需要中间代理访问程序,提供的方案有很多例如 nginx、keepalived、proxysql等,这里我们先选择使用keepalived,后期使用proxysql代理。

步骤

1. 安装环境

安装Docker和MGR 这里略过

2. 重新制作镜像

登录任意一个节点服务器,下载原始镜像

docker pull osixia/keepalived:2.0.20

创建临时容器

docker run --name keepalivedtest --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW -e KEEPALIVED_INTERFACE=enp6s0 --net=host -d osixia/keepalived:2.0.20

登录进临时容器

docker exec -it keepalivedtest /bin/bash

然后安装mysql客户端

apk add mysql mysql-client
...稍等片刻
...
安装完成后
退出容器 exit

从零时容器生成一个新的镜像:mgr_keepalived

docker commit keepalivedtest  mgr_keepalived:2.0.20

导出镜像文件,上传其他MGR节点服务器

 docker save -o mgr_keepalived2.tar mgr_keepalived:2.0.20

3. 导入新镜像

在每一个MGR节点服务器上导入镜像


docker load -i mgr_keepalived2.tar

4. 创建容器

这里假设3台服务器环境如下:

服务器文件路径备注
192.168.1.246/apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh记得sh文件赋予可执行权限,当前MGR主节点
192.168.1.247/apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh从节点
192.168.1.248/apps/keepalived/keepalived.conf /apps/keepalived/mysql_master_check.sh从节点

各服务器文件路径都一致, mysql_master_check.sh 脚本文件内容如下:

#!/bin/bash# 替换以下变量为你的实际MySQL用户、密码和端口
MYSQL_USER="rpl_user"
MYSQL_PASS="请填写账号密码"
MYSQL_PORT="请填写端口号"
MYSQL_HOST="请填写节点主机IP"# 检查MySQL服务是否运行
if nc -z "$MYSQL_HOST" "$MYSQL_PORT"; thenecho "MySQL 服务在 $MYSQL_HOST:$MYSQL_PORT 上正在运行"
elseecho "MySQL 服务在 $MYSQL_HOST:$MYSQL_PORT 上未运行"exit 1
fi# 检查当前节点是否为主节点
IS_MASTER=$(mysql -u"$MYSQL_USER" -p"$MYSQL_PASS" -P"$MYSQL_PORT" -h"$MYSQL_HOST" -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" | grep -c "OFF")if [[ $IS_MASTER -eq 1 ]]; thenecho "当前节点是主节点"exit 0
elseecho "当前节点不是主节点"exit 1
fi

各个节点上的文件注意
MYSQL_USER=“rpl_user”
MYSQL_PASS=“请填写账号密码”
MYSQL_PORT=“请填写端口号”
MYSQL_HOST=“请填写节点主机IP”
这几个变量的修改!
用户 rpl_user是用于MGR复制用的,也可以填写其他的用户名,但是用户的密码认证方式必须是之前老式的 mysql_native_password ,因为镜像里面的mysql客户端暂不支持MySQL8默认的密码认证方式。

keepalived.conf 文件内容大致如下:

vrrp_script chk_mysql {script "/usr/local/bin/mysql_master_check.sh"interval 2weight 2
}vrrp_instance VI_1 {state MASTERinterface enp6s0virtual_router_id 51priority 101advert_int 1  authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.110}track_script {chk_mysql}
}

主要是如下几个变量要注意:

  • interface 当前节点服务器的网卡名称
  • priority 优先级,每一个节点上不一样
  • virtual_ipaddress 虚拟ip

3台节点服务器上创建容器如下:

docker run -d --name mgr8keepalived \--cap-add=NET_ADMIN \--cap-add=NET_BROADCAST \--cap-add=NET_RAW \--net=host \-e KEEPALIVED_INTERFACE=enp6s0 \-v /apps/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf \-v /apps/keepalived/mysql_master_check.sh:/usr/local/bin/mysql_master_check.sh \mgr_keepalived:2.0.20 --loglevel debug --copy-service

变量 KEEPALIVED_INTERFACE 是指当前节点服务器的网卡名称,如果不想开启debug模式去掉–loglevel debug

查看docker日志一般会有如下信息:

...
Wed Jan 31 09:32:53 2024:    Reset ARP config counter 0
Wed Jan 31 09:32:53 2024:    Original arp_ignore 0
Wed Jan 31 09:32:53 2024:    Original arp_filter 0
Wed Jan 31 09:32:53 2024:    Original promote_secondaries 1
Wed Jan 31 09:32:53 2024:    Reset promote_secondaries counter 0
Wed Jan 31 09:32:53 2024:    Tracking VRRP instances = 0
Wed Jan 31 09:32:53 2024: (VI_1) Entering BACKUP STATE (init)
Wed Jan 31 09:32:53 2024: VRRP sockpool: [ifindex(2), family(IPv4), proto(112), unicast(0), fd(11,12)]
Wed Jan 31 09:32:53 2024: VRRP_Script(chk_mysql) succeeded
Wed Jan 31 09:32:53 2024: (VI_1) Changing effective priority from 101 to 103
Wed Jan 31 09:32:57 2024: (VI_1) Receive advertisement timeout
Wed Jan 31 09:32:57 2024: (VI_1) Entering MASTER STATE
Wed Jan 31 09:32:57 2024: (VI_1) setting VIPs.
Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110
Wed Jan 31 09:32:57 2024: (VI_1) Sending/queueing gratuitous ARPs on enp6s0 for 192.168.1.110
Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110
Wed Jan 31 09:32:57 2024: Sending gratuitous ARP on enp6s0 for 192.168.1.110
...

可以使用虚拟IP 192.168.1.110 连上看下是否可以操作数据库。

可以关闭一个MySQL实例看下keepalived的效果,是否还正常使用,虚拟IP此时是否浮动到新的主节点服务器上了。

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

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

相关文章

Facebook的社交影响力:用户行为解析与趋势

在当今数字时代,社交媒体已经成为人们日常生活中不可或缺的一部分,而Facebook作为全球最大的社交平台之一,其社交影响力愈发显著。本文将深入分析Facebook的社交影响力,解析用户行为,同时探讨当前和未来的社交趋势。 社…

vue项目线上页面刷新报404 解决方法

一.修改配置文件 nginx.conf ,并重新加载或重启 我的nginx版本是1.9.9 location / {try_files $uri $uri/ /index.html; }原因: 打包后的dist下只有一个 index.html 文件及一些静态资源,这个是因为Vue是单页应用(SPA),只有一个…

学习Spring的第十三天

非自定义bean注解开发 设置非自定义bean : 用bean去修饰一个方法 , 最后去返回 , spring就把返回的这个对象,放到Spring容器 一 :名字 : 如果bean配置了参数 , 名字就是参数名 , 如果没有 , 就是方法名字 二 : 如果方法产生对象时 , 需要注入数据 , 在方法参数设置即可 , …

《深入浅出Go语言》大纲

目录 为什么选择《深入浅出Go语言》? 基础核心模块 为什么选择《深入浅出Go语言》? 🚀 全面的基础知识体系 从环境搭建开始,对Go语言核心知识点进行深入探讨,深度挖掘每个基础知识的本质,为后续深入学习…

SOME/IP SD 协议介绍(四)服务发现通信行为

服务发现通信行为 启动行为 服务发现将根据服务实例处于以下三个阶段之一: • 初始等待阶段 • 重复阶段 • 主要阶段 一旦系统启动并且用于服务实例的接口连接已建立,服务发现将进入该服务实例的初始等待阶段。 在进入初始等待阶段并在发送第一条服…

VScode+PlatformIO 物联网Iot开发平台环境搭建

1.vscode (1)安装platformIO插件 (2)新建项目或导入已有的arduino项目 Name:需要填写你项目的名称; Board:点开是一个下拉框,但是可以输入你想要的开发板,这里选择&quo…

你所不知道的关于库函数和系统调用的那些事

系统调用和库函数的区别 相信大家在面试或者刷面试题的时候经常能看到这样的问题,“简述一下系统调用和库函数的区别”。 系统调用是操作系统提供给用户的接口,能让用户空间的程序有入口访问内核。而库函数数一组标准函数,比如复合 POSIX 或…

Git 入门指南:从新手到高手的完全指南

Git是一种强大的分布式版本控制系统,广泛应用于软件开发中。它的使用不仅可以帮助开发团队更好地管理代码,还可以提高团队协作效率和代码质量。随着软件开发的不断发展,版本控制成为了程序员必备的一项技能。 Git作为最流行的分布式版本控制系…

90.网游逆向分析与插件开发-游戏窗口化助手-项目需求与需求拆解

内容参考于:易道云信息技术研究院VIP课 上一个内容:实现物品使用策略的功能-CSDN博客 项目需求: 在游戏窗口化时,可以在游戏之外弹出一个窗口,可以隐藏或者显示游戏窗口,显示游戏人物的基本状态&#xff…

LeetCode--代码详解 2.两数相加

2.两数相加 题目 难度:中等 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数…

gerrit(1) | gerrit 简介

gerrit(1) | gerrit 简介 1. 目的 之前用过 gitlab CI/CD, github actions, 以及公司的配置管理员配置的 jenkins。 github 的 MR, github 的 PR, 虽然在用, 但仅限于参与开源项目或公司内的开源项目, OEM 项目中完全没在用。 …

【JavaScript + CSS】随机生成十六进制颜色

效果图 实现 <template><div class"year_area"><div class"year_list"><el-row :span"24"><div :class"showAll"><el-col :span"5" v-for"(item, index) in defaulList" :key&…

Shell脚本是一种用来自动化执行一系列命令的文本文件

Shell脚本是一种用来自动化执行一系列命令的文本文件。它可以包含一系列的Shell命令和控制结构,用于实现特定的功能或任务。 以下是一些使用Shell脚本的常见情况: 自动化任务:可以使用Shell脚本编写自动化任务,例如备份文件、定时执行命令等。 系统管理:通过Shell脚本可以…

电动汽车充放电V2G模型(matlab代码)

目录 1 主要内容 1.1 模型背景 1.2 目标函数 1.3 约束条件 2 部分代码 3 效果图 4 下载链接 1 主要内容 本程序主要建立电动汽车充放电V2G模型&#xff0c;采用粒子群算法&#xff0c;在保证电动汽车用户出行需求的前提下&#xff0c;为了使工作区域电动汽车尽可能多的消…

迁移学习实现图片分类任务

导入工具包 import time import osimport numpy as np from tqdm import tqdmimport torch import torchvision import torch.nn as nn import torch.nn.functional as Fimport matplotlib.pyplot as plt %matplotlib inline# 忽略烦人的红色提示 import warnings warnings.fi…

okhttp 的 拦截器

拦截器有很多作用&#xff0c;实现就是责任链模式&#xff0c;细节&#xff0c;等我有时间补上。 后面有时间更新一下。 OkHttp最核心的工作是在 getResponseWithInterceptorChain() 中进行&#xff0c;在进入这个方法分析之前&#xff0c;我们先来了 解什么是责任链模式&…

【PHP源码】2.0熊猫乐园签到,任务,玩游戏一键完成源代码

每天都要签到啥的,麻烦的很,而且有时候可能忘记,干脆封装成写出php代码,宝塔新定时任务,每天00:00自动运行✅,妥妥省心~ 2.0更新 🎉首页.竹子浇水 🎉首页.竹子种植 🎉首页.竹子收获 🎉首页.水滴领取 🎉餐厅.自动工作 🎉任务.分享完成 <?php $user…

Java split 分割字符串避坑

使用split进行字符串分割时需要注意2点 1、特殊字符作为分隔符时需要使用\\进行转义(如\\ -> \\\\; | -> \\| ) 特殊字符 .$|()[{^?*\\ 例如对"|"分隔 未转义 String str "01|02|03"; String[] strArr str.split("|");System.out.…

2.3学习总结

2.3 1..买卖股票的最佳时机 2..买卖股票的最佳时机II 3.最长递增子序列 4.最长连续递增的子序列 5.最长重复子数组 6.最长公共子序列 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 定义&#xff1a;dp[i][0] 表示第i天持有股票所得现⾦。dp[…

点击按钮打开自定义iframe弹窗

1、效果 点击按钮打开弹窗&#xff1a; 打开弹窗后&#xff1a; 2、代码 <!DOCTYPE html> <html><head><title>iframe弹窗</title><style>/* 使用媒体查询来实现响应式设计 */media (min-width: 768px) {.popup {width: 80%; /* 设置…