[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主备设置

bash 复制代码
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_02
	router_id LVS_01
--14行--注释掉,取消严格遵守VRRP协议功能,否则VIP无法被连接
	#vrrp_strict
}
 
vrrp_instance VI_1 {				#定义VRRP热备实例参数
--20行--修改,指定热备状态,主为MASTER,备为BACKUP
    state MASTER
--21行--修改,指定承载vip地址的物理接口
    interface ens33
--22行--修改,指定虚拟路由器的ID号,每个热备组保持一致	
    virtual_router_id 10
	#nopreempt		#如果设置非抢占模式,两个节点state必须为BACKUP,并加上配置 nopreempt
--23行--修改,指定优先级,数值越大优先级越高,这里设置主为100,备为90
    priority 100
    advert_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 DR
    persistence_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 1
        TCP_CHECK {
			connect_port 80
			connect_timeout 3
			nb_get_retry 3
			delay_before_retry 3
		}
	}
##删除后面多余的配置##
}
 
 
systemctl start keepalived
ip addr						#查看虚拟网卡vip




scp `pwd`/keepalived.conf root@192.168.136.140:`pwd`

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

bash 复制代码
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_02
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens33
    virtual_router_id 51
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.136.200
    }
}

virtual_server 192.168.136.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 0
    protocol TCP

    real_server 192.168.136.120 80 {
        weight 1
        TCP_CHECK {
        connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.136.130 80 {
        weight 1
        TCP_CHECK {
        connect_port 80
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

3.2 启动 ipvsadm 服务

主DR调度器:192.168.136.100
bash 复制代码
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
 
ipvsadm -ln
备DR调度器:192.168.136.140
bash 复制代码
ipvsadm-save > /etc/sysconfig/ipvsadm
systemctl start ipvsadm
 
ipvsadm -ln

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

bash 复制代码
vim /etc/sysctl.conf
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
 
sysctl -p

3.4 配置节点服务器

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

bash 复制代码
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) 通用配置
bash 复制代码
systemctl disable --now firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=disabled
 
 
yum -y install nginx keepalived
(2) 配置keepalived主备设置
bash 复制代码
! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_NGINX01
}

vrrp_script check_nginx {
          script "/etc/keepalived/check_nginx.sh"
          interval 2
          wegiht 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.136.200
    }
    track_script {
    check_nginx
   }
}
(3) 配置nginx主备设置
bash 复制代码
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 部署共享服务

bash 复制代码
  95  systemctl stop firewalld.service
  96  systemctl disable firewalld.service
  97  setenforce 0
  98  yum install nfs-utils rpcbind -y
  99  systemctl start rpcbind.service
  100  systemctl start nfs.service
  101  systemctl enable nfs.service
  102  systemctl enable rpcbind.service
  103  mkdir -p /var/www/html/{cxk,xhz}
  104  cd /var/www/html/
  105  ls
  106  echo 'this is cxk_web01!' >cxk/test.html
  107  echo 'this is xhz_web02!' >xhz/test.html
  108  cat cxk/test.html 
  109  cat xhz/test.html 
  110  vim /etc/exports
  111  systemctl enable --now rpcbind nfs
  112  showmount -e
  113  systemctl stop firewalld
  114  setenforce 0
  115  showmount -e
  116  systemctl enable --now rpcbind nfs
  117  showmount -e
  118  vim /etc/exports
  119  systemctl status rpcbind.service 
  120  systemctl status nfs
  121  showmount -e
  122  exportfs -a
  123  showmount -e

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

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

bash 复制代码
   77  systemctl restart network.service
   78  systemctl disable --now firewalld
   79  setenforce 0
   80  showmount -e 192.168.136.110
   81  cd /etc/yum.repos.d/
   82  ls
   83  mkdir bak
   84  mv *.repo bak
   85  rz -E
   86  ls
   87  yum -y install nginx
   88  vim /etc/fstab 
   89  mount -a
   90  df -h
   91  ls
   92  ls /usr/share/nginx/html/
   93  cat te
   94  ls /usr/share/nginx/html/
   95  cat /usr/share/nginx/html/test.html 
   96  vim /etc/nginx/nginx.conf 
   97  systemctl restart nginx
   98  vim /etc/sysconfig/network-scripts/ifcfg-ens33
   99  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权限,与优先级没有关系了。

相关推荐
单音GG23 分钟前
推荐一个基于协程的C++(lua)游戏服务器
服务器·c++·游戏·lua
shitian08111 小时前
用轻量云服务器搭建一个开源的商城系统,含小程序和pc端
服务器·小程序·开源
Biomamba生信基地1 小时前
Linux也有百度云喔~
linux·运维·服务器·百度云
米饭是菜qy1 小时前
TCP 三次握手意义及为什么是三次握手
服务器·网络·tcp/ip
yaoxin5211231 小时前
第十九章 TCP 客户端 服务器通信 - 数据包模式
服务器·网络·tcp/ip
new_abc2 小时前
Ubuntu 22.04 ftp搭建
linux·运维·ubuntu
flying robot2 小时前
RPM的使用
linux
鹿鸣天涯2 小时前
‌华为交换机在Spine-Leaf架构中的使用场景
运维·服务器·网络
星海幻影2 小时前
网络基础-超文本协议与内外网划分(超长版)
服务器·网络·安全