当前位置: 首页 > news >正文

[Linux] LVS+Keepalived高可用集群部署

一、Keepalived实现原理

1.1 高可用方案

Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案,可以解决静态路由出现的单点故障问题。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP(VIP),主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

 1.2 主要模块及其作用

keepalived体系架构中主要有三个模块,分别是core、check和vrrp。
●core模块:为keepalived的核心,负责主进程的启动、维护及全局配置文件的加载和解析。
●vrrp模块:是来实现VRRP协议的。(调度器之间的健康检查和主备切换)
●check模块:负责健康检查,常见的方式有端口检查及URL检查。(节点服务器的健康检查)

1.3 Keepalived实现原理

       1. 由多台路由器组成一个热备组,通过共用的虚拟IP地址对外提供服务。

       2. 每个热备组内同时只有一台主路由器提供服务,其他路由器处于冗余状态。

       3. 若当前在线的路由器失效,则其他路由器会根据设置的优先级自动接替虚拟IP地址,继续提供服务。

        4.在配置时设置优先级,优先级高的那一方为master。master节点承载着VIP地址。

在一个LVS服务集群中通常有主服务器(MASTER)和备份服务器(BACKUP)两种角色的服务器,但是对外表现为一个虚拟IP,主服务器会发送VRRP通告信息给备份服务器,当备份服务器收不到VRRP消息的时候,即主服务器异常的时候,备份服务器就会接管虚拟IP,继续提供服务,从而保证了高可用性。

        主服务器作用:转发数据;发送报文告诉备服务器自己在线。

        备服务器作用:监听主服务器发来的数据;收不到消息的时候就接替主服务器。

二、脑裂现象及预防 

2.1 脑裂现象及其诱发原因

脑裂现象: 主服务器和备服务器同时拥有vip地址

产生脑裂的常见原因

因为主服务器和备服务器之间通信链路中断,导致备服务器无法收到主服务器发送的vrrp消息,备服务器误认为主服务器故障了并通过IP命令生成vip地址。

2.2 脑裂预防预防措施 

1. 主服务器和备服务器之间添加双链路通信。

2. 在主服务器上添加脚本进行判断与备服务器进行通信链路是否中断,如果确实是链路中断则关闭keepalived服务。

3. 利用第三方应用或监控系统检测系统是否发送脑裂故障,如果发送脑裂故障则通过第三方应用或监控系统来关闭主服务器或备服务器的keepalived服务。

三、LVS+KeepAlived的部署

3.1 配置keeplived主备设置

cd /etc/keepalived/
cp keepalived.conf keepalived.conf.bak
vim keepalived.conf
......
global_defs {						#定义全局参数
--10行--修改,邮件服务指向本地smtp_server 127.0.0.1
--12行--修改,指定服务器(路由器)的名称,主备服务器名称须不同,主为LVS_01,备为LVS_02router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接#vrrp_strict
}vrrp_instance VI_1 {				#定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUPstate MASTER
--21行--修改,指定承载vip地址的物理接口interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致	virtual_router_id 10#nopreempt		#如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90priority 100advert_int 1					#通告间隔秒数(心跳频率)authentication {				#定义认证信息,每个热备组保持一致auth_type PASS				#认证类型
--27行--修改,指定验证密码(可以自定义),主备服务器保持一致auth_pass 1111   }virtual_ipaddress {				#指定群集vip地址192.168.136.200}
}
--36行--修改,指定虚拟服务器地址(VIP)、端口,定义虚拟服务器和Web服务器池参数
virtual_server 192.168.136.200 80 {delay_loop 6					#健康检查的间隔时间(秒)lb_algo rr						#指定调度算法,轮询(rr)
--39行--修改,指定群集工作模式,直接路由(DR)lb_kind DRpersistence_timeout 0			#连接保持时间(秒)protocol TCP					#应用服务采用的是 TCP协议
--43行--修改,指定第一个Web节点的地址、端口real_server 192.168.136.120 80 {weight 1					#节点的权重
--45行--删除,添加以下健康检查方式		TCP_CHECK {connect_port 80			#添加检查的目标端口connect_timeout 3		#添加连接超时(秒)nb_get_retry 3			#添加重试次数delay_before_retry 3	#添加重试间隔}}real_server 192.168.136.130 80 {		#添加第二个 Web节点的地址、端口weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
##删除后面多余的配置##
}systemctl start keepalived
ip addr						#查看虚拟网卡vipscp `pwd`/keepalived.conf root@192.168.136.140:`pwd`

 备DR调度器需要修改的参数配置 :

! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_02
}vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.136.200}
}virtual_server 192.168.136.200 80 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 0protocol TCPreal_server 192.168.136.120 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}real_server 192.168.136.130 80 {weight 1TCP_CHECK {connect_port 80connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}

3.2 启动 ipvsadm 服务

主DR调度器:192.168.136.100
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadmipvsadm -ln

备DR调度器:192.168.136.140 
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadmipvsadm -ln

 3.3 调整 proc 响应参数,关闭Linux 内核的重定向参数响应 (主备均配置)

vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0sysctl -p

3.4 配置节点服务器 

设置回环虚拟网卡(VIP),添加静态路由  

route add -host 192.168.136.200 dev lo:0
route add -host 192.168.136.200 dev lo:0

 

设置内核参数: 

3.5 客户机访问测试  

 把主服务器模拟杀死再测试:

四、NGINX+Keepalived高可用集群部署

主DR 服务器:192.168.136.100
备DR 服务器:192.168.136.140

nfs服务器:192.168.136.110
Web 服务器1:192.168.136.120
Web 服务器2:192.168.136.130
客户端:192.168.136.200

 4.1 主、备服务器配置

(1) 通用配置
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabledyum -y install nginx keepalived
 (2) 配置keepalived主备设置
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_NGINX01
}vrrp_script check_nginx {script "/etc/keepalived/check_nginx.sh"interval 2wegiht 2
}vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.136.200}track_script {check_nginx}
}

  (3) 配置nginx主备设置
user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}stream {upstream cxk {server 192.168.136.120:80 weight=1 max_fails=2 fail_timeout=30s;server 192.168.136.130:80 weight=1 max_fails=2 fail_timeout=30s;
}
server {listen 9527;proxy_pass cxk;}
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;#tcp_nopush     on;keepalive_timeout  65;#gzip  on;include /etc/nginx/conf.d/*.conf;
}

(4)主备准备检测nginx存活脚本

4.2  部署共享服务

  95  systemctl stop firewalld.service96  systemctl disable firewalld.service97  setenforce 098  yum install nfs-utils rpcbind -y99  systemctl start rpcbind.service100  systemctl start nfs.service101  systemctl enable nfs.service102  systemctl enable rpcbind.service103  mkdir -p /var/www/html/{cxk,xhz}104  cd /var/www/html/105  ls106  echo 'this is cxk_web01!' >cxk/test.html107  echo 'this is xhz_web02!' >xhz/test.html108  cat cxk/test.html 109  cat xhz/test.html 110  vim /etc/exports111  systemctl enable --now rpcbind nfs112  showmount -e113  systemctl stop firewalld114  setenforce 0115  showmount -e116  systemctl enable --now rpcbind nfs117  showmount -e118  vim /etc/exports119  systemctl status rpcbind.service 120  systemctl status nfs121  showmount -e122  exportfs -a123  showmount -e

 4.3 配置节点服务器(192.168.136.120 192.168.136.130) 

两台web节点服务器相同的操作:

   77  systemctl restart network.service78  systemctl disable --now firewalld79  setenforce 080  showmount -e 192.168.136.11081  cd /etc/yum.repos.d/82  ls83  mkdir bak84  mv *.repo bak85  rz -E86  ls87  yum -y install nginx88  vim /etc/fstab 89  mount -a90  df -h91  ls92  ls /usr/share/nginx/html/93  cat te94  ls /usr/share/nginx/html/95  cat /usr/share/nginx/html/test.html 96  vim /etc/nginx/nginx.conf 97  systemctl restart nginx98  vim /etc/sysconfig/network-scripts/ifcfg-ens3399  systemctl restart network nginx

 

 web2节点服务器的后续操作:

 

 4.4 测试

当主存活时:

 

 当主"死了":

 

 五、keepalived问题

问题1:Keepalived通过什么判断哪台主机为主服务器,通过什么方式配置浮动IP? 

        Keepalived首先做初始化先检查state状态,master为主服务器,backup为备服务器。
然后再对比所有服务器的priority,谁的优先级高谁是最终的主服务器。
优先级高的服务器会通过ip命令为自己的电脑配置一个提前定义好的浮动IP地址。 
 

问题2:keepalived的抢占与非抢占模式的区别,并且怎样设置  

        抢占模式即MASTER从故障中恢复后,会将VIP从BACKUP节点中抢占过来。非抢占模式即MASTER恢复后不抢占BACKUP升级为MASTER后的VIP
非抢占式俩节点state必须为bakcup,且必须配置nopreempt。
注意:这样配置后,我们要注意启动服务的顺序,优先启动的获取master权限,与优先级没有关系了。 
 

相关文章:

  • Ubuntu 常用命令之 tar 命令用法介绍
  • 视频推拉流EasyDSS互联网直播/点播平台构建户外无人机航拍直播解决方案
  • 多维时序 | MATLAB实现KOA-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测
  • 使用极狐gitlab初始化导入本地项目
  • 计算机网络第二章课后习题2-16解析
  • 基于查表法的水流量算法设计与实现
  • Jenkins的文档翻译
  • 【Linux】权限篇(一)
  • uniapp H5项目使用ucharts的Echart组件方式创建圆环
  • 刷题记录第五十一天-去除重复字母
  • 【STL】C++ string基本使用
  • 前端技术的新趋势:React、Vue与Angular的比较
  • 2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • 如何在Linux中查看正在运行的进程以及过滤特定端口和进程名称
  • css系列之关于字体的事
  • extjs4学习之配置
  • gulp 教程
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java到底能干嘛?
  • node入门
  • storm drpc实例
  • underscore源码剖析之整体架构
  • 技术发展面试
  • 讲清楚之javascript作用域
  • 京东美团研发面经
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 前嗅ForeSpider采集配置界面介绍
  • 驱动程序原理
  • 深入浏览器事件循环的本质
  • 手写一个CommonJS打包工具(一)
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • 字符串匹配基础上
  • 带你开发类似Pokemon Go的AR游戏
  • # include “ “ 和 # include < >两者的区别
  • (4)STL算法之比较
  • (pytorch进阶之路)扩散概率模型
  • (vue)页面文件上传获取:action地址
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Core 中的路径问题
  • .NET面试题(二)
  • //解决validator验证插件多个name相同只验证第一的问题
  • @Pointcut 使用
  • [2016.7 day.5] T2
  • [Angular] 笔记 20:NgContent
  • [AutoSar]BSW_Com07 CAN报文接收流程的函数调用
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C++]AVL树怎么转
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [CF494C]Helping People
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [ERROR]-Error: failure: repodata/filelists.xml.gz from addons: [Errno 256] No more mirrors to try.