高可用(keepalived)部署方案

news2024/11/15 17:17:56

前言:为了减少三维数据中心可视化管理系统的停工时间,保持其服务的高度可用性。同时部署多套同样的三维可视化系统,让三维数据中心可视化系统同时部署并运行到多个服务器上。同时提供一个虚拟IP,然后外面通过这个虚拟IP来访问三维可视化管理系统,当一台实体服务器挂掉时会自动的切到另一条服务器,但是这个虚拟IP依然能提供服务。

要实现高可用性,需要保证数据的一致,因此需要保证这几台服务器上的数据库中的数据一致;同时还需要保证上传的文件信息一致。最后需要通过软件监听程序来监听并且挂掉时进行自动切换。

一、什么是高可用?

高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。

假设系统一直能够提供服务,我们说系统的可用性是100%。

如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。

很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。

百度的搜索首页,是业内公认高可用保障非常出色的系统,甚至人们会通过www.baidu.com 能不能访问来判断“网络的连通性”,百度高可用的服务让人留下啦“网络通畅,百度就能访问”,“百度打不开,应该是网络连不上”的印象,这其实是对百度HA最高的褒奖。-----摘选自知乎

二、如何保障系统的高可用

我们都知道,单点是系统高可用的大敌,单点往往是系统高可用最大的风险和敌人,应该尽量在系统设计的过程中避免单点。方法论上,高可用保证的原则是“集群化”,或者叫“冗余”:只有一个单点,挂了服务会受影响;如果有冗余备份,挂了还有其他backup能够顶上。

保证系统高可用,架构设计的核心准则是:冗余。

有了冗余之后,还不够,每次出现故障需要人工介入恢复势必会增加系统的不可服务实践。所以,又往往是通过“自动故障转移”来实现系统的高可用。-----摘选自知乎

人话:两台服务器启动着相同的服务,如果有一台故障,另一台自动接管,我们将这个称之为高可用;

类似服务器:冗余,类似服务器有2-4个电源,但是比较贵

上图:

安装keepalived:

离线安装方法:因为我们的大部分客户都是属于数据中心,并不会连接外网,所以采取离线安装的方式比较多,在线安装的方法非常简单,如下命令即可,在安装keepalived之前确保安装了摄像头的那一套东西,因为这里涉及到需要安装openssl的模块,如果没有装请先装nginx摄像头相应的软件

keepalived的运行模式:

准备条件:

需要三个ip,并且保证是局域网,相互之间ping的通,前面两个ip好理解,两台服务器,第三个ip就是一个虚拟ip,就是空余ip没被启用的即可,我们访问系统的话就是通过这个虚拟ip访问

优先级

VRRP根据优先级来确定虚拟路由器中每台路由器的地位;

非抢占方式

如果Backup路由器工作在非抢占方式下,则只要Master路由器没有出现故障Backup路由器即使随后被配置了更高的优先级也不会成为Master路由器;

抢占方式

如果Backup路由器工作在抢占方式下,当它收到VRRP报文后,会将自己的优先级与通告报文中的优先级进行比较。如果自己的优先级比当前的Master路由器的优先级高,就会主动抢占成为Master路由器;否则,将保持Backup状态.

yum install keepalived-y

1.上传文件

1.首先把文件传到opt下面

2.解压安装

cd /opt   
tar -zxvf keepalived-2.0.20.tar.gz

3.编译

cd  keepalived-2.0.20

./configure --prefix=/usr/local/keepalived

会发现有一个报错

4.报错信息然后安装

cd /opt
rpm -ivh libnl-1.1.4-3.el7.x86_64.rpm --force --nodeps
rpm -ivh libnl-devel-1.1.4-3.el7.x86_64.rpm --force --nodeps
cd keepalived-2.0.20
./configure --prefix=/usr/local/keepalived

没有报错了,继续往下执行

 make && make install

输入上面的命令会报以下错误

解决:

cd /usr/local/lib64
export LIBRARY_PATH=/usr/local/lib64
cd /opt/keepalived-2.0.20
./configure --prefix=/usr/local/keepalived
 make && make install

执行完之后也报错了

5.初始化keepalived

 cp /opt/keepalived-2.0.20/keepalived/etc/init.d/keepalived /etc/init.d/
 cp /opt/keepalived-2.0.20/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
mkdir -p /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
chmod +x /etc/init.d/keepalived

6.添加keepalived到开机启动

chkconfig —add keepalived 

chkconfig keepalived on 

7.启动、关闭、重启

service keepalived start  //启动
service keepalived stop   //停止
service keepalived restart   //重启

当我们启动使用 service keepalived start 启动的时候会报错

解决:

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1

在输入命令启动

service keepalived start

以上的1-7步骤在备机上也需要装一下,请注意

8.配置keepalived

主机:192.168.10.51

备机:192.168.10.65

虚拟ip:192.168.10.77

在主机下操作:

vi /etc/keepalived/keepalived.conf

以下就是我们需要修改的内容

填完直接 :wq!保存退出即可

上面图里面说的网卡名称查询方法:

ip addr

然后重启keepalived

service keepalived restart

service keepalived status     //查看keepalived的状态,下图表示已经启动

在备机下操作:

vi /etc/keepalived/keepalived.conf

以下就是我们需要修改的内容

填完直接 :wq!保存退出即可

然后重启keepalived

service keepalived restart

service keepalived status     //查看keepalived的状态,下图表示已经启动

9.验证

启动后看对应的虚拟IP地址是否生成,当主机关掉或者其对应的keepalived挂掉后备机是否生成对应的虚拟IP,以及主机重启工作时虚拟IP是否重新漂移到主机上。

我们可以相互ping一下,可以看见是通的

上面我们讲过,默认访问就是主机,主机挂了就是切换到备机,我们只需要查看主机上面的ip,上面很明显有两个ip,其中有一个就是虚拟机ip

当我们把主机关掉或者主机的keepalived服务关掉之后看能否重新漂移回来呢?

我们再看看ip addr,很明显已经没有了虚拟ip

我们已经成功关掉了主机的keepalived服务,我们看下备机上能够看到虚拟ip吗

我们在备机上操作,我们可以看到虚拟ip跑到了这上面,看到这里你是不是对keepalived的工作模式有了一个浅显的认识,接下来我们开启主机的keepalived服务,能够在跳过去嘛.这就是模拟当主机已经恢复服务了,看能否自动跳转过去

启动主机的keepalived服务:

service keepalived start
service keepalived status

查看ip,很明显已经切换回来了,自此已经配置完成了keepalived服务

mysql主主备份:

保证各服务器上的数据库中的数据一致,因此需要开启数据库同步机制。由于是一整套系统,并且系统内含数据库。由于任何一台服务器都有可能被选中,因此要让所有的数据库上的数据都是最新的,任何一个服务器上的数据发生变化时都要自动的同步到其他的服务器上。

三维可视化管理系统使用的时Mysql数据库,这里采用的时主-主备份机制进行同步的。

主一数据库:192.168.10.51

主二数据库:192.168.10.65

主数据库1:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin

# 设置ID,不能重复,可以使用IP最后一位数字 
server-id=129

# 需要同步的数据名称,多个数据库则要重复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可
replicate-do-db=itv

# 自增长字段初始值为1
auto-increment-offset=1

# 自增长字段增量值
auto-increment-increment=2

# 跳过所有复制的错误
slave-skip-errors=all

systemctl restart mysqld   //重启mysql服务

主数据库2:

编辑数据库

vi /etc/my.cnf
# 开启二进制同步
log-bin=mysql-bin

# 设置ID,不能重复,可以使用IP最后一位数字 
server-id=128

# 需要同步的数据名称,多个数据库则要重复设置: bin-do-db,bin-ignore-db为互斥关系, 只需设置其中一项即可
replicate-do-db=itv

# 自增长字段初始值为1
auto-increment-offset=1

# 自增长字段增量值
auto-increment-increment=2

# 跳过所有复制的错误
slave-skip-errors=all

systemctl restart mysqld   //重启mysql服务

创建mysql复制账户:

在主一数据库操作:

为主二的所在的ip创建一个账号密码为root1,这样就能够允许远程访问本机数据库了

登录mysql:

mysql -uroot -proot   //登录mysql
grant replication slave on *.* to root1@'192.168.10.68' identified by 'root1';

赋予权限:如果就这样连接的话虽然能访问但还是看不了数据的,所以需要赋予root1权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',
`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',
`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',
`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'
where user='root1';

立即生效:

flush privileges;

在主二数据库操作:

为主一的所在的ip创建一个账号密码为root1,这样就能够允许远程访问本机数据库了

登录mysql:

mysql -uroot -proot   //登录mysql
grant replication slave on *.* to root1@'192.168.10.67' identified by 'root1';

赋予权限:如果就这样连接的话虽然能访问但还是看不了数据的,所以需要赋予root1权限

update user set `Select_priv` = 'Y',`Insert_priv` = 'Y',`Update_priv` = 'Y',`Delete_priv` = 'Y',`Create_priv` = 'Y',`Drop_priv` = 'Y',
`Reload_priv` = 'Y',`Shutdown_priv` = 'Y',`Process_priv` = 'Y',`File_priv` = 'Y',`Grant_priv` = 'Y',`References_priv` = 'Y',
`Index_priv` = 'Y',`Alter_priv` = 'Y',`Show_db_priv` = 'Y',`Super_priv` = 'Y',`Create_tmp_table_priv` = 'Y',
`Lock_tables_priv` = 'Y',`Execute_priv` = 'Y',`Repl_slave_priv` = 'Y',`Repl_client_priv` = 'Y',`Create_view_priv` = 'Y',
`Show_view_priv` = 'Y',`Create_routine_priv` = 'Y',`Alter_routine_priv` = 'Y',`Create_user_priv` = 'Y',`Event_priv` = 'Y',
`Trigger_priv` = 'Y',`Create_tablespace_priv` = 'Y'
where user='root1';

立即生效:

flush privileges;

测试能否访问:

在主一登录主二的数据库:

mysql -h192.168.10.65 -uroot1 -p    //登录主二的数据库

发现连接失败

我们查看3306端口发现被占用,我们开启3306端口,我们在主备机都需要开放此端口

应该是防火墙的原因,

firewall-cmd --zone=public --add-port=3306/tcp --permanent

然后重启防火墙

systemctl restart firewalld.service

继续连接,发现可以连接成功,并且可以查看数据

show databases;  //查看数据库

同理,在主二的数据库可以访问主一的数据库看下:

mysql -h192.168.10.51 -uroot1 -p    //登录主一的数据库
show databases;  //查看数据库

重启数据库

主数据库1: systemctl restart mysqld
主数据库2: systemctl restart mysqld 

互告bin-log信息

主主同步还有主从同步都是基于binlog的原理进行,相当于我们打开了这个开关,每次操作数据库都会产生一个binlog日志,然后把binlog日志进行发给对方进行执行,这样数据就保持同步了

首先进入MySQL命令行:

主数据库1:

查看日志: show master status;

设置同步:

change master to master_host = '192.168.10.65',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注: master_log_file与File值一致, master_log_pos与Position值一致

开始同步: start slave;

查看同步情况:

show slave status\G;

当看到了两个yes,即:Slave_IO_Running: Yes

Slave_SQL_Running: Yes

说明已经配置成功了,但是这里有一个显示为no,明显有问题

解决办法:

stop slave;
reset slave;
start slave;

然后我们继续查看同步情况;

show slave status\G;

灰常完美

主数据库2:

这里其实跟上面的主数库一是一样的操作

show master status;

change master to master_host = '192.168.10.51',master_user='root1',master_password='root1',master_port=3306,master_log_file='mysql-bin.000002',master_log_pos=154;

备注: master_log_file与File值一致, master_log_pos与Position值一致

开始同步:

  start slave;

查看同步情况:

 show slave status\G;

当看到了两个yes,即:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

说明已经配置成功了,如果这里的slave_io_Running显示no依然采用上面的办法操作即可

开启项目测试:

在主一和主二机器上分别部署项目,并且导入相同的数据库,然后用forever启动,这个在之前的部署环境就有讲过,此处不再赘述,我们开启项目

在主机上开启机房:

在备机上也开启机房:

然后我们开始访问这两个项目(注意此时的防火墙,把8081端口打开):

我们发现两个项目都可以顺利的打开,这时候我们就使用虚拟ip进行访问,因为实际我们也是通过这个虚拟ip进行访问的,我们的虚拟ip是192.168.10.77,一i就那个可以顺利访问了,现在我们就关掉主机的机房程序,看他能不能访问

关掉主机服务:

forever stopall

我们还需要吧keepalived的服务关了,因为keepalived并不知道我们的机房程序已经挂了,所以要时刻监听8081端口的状态,如果8081端口监听不到那么就停止keepalived这个服务,以下是sheel脚本,然后我们设置监听一分钟即可

A=`netstat -lnp | grep 8081 | wc -l`

if [ $A -eq 0 ]; then
    # echo "keepalived 应该关闭了"
    /usr/sbin/service keepalived stop
fi

然后关掉keepalived的服务:

service keepalived stop

现在我们继续访问主机的程序,然后在访问虚拟ip

可以看到,主机程序已经访问不到,那么虚拟ip呢(这里注意虚拟ip机大的防火墙一定要关闭或者是开放8081端口)

可以看到,虚拟ip已经飘到备用服务器上了,这时候备机上面已经有了虚拟ip

如果现在主机重新上线,虚拟ip还会从备机飘到主机上,这时候就会产生一个现象,就是脑裂

我们启动主机的机房并且启动keepalived 

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

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

相关文章

什么叫前后端分离?为什么需要前后端问题?解决了什么问题?

单体架构出现的问题 引出:来看一个单体项目架构的结构 通过上述可以看到单体架构主要存在以下几点问题: 开发人员同时负责前端和后端代码开发,分工不明确开发效率低前后端代码混合在一个工程中,不便于管理对开发人员要求高(既会前…

layui框架学习(34:数据表格_基本用法)

Layui中的数据表格模块table支持动态显示并操作表格数据,之前学习的页面元素中的表格主要是通过使用样式及属性对表格样式进行设置,而table模块支持动态显示、分页显示、排序显示、搜索等形式各样的动态操作,参考文献3中也给出了数据表格的各…

CRM如何进行数据分析?有什么用?

什么是CRM数据分析软件?CRM数据分析软件可以对数据进行挖掘、统计和分析,帮助企业从大量的客户数据中提取有价值的信息,分析数据背后的含义,从而帮助企业更好地运营的一种工具。 1、提高客户满意度 CRM数据分析软件可以通过对客户…

【C语言所有操作符详解1】

目录 操作符分类: 算术操作符 移位操作符 移位操作符介绍 原码,反码,补码 左移操作符 右移操作符 位操作符 赋值操作符 赋值操作符 复合赋值符 单目操作符 单目操作符介绍 sizeof 和 数组 关系操作符 逻辑操作符 操作符分类: 算术操…

痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU启动那些事(10.A)- FlexSPI NAND启动时间(RT1170)...

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RT1170 FlexSPI NAND启动时间。 本篇是 i.MXRT1170 启动时间评测第四弹,前三篇分别给大家评测了 Raw NAND 启动时间(基于 MIMXRT1170-EVK_Rev.B)、Serial NOR 启动…

模电模电基础知识学习笔记汇总

来源:一周搞(不)定数电模电全集,电子基础知识 11小时 一:模电学习笔记 模电主要讲述:对模拟信号进行产生、放大和处理的模拟集成电路重点知识:常用电子元器件:电阻、电容、电感、保…

PostGis -基础、Springboot 整合、电子围栏处理

目的: 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据,如:存储一个 多边形 到数据。PostGis中 geometry、geography :基本空间数据类型,用于表达点线面等空间要素,具体类型涵盖了OGC的简单对象模…

Java类的加载过程是什么?

本文重点 本文将学习类的加载过程,java命令将class文件放到类加载器中,那么之后经历了什么?本文将对其进行学习。 类加载方式? 两种加载方式:隐式加载(静态加载)和显式加载(动态加载) 隐式加载指的是在程序使用new等方式创建对象的时候,会隐式地调用类的加载器把…

人工智能轨道交通行业周刊-第53期(2023.7.24-7.30)

本期关键词:交通大模型、铁路十大创新、隧道病害检测、信号专业标准、Llama-2测评 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetr…

golang中降本增效的常规实践

最近一年各大中小厂都在搞"优化",说到优化,目的还是"降本增效",降低成本,增加效益(效率)。 技术层面,也有一些降本增效的常规操作。 比如池化、io缓冲区技术 golangC#eg.池…

stable diffusion打造自己专属的LORA模型

通过Lora小模型可以控制很多特定场景的内容生成。 但是那些模型是别人训练好的,你肯定很好奇,我也想训练一个自己的专属模型(也叫炼丹~_~)。 甚至可以训练一个专属家庭版的模型(family model&…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第四十一天 41/50【异或】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

自定义类型知识详解(结构体,位段,枚举,联合体)

目录 结构体 定义,初始化,自引用 内存对齐,修改默认对齐数 传参 位段 位段内存问题 跨平台及其应用问题 枚举 定义,初始化 实战举例使用及其优点 联合体 联合体定义 特点 大小计算问题 结构体 定义,初始化&#xff…

揭秘 ChatGPT:构建 AI 搜索的不同方法

作者:Sherry Ger 什么是 ChatGPT? 首先,ChatGPT 太棒了! 它可以帮助你更高效地工作 —— 从总结 10,000 字的文档到提供竞争产品之间的差异列表,以及许多其他任务。 ChatGPT 是最著名的基于 Transformer 架构的大型语…

SpringBoot读取配置文件顺序

文章目录 一、前言二、SpringBoot配置文件目录读取顺序源码解析 三、SpringBoot配置文件类型读取顺序源码解析 一、前言 本文通过源码分析 SpringBoot 加载配置文件目录的顺序,以及 properties、xml、yml、yaml文件的读取顺序 二、SpringBoot配置文件目录读取顺序…

前端学习——Vue (Day7)

vuex 构建 vuex [多组件数据共享] 环境 state状态 mutations状态 mapMutations actions mapActions getters 模块 module (进阶语法) 综合案例 - 购物车 axios报错解决方案 import axios from axiosexport default {namespaced: true,state () {return {list: []}},mutations…

用户体系之账户设计

文章目录 前言一、需求分析1、登录功能2、退出功能3、账号绑定功能3、其他注意事项 二、账户设计1、表设计2、QA 三、实践1、账户密码登录2、手机号登录3、第三方授权登录4、账户统一 前言 随着互联网的发展,越来越多的应用、网站需要用户进行登录才能使用。为了方…

LeetCode 刷题 数据结构 数组 283题 移动零

难度:简单 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入:…

QGraphicsView实现简易地图2『瓦片经纬度』

前文链接:QGraphicsView实现简易地图1『加载离线瓦片地图』 地图采用GCJ02 Web 墨卡托投影,最小坐标:(-180.00000000000000,-85.05112877980655),最大坐标:(180.00000000000000,85.05112877980655)。瓦片地图单张图片像…

如何通俗理解扩散模型?

扩散模型(Diffusion Model)是一类十分先进的基于扩散思想的深度学习生 成模型。生成模型除了扩散模型之外,还有出现较早的 VAE ( Variational Auto- Encoder,变分自编码器) 和 GAN ( Generative Adversarial Net ,生成对抗网络) 等。 虽然它们…