Keepalived+MySQL简单搭建实现数据库高可用

news2024/11/24 16:21:12

需求:想要实现当MySQL服务挂了之后,能够自动切换到另一台,不对当前服务造成过多影响。查找了很多实现数据库高可用方案,比较常见的有MHA(至少三台,一主多从)、开源数据库中间件(Mycat)等,最终选取了一个配置相对简单一些的双主MySQL集群+Keepalived方案。准备了两台虚拟机172.30.24.97、172.30.24.98,已安装好10.6.8-MariaDB MariaDB Server

1、MySQL双主搭建

可参考上一篇文章:MySQL主从数据库简单搭建
双主也可以理解为互为主从,此处仅简单记录一下步骤。

1.1 修改配置文件

172.30.24.97数据库配置文件my.cnf添加部分如下:

[mysqld]
server-id=1
binlog_format=ROW                       #指定mysql的binlog日志的格式
log-bin=mysql-bin                       #开启二进制日志       
auto-increment-increment = 2            #字段变化增量值
auto-increment-offset = 1               #初始字段ID为1
slave-skip-errors = all                 #忽略所有复制产生的错误

172.30.24.98数据库配置文件my.cnf添加部分如下:

[mysqld]
server-id=2
binlog_format=ROW                       #指定mysql的binlog日志的格式
log-bin=mysql-bin                       #开启二进制日志       
auto-increment-increment = 2            #字段变化增量值
auto-increment-offset = 2               #初始字段ID为2
slave-skip-errors = all                 #忽略所有复制产生的错误

1.2 创建复制用户并授权

两个MySQL数据库都需要执行

grant replication slave on *.* to 'rep'@'%' identified by '123456';

部分配置项解释:
两台数据库配置只有server-id不同和auto-increment-offset不同,其他需要相同。
auto-increment-increment=2:表示自增长字段每次递增的量,其默认值是1。它的值应设为整个结构中服务器的总数,示例用到两台服务器,所以值设为2。
auto-increment-offset=2:用来设定数据库中自动增长的起点(即初始值),因为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突。

1.3 保持数据一致

示例中172.30.24.97已经运行了一些数据,172.30.24.98是新的数据库,需要手动将172.30.24.97的数据拷贝到172.30.24.98,并应用。因为开启双主不会自动同步未配置前的数据,只会同步配置之后的数据库操作。
在172.30.24.98上进入到数据库bin目录下执行

# 导出数据
./mysqldump -uroot -p123456 -P3310 -h 172.30.24.97 --single-transaction --all-databases --master-data=2  > host97.sql
# 导入数据
./mysql -uroot -pUmcDp1234 -P3310 < host97.sql

1.4 开启复制

172.30.24.98上开启复制,以下脚本在172.30.24.98上执行

CHANGE MASTER TO MASTER_HOST='172.30.24.97', MASTER_PORT=3310, MASTER_USER='rep', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=328;
START SLAVE;
show slave status \G

172.30.24.97上开启复制,以下脚本在172.30.24.97上执行

CHANGE MASTER TO MASTER_HOST='172.30.24.98', MASTER_PORT=3310, MASTER_USER='rep', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=4829028;
START SLAVE;
show slave status \G

1.5 测试双主复制

在172.30.24.98数据库中插入数据,查看172.30.24.97上是否同步
在172.30.24.97数据库中插入数据,查看172.30.24.98上是否同步

2、Keepalived配置启动

2.1 安装

Keepalived下载:Keepalived下载
安装方式有两种
1、yum安装
2、源码包安装
示例使用的是源码包安装,版本是 Version 2.2.8 。
将下载的源码包上传至服务器

# 解压
tar -zxvf keepalived-2.2.8.tar.gz

# 编译  
cd keepalived-2.2.8/

# --prefix 指定安装地址
./configure   --prefix=/usr/local/keepalived/

# 编译并安装
make && make install

指定安装地址可能会报缺少依赖(gcc、OpenSSL),如果有问题需要手动安装一下依赖。
报错示例:
缺少gcc缺少OpenSSL执行安装依赖:

yum install gcc
yum install openssl-devel

2.2 创建配置文件

# 创建keepalived配置文件目录
mkdir /etc/keepalived

# 拷贝 配置文件 到/etc/keepalived目录下  
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ 

# 复制keepalived脚本到/etc/init.d/ 目录 (就可以使用 service 命令便捷调用)
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/

2.3 修改配置文件

示例使用172.30.24.97作为主,172.30.24.98作为子,172.30.24.96为虚拟出的ip。
172.30.24.97的keepalived配置文件如下:

! Configuration File for keepalived

# 全局配置
global_defs {
	# 路由标志
    router_id LVS_DEVEL               
}

# 集群资源监控
vrrp_script chk_mysql_port {          # 检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/root/chk_mysql.sh"       # 这里通过脚本监测
    interval 2                        # 脚本执行间隔,每2s检测一次
    weight -5                         # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                            # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                            # 检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER                    # 设置的当前主机为主节点,如果是备用节点,则设置为BACKUP
    interface ens3                  # 主机网卡 可以用ifconfig查看来决定设置哪一个    
    mcast_src_ip 172.30.24.97       # 主机ip 
    virtual_router_id 35            # 路由器标识,MASTER和BACKUP必须是一致的
    priority 101                    # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1                    # 设置VRRP Advertisement(通告)消息的发送间隔为"1"秒
    authentication {                # 设置VRRP的认证信息,用于确保只有经过认证的路由器才能参与VRRP组。
        auth_type PASS              # 指定认证类型为"PASS",表示使用密码进行认证
        auth_pass 1111              # 设置密码为"1111",用于进行认证
    } 
	
	# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中
    # 当状态切换到BACKUP时,此IP会自动从系统中删除
    # 可以通过命令ip addr查看切换后的状态
    virtual_ipaddress {
		# 虚拟IP地址
        172.30.24.96                
    }
	
	# 集群资源监控,组合vrrp-script进行
    track_script {
        chk_mysql_port
    }
} 

172.30.24.98的keepalived配置文件可以复制172.30.24.97的同时修改部分配置。
修改部分172.30.24.98的keepalived配置文件如下:

! Configuration File for keepalived

# 全局配置
global_defs {
	# 路由标志
    router_id LVS_DEVEL               
}

# 集群资源监控
vrrp_script chk_mysql_port {          # 检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/root/chk_mysql.sh"       # 这里通过脚本监测
    interval 2                        # 脚本执行间隔,每2s检测一次
    weight -5                         # 脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
    fall 2                            # 检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                            # 检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state BACKUP                    # 设置的当前主机为主节点,如果是备用节点,则设置为BACKUP
    interface ens3                  # 主机网卡 可以用ifconfig查看来决定设置哪一个    
    mcast_src_ip 172.30.24.98       # 主机ip 
    virtual_router_id 35            # 路由器标识,MASTER和BACKUP必须是一致的
    priority 99                    # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1                    # 设置VRRP Advertisement(通告)消息的发送间隔为"1"秒
    authentication {                # 设置VRRP的认证信息,用于确保只有经过认证的路由器才能参与VRRP组。
        auth_type PASS              # 指定认证类型为"PASS",表示使用密码进行认证
        auth_pass 1111              # 设置密码为"1111",用于进行认证
    } 
	
	# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中
    # 当状态切换到BACKUP时,此IP会自动从系统中删除
    # 可以通过命令ip addr查看切换后的状态
    virtual_ipaddress {
		# 虚拟IP地址
        172.30.24.96                
    }
	
	# 集群资源监控,组合vrrp-script进行
    track_script {
        chk_mysql_port
    }
} 

检测mysql服务是否在运行脚本 chk_mysql.sh 内容:

#!/bin/bash
counter=$(ps aux | grep -v grep | grep mysqld | wc -l)
if [ "${counter}" -eq "0" ]; then
killall keepalived
fi 

2.4 测试启动

# 启动 keepalived
systemctl start keepalived  

# 加入开机启动 keepalived
systemctl enable keepalived 

# 重新启动 keepalived
systemctl restart keepalived  

# 查看 keepalived 状态
systemctl status keepalived   

注:示例校验MySQL服务是否运行,需要在MySQL运行的情况下才能正常启动keepalived服务。
启动成功示例:
启动成功

2.4 卸载

因为中间配置失败,补充一下keepalived的卸载
1、yum安装——卸载 yum remove keepalived
2、源码包安装——卸载

# 安装包的解压目录
cd /home/hd/keepalived-1.2.18
make uninstall 

3、第1或2步执行完后,都需要删除相关文件

# 查看相关文件
find / -name keepalived
# 删除找到的文件
rm -rf /etc/keepalived

3、测试

# 此命令可以查看当前实际访问的是哪个数据库
show variables like "%server_id%";
  • 在不同数据库上执行:

在这里插入图片描述在这里插入图片描述

  • 对虚拟出ip 172.30.24.96的数据库进行访问。

查询结果为1,说明当前实际上走的是172.30.24.97上的数据库。
在这里插入图片描述

  • 手动停止172.30.24.97上的数据库服务。

再次查看172.30.24.96,如果查询成功且server_id成功变成2,说明数据库自动故障转移成功。

4、其他

  • keepalived配置,最初使用的是172.30.24.97主节点配置 state MASTER 、172.30.24.98子节点配置 state BACKUP

测试现象(从两台都未启动状态开始)
1、启动172.30.24.98,vip指向172.30.24.98。
2、启动172.30.24.97,vip指向172.30.24.97。
3、停掉172.30.24.97,vip指向172.30.24.98。
4、启动172.30.24.97,vip指向172.30.24.97。

一开始我以为是配置的MASTER生效了,一直都以172.30.24.97为主。
后来换了下顺序

6、停掉172.30.24.98,vip指向172.30.24.97。
7、启动172.30.24.98,vip指向172.30.24.98。

总结现象是:谁是最新启动的,谁就是当前的主节点
为了解决这个又去搜了一下配置文件,发现了一些其他情况。

  • 两个配置都使用 state BACKUP

如果两个keepalived配置都使用BACKUP,此时虚ip会以优先级高的访问。不论启动先后顺序。

测试现象(从两台都未启动状态开始)
1、启动172.30.24.98,vip指向172.30.24.98。
2、启动172.30.24.97,vip指向172.30.24.97。
3、停掉172.30.24.97,vip指向172.30.24.98。
4、启动172.30.24.97,vip指向172.30.24.97。
6、停掉172.30.24.98,vip指向172.30.24.97。
7、启动172.30.24.98,vip指向172.30.24.97。

可以看到最后一步结果有所不同,总结现象是:只要有优先级高的服务启动,就会vip漂移到优先级高的服务上

  • 172.30.24.97主节点配置 state MASTER 、172.30.24.98子节点配置 state BACKUP ;优先级高的172.30.24.97配置添加属性 nopreempt # 不抢占模式,在优先级高的机器上设置即可,优先级低的机器可不设置
vrrp_instance VI_1 {
    state BACKUP                    # 设置的当前主机为主节点,如果是备用节点,则设置为BACKUP
    interface ens3                  # 主机网卡 可以用ifconfig查看来决定设置哪一个    
    mcast_src_ip 172.30.24.97       # 主机ip 
    virtual_router_id 35            # 路由器标识,MASTER和BACKUP必须是一致的
    priority 101                    # 定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
    advert_int 1                    # 设置VRRP Advertisement(通告)消息的发送间隔为"1"秒
	nopreempt                       # 不抢占模式,在优先级高的机器上设置即可,优先级低的机器可不设置
    authentication {                # 设置VRRP的认证信息,用于确保只有经过认证的路由器才能参与VRRP组。
        auth_type PASS              # 指定认证类型为"PASS",表示使用密码进行认证
        auth_pass 1111              # 设置密码为"1111",用于进行认证
    } 
	
	# 设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中
    # 当状态切换到BACKUP时,此IP会自动从系统中删除
    # 可以通过命令ip addr查看切换后的状态
    virtual_ipaddress {
		# 虚拟IP地址
        172.30.24.96                
    }
	
	# 集群资源监控,组合vrrp-script进行
    track_script {
        chk_mysql_port
    }
} 

测试现象(从两台都未启动状态开始)
1、启动172.30.24.98,vip指向172.30.24.98。
2、启动172.30.24.97,vip指向172.30.24.97。
3、停掉172.30.24.97,服务不可用。

总结现象是:谁是最新启动的,谁就是当前的主节点,但是nopreempt 模式会禁止优先级更高的备用节点接管 VIP,所以172.30.24.97服务挂掉后,会导致整个服务不可用。直到主节点恢复或者手动操作来切换 VIP 到备用节点。

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

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

相关文章

推箱子_java源码_50张地图_带背景音乐

一. 演示视频 推箱子_java源码_50张地图_带背景音乐 二. 实现步骤 完整项目获取 https://githubs.xyz/y23.html 部分截图 map地图实现 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00000000000000000000 00…

golang和Java的简单介绍和对比

一、golang 1、Golang简介 Golang&#xff0c;也称为Go&#xff0c;是由Google公司在2009年推出的开源编程语言&#xff0c;由罗伯特格瑞史莫(Rob Pike)、肯汤普逊(Ken Thompson)、罗勃派克(Robert Griesemer)等人设计。Go语言的目标是在保持简单高效的编程模型的同时&#xf…

NumPy创建ndarray数组大揭秘

1.使用 np.array() 创建 使用 np.array() 由 python list 创建 n np.array(list) 注意 numpy 默认 ndarray 的所有元素的类型是相同的 如果传进来的列表中包含不同的类型&#xff0c;则统一为同一类型&#xff0c;优先级&#xff1a;str > float > int ndarray 的常…

自动驾驶中基于Transformer的传感器融合:研究综述

自动驾驶中基于Transformer的传感器融合&#xff1a;研究综述 论文链接&#xff1a;https://arxiv.org/pdf/2302.11481.pdf 调研链接&#xff1a;https://github.com/ApoorvRoboticist/Transformers-Sensor-Fusion 附赠自动驾驶学习资料和量产经验&#xff1a;链接 摘要 本…

【论文笔记】Text2QR

论文&#xff1a;Text2QR: Harmonizing Aesthetic Customization and Scanning Robustness for Text-Guided QR Code Generation Abstract 二维码通常包含很多信息但看起来并不美观。stable diffusion的出现让平衡扫描鲁棒性和美观变为可能。 为了保证美观二维码的稳定生成&a…

【PowerDesigner】PGSQL反向工程过程已中断

问题 反向工程过程已中断,原因是某些字符无法通过ANSI–&#xff1e;UTF-16转换进行映射。pg导入sql时报错&#xff0c;一查询是power designer 反向工程过程已中断&#xff0c;某些字符无法通过ANSI–>UTF-16转换进行映射&#xff08;会导致数据丢失&#xff09; 处理 注…

获取用户位置数据,IP定位离线库助您洞悉消费者需求

获取用户位置数据是现代互联网应用中非常重要的一环。通过获取用户的位置数据&#xff0c;可以了解用户所在的地理位置&#xff0c;从而更好地为用户提供个性化的服务和推荐。而IP归属地离线库就是一种非常有用的工具&#xff0c;可以帮助企业准确地获取用户的位置信息。 IP归…

Linux系统编程--管道

1、管道&#xff08;一&#xff09; 1.1、什么是管道 例如&#xff1a;ls | wc -w这条命令&#xff0c;ls是一个进程&#xff0c;把结果通过|管道输出到wc这个进程中&#xff0c;所以管道本质上是一个内核缓冲区 1.2、管道限制 1.3、匿名管道pipe 1.4、创建管道后示意图 管道…

E-SOP电子指导书系统在日用品生产中的作用

在当今高速发展的日用品生产行业中&#xff0c;E-SOP 电子指导书系统正发挥着越来越重要的作用。它以其独特的优势&#xff0c;为日用品生产带来了许多积极的影响。 1、E-SOP 电子指导书系统提高了生产效率。 在传统的生产方式中&#xff0c;工人往往需要查阅纸质指导书&#…

vue+springboot实现文件上传

①后端springboot创建controller FileController: package com.example.springboot.controller;import cn.hutool.core.io.FileUtil; import com.example.springboot.common.AuthAccess; import com.example.springboot.common.Result; import org.springframework.beans.fact…

【电源专题】电池不均衡的影响与原因

在使用多节电池设计产品时,大家都知道如果多节电池不均衡会影响电池寿命与充电安全。特别是在充电末端与放电末端时表现较为明显。 电池不均衡的影响 那么为什么会影响安全与寿命呢?其原因如下: 如果电池不均衡时,相当于木桶的短板效应。一方面没法充满,充电时电压高的那一…

YOLOv8结合SCI低光照图像增强算法!让夜晚目标无处遁形!【含端到端推理脚本】

这里的"SCI"代表的并不是论文等级,而是论文采用的方法 — “自校准光照学习” ~ 左侧为SCI模型增强后图片的检测效果,右侧为原始v8n检测效果 这篇文章的主要内容是通过使用SCI模型和YOLOv8进行算法联调,最终实现了如上所示的效果:在增强图像可见度的同时,对图像…

2024最新软件测试【测试理论+ python 编程 】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

教你一文搞懂cookie

cookie 1、cookie是什么&#xff1f; cookie的中文翻译是曲奇&#xff0c;小甜饼的意思。cookie其实就是一些数据信息&#xff0c;类型为“小型文本文件”&#xff0c;存储于电脑上的文本文件中。 2、cookie有什么用&#xff1f; Cookie主要用于维持用户会话、个性化服务、…

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

基于Springboot的一站式家装服务管理系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的一站式家装服务管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体…

Linux系统下安装jdk与tomcat【linux】

一、yum介绍 linux下的jdk安装以及环境配置&#xff0c;有两种常用方法&#xff1a; 1.使用yum一键安装。 2.手动安装&#xff0c;在Oracle官网下载好需要的jdk版本&#xff0c;上传解压并配置环境。 这里介绍第一种方法&#xff0c;在此之前简单了解下yum。 yum 介绍 yum&…

Micron FY24 Q2业绩强劲,凭内存实现翻盘

根据TechInsights数据显示&#xff0c;美光科技24财年第二季度业绩强劲&#xff0c;公司通过技术创新和产能优化&#xff0c;成功抓住了AI服务器和其他高性能应用带来的市场需求增长机遇。尽管短期内面临供应紧张的问题&#xff0c;但美光通过加大研发投入和产能转换力度&#…

重磅!OpenAI宣布无需注册即可使用GPT

以下转自&#xff1a;凌晨重磅&#xff01;GPT今天起无需注册就能用 今天凌晨&#xff0c;OpenAI 宣布&#xff0c; GPT 无需注册就能立即使用。 目前每周有来自全球 185 个国家和地区的 1 亿多人在使用 GPT 获取新知识&#xff0c;OpenAI 正在逐步开放这项服务&#xff0c;旨…

LeetCode刷题记(一):1~30题

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以…