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

需求:想要实现当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 到备用节点。

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

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

相关文章

浅试Kimi

最近KIMI大模型挺火的&#xff0c;擅长处理中文文本&#xff0c;咱也来试试吧&#xff01; 测试问题&#xff1a; 写一篇800字以上的短片小说&#xff1a;主要故事是以一位上进但其他方面表现平平的大男孩小贱&#xff0c;刚到公司不久&#xff0c;就被一位名叫大弟的女同事看…

量化交易入门(二十八)什么是布林带,量化中怎么使用

什么叫布林带 布林带&#xff08;Bollinger Bands&#xff09;是一种常用的技术分析指标&#xff0c;由约翰布林&#xff08;John Bollinger&#xff09;于20世纪80年代开发。它由三条线组成&#xff1a;中轨&#xff08;通常为20日移动平均线&#xff09;、上轨&#xff08;中…

python编程软件有什么

Python开发软件可根据其用途不同分为两种&#xff0c;一种是Python代码编辑器&#xff0c;一种是Python集成开发工具&#xff0c;两者的配合使用可以极大的提高Python开发人员的编程效率&#xff0c;以下是常用的几款Python代码编辑器和Python集成开发工具。 一、Python代码编…

嵌入式linux学习之交叉编译器安装

交叉编译器介绍 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译&#xff0c;但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编…

深入理解Java接口:定义、使用与重要性(day13)

导语&#xff1a;Java接口是Java编程语言中的一个核心概念&#xff0c;它提供了一种定义方法但不包含方法实现的方式。接口在Java编程中扮演着重要角色&#xff0c;能够帮助我们实现代码的高内聚、低耦合&#xff0c;提高代码的复用性和可维护性。本文将详细介绍Java接口的定义…

python练习四

1. 求一个十进制的数值的二进制的0、1的个数 def count_binary_ones(n):binary_str bin(n)[2:] # 转换为二进制字符串&#xff0c;去除前缀0bprint(f"{n} 的二进制为: {binary_str}")return binary_str.count(0), binary_str.count(1) n int(input("输入一个…

Python车道线偏离预警

程序示例精选 Python车道线偏离预警 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《Python车道线偏离预警》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推…

memcached缓存数据库简介

memcached是一套分布式的高速缓存系统&#xff0c;由LiveJournal的Brad Fitzpatrick开发&#xff0c;但被许多网站使用。这是一套开放源代码软件&#xff0c;以BSD license授权发布。 memcached缺乏认证以及安全管制&#xff0c;这代表应该将memcached服务器放置在防火墙后。 …

自建机房私有云吗?

大家好&#xff0c;我是小码哥&#xff0c;之前一种有没搞清楚公有云、私有云的概念&#xff0c;今天算是弄清楚了&#xff0c;这里给大家分享一下公有云、私有云的区别&#xff0c;以及自建机房算不算私有云&#xff01; 其实私有云&#xff08;Private Cloud&#xff09;和公…

快排(六大排序)

快速排序 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子序列中所…

个人简历主页搭建系列-05:部署至 Github

前面只是本地成功部署网站&#xff0c;网站运行的时候我们可以通过 localhost: port 进行访问。不过其他人是无法访问我们本机部署的网站的。 接下来通过 Github Pages 服务把网站部署上去&#xff0c;这样大家都可以通过特定域名访问我的网站了&#xff01; 创建要部署的仓库…

Spring 源码调试错误修复

Spring 源码调试错误修复 文章目录 Spring 源码调试错误修复1. fatal: not a git repository (or any of the parent directories): .git问题描述解决方案 2. fatal: Needed a single revision问题描述解决方案 1. fatal: not a git repository (or any of the parent director…

14.Java为什么这么火、Java主要特性

文章目录 一、Java为什么这么火&#xff1f;二、Java主要特性 一、Java为什么这么火&#xff1f; 一个语言火不火、能不能长久的生存下去&#xff0c;主要其实是看四个方面 1、用户量&#xff1a;使用的程序员多不多。 不管在国内&#xff0c;还是在国外&#xff0c;使用Jav…

ASCII查询

最近踩的字符坑有点多&#xff0c;自己写了个ASCII查询&#xff0c;不用求人了。 <html> <head> <title>ASCII码查询</title> <style> table { border-collapse:collapse; } th, td { border:1px solid black; padding:10px; text-align:center;…

Java基础之算数运算符的初级用法

运算符 运算符: 对字面量或者变量进行操作的符号 表达式: 用运算符把字面量或者变量连接起来,符合java语法的式子就可以称为表达式 不同运算符连接的表达式体现的是不同类型的表达式 一 .算数运算符 实践一下 加 减 乘 运行结果: 除 取模 运行结果 练习: 数值拆分 需求…

Doris实践——叮咚买菜基于OLAP引擎的应用实践

目录 前言 一、业务需求 二、选型与对比 三、架构体系 四、应用实践 4.1 实时数据分析 4.2 B端业务查询取数 4.3 标签系统 4.4 BI看板 4.5 OLAP多维分析 五、优化经验 六、总结 原文大佬介绍的这篇Doris数仓建设实践有借鉴意义的&#xff0c;这些摘抄下来用作沉淀学…

Makefile用法及变量

一、Makefile概述 自动化编译”&#xff1a;一旦写好&#xff0c;只需要一个make命令&#xff0c;整个工程完全自动编译&#xff0c;极大的提高了软件开发的效率。 提升编译效率&#xff1a;再次编译&#xff0c;只编译修改的文件。 通过检查时间来检查文件是否被修改过 二…

零拷贝技术探讨

零拷贝技术是一种用于提高数据传输效率的网络技术&#xff0c;主要应用于网络服务器中。它通过减少数据在操作系统内核空间和用户空间之间的复制次数来提高性能。 在传统的网络服务器中&#xff0c;当客户端向服务器发送请求时&#xff0c;服务器会从磁盘读取数据&#xff0c;…

3.亿级积分数据分库分表:ShardingSphere官方提供的平滑数据迁移方案介绍,有什么缺点呢?

前面的 2.亿级积分数据分库分表&#xff1a;增量数据同步之代码双写&#xff0c;为什么没用Canal&#xff1f; 博客中介绍了实现平滑数据迁移的两种方案&#xff1a;Canal监听MySQL的binlog、代码双写&#xff0c;也分别介绍了两种方案的实现原理及优缺点&#xff0c;最后基于…

VTK 9.2.6 源码和VTK Examples 编译 Visual Studio 2022

对于编译 VTK 源码和编译详细的说明&#xff1a; VTK 源码编译&#xff1a; 下载源码&#xff1a; 从 VTK 官方网站或者 GitHub 获取源代码。官网目前最近的9.3.0有问题&#xff0c;见VTK 9.3.0 编译问题 Visual Studio 2022去gitlab上选择9.2.6分支进行clone CMake 配置&…