当前位置: 首页 > 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权限,与优先级没有关系了。 
 

http://www.lryc.cn/news/264110.html

相关文章:

  • 【版本管理】git stash用法
  • 声明式的理解【gpt】
  • 提高Spring Boot技能的9种方法
  • HIVE基本操作
  • 【经典LeetCode算法题目专栏分类】【第5期】贪心算法:分发饼干、跳跃游戏、模拟行走机器人
  • 【大数据面试】MapReduce常见问题与答案
  • 数组深入学习感悟
  • 亚马逊云科技-如何缩容/减小您的AWS EC2根卷大小-简明教程
  • [Java 基础] Java Stream
  • 达芬奇18.6DaVinci ResolveStudio(Win/Mac)激活版
  • 力扣题目学习笔记(OC + Swift)16. 最接近的三数之和
  • 基于STM32的DHT11温湿度传感器与LCD显示器的集成设计
  • 解决浏览器自动将http跳转至https导致无法访问的问题
  • 小程序面试题 | 07.精选小程序面试题
  • 深度学习的推理部分
  • 如何用 CleanMyMac 来保护 Mac 隐私
  • opencv入门到精通——鼠标事件和Trackbar控件的使用
  • iOS 收集 SDK 内部 log
  • 【CSS @property】CSS自定义属性说明与demo
  • 【华为数据之道学习笔记】6-3数据服务分类与建设规范
  • Vue的脚手架
  • Java实现Word中插入上标和下标
  • Java和Python中的目标堆栈规划实现
  • (前端)后管系统登录后隐藏url上信息同时获取url上携带参数~开发需求(bug)总结7
  • CSS3新增样式
  • HP服务器idrac设置以及系统安装
  • rpc和消息队列区别
  • Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
  • 虚幻学习笔记18—C++委托(多播)和事件
  • 【UML】第9篇 类图