第一章 keepalived

1.1 keepalived 服务说明

Keepalived软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件。

  Keepalived软件主要是通过VRRP协议实现高可用功能的。VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。

1.2 keepalived 服务三个重要功能

  管理LVS负载均衡软件

  实现LVS集群节点的健康检查中

作为系统网络服务的高可用性(failover)

* 在本次测试环境中通过keepalived 的网络高可用功能实现负载均衡集群

1.3 Keepalived  的工作原理

Keepalived的工作原理:

  Keepalived高可用对之间是通过VRRP通信的,因此,我们从 VRRP开始了解起:

    1) VRRP,全称 Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。

    2) VRRP是通过一种竟选协议机制来将路由任务交给某台 VRRP路由器的。

    3) VRRP用 IP多播的方式(默认多播地址(224.0_0.18))实现高可用对之间通信。

    4) 工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的开源。备节点可以有多个,通过优先级竞选,但一般 Keepalived系统运维工作中都是一对。

    5) VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。

  介绍完 VRRP,接下来我再介绍一下 Keepalived服务的工作原理:

  Keepalived高可用对之间是通过 VRRP进行通信的, VRRP是遑过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。

  在 Keepalived服务对之间,只有作为主的服务器会一直发送 VRRP广播包,告诉备它还活着,此时备不会枪占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性.接管速度最快可以小于1秒。

第二章 Nginx

2.1  nginx  服务说明

  Nginx是一款自由的、开源的、高性能的HTTP服务器和反向代理服务器;同时也是一个IMAP、POP3、SMTP代理服务器;Nginx可以作为一个HTTP服务器进行网站的发布处理,另外nginx可以作为反向代理进行负载均衡的实现。 在本次测试中使用upstream 和proxy_pass 实现反向代理和负载均衡。

第三章 功能测试

3.1 测试环境

安装编译工具及库文件:

# yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

gcc:安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境。

zlib:zlib 库提供了很多种压缩和解压缩的方式,nginx 使用 zlib 对 http 包的内容进行 gzip。

openssl:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx 不仅支持http 协议,还支持 https(即在 ssl 协议上传输 http),所以需要在 linux 安装 openssl 库。

系统版本

# cat /etc/centos-release

CentOS Linux release 7.5.1804 (Core)

内核版本

# uname -a

Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

Keepalived 版本

# keepalived -v

Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2

Nginx 版本

#./nginx -v

nginx version: nginx/1.14.1

部署环境

ESXI  5.5

3.2 部署架构

3.3  配置说明

三台设备接口地址和虚拟服务对应地址如下:

server_1 :

接口地址: 10.2.61.21

虚拟服务地址: 10.2.61.24

server_2:

接口地址:10.2.61.22

虚拟服务地址:10.2.61.25

server_3:

接口地址:10.2.61.23

虚拟服务地址: 10.2.61.26

3.3.1 server_1 配置

Keepalived 配置文件:

! 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 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

#vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

router_id lb01

}

vrrp_script nginx_check {   # nginx 服务监测脚本

script "/usr/local/nginx/conf/nginx_check.sh"

interval 4 #脚本执行间隔时间

weight   -25 #脚本触发消减的权重值

#   timeout  3

}

vrrp_instance VI_1 { #集群1

state MASTER #当前设备为主机

interface ens192

virtual_router_id 21 #路由标识符

priority 100 #优先级100

preempt_delay 300   #抢占式模式下,节点上线后触发新选举操作的延迟时长;

  advert_int 1

authentication {

auth_type PASS

auth_pass 1322 #明文认证密码

}

virtual_ipaddress { #集群绑定的虚拟服务地址

10.2.61.24

}

track_script { #绑定的执行脚本

nginx_check

}

}

vrrp_instance VI_2 { #集群2

state BACKUP #当前主机为备机

interface ens192

virtual_router_id 22 #同步组2 标识符

priority 80 #当前主机在集群中的优先级

advert_int 1

authentication {

auth_type PASS

auth_pass 1322 #明文认证密码

}

virtual_ipaddress { #集群绑定虚拟服务地址

10.2.61.25

}

}

vrrp_instance VI_3 { #集群3

state BACKUP #当前主机在集群中为备机

interface ens192

virtual_router_id 23 #集群标识符

priority 60 #当前主机在集群中优先级

advert_int 1

authentication {

auth_type PASS

auth_pass 1322 #明文认证密码

}

virtual_ipaddress { #集群绑定虚拟服务地址

10.2.61.26

}

}

Nginx 服务配置文件:

#user  nobody;

worker_processes  1;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

worker_connections  1024;

}

http {

include       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  logs/access.log  main;

sendfile        on;

#tcp_nopush     on;

#keepalive_timeout  0;

keepalive_timeout  65;

#gzip  on;

upstream lb_hb { #定义负载均衡池

server 202.110.184.34:80  ;

server 111.161.3.158:80   backup;

server 202.120.127.248:80 backup;

}

upstream lb_nx { #定义负载均衡池

server 10.2.61.28:80;

}

upstream lb_jx { #定义负载均衡池

server 10.2.61.28:8088;

}

server { #定义虚拟服务,通过proxy_pass 模块绑定负载均衡池

listen      8088;

server_name www.hb.sgcc.com.cn;

location / {

proxy_pass http://lb_hb;

proxy_set_header Host       $proxy_host;

}

}

server { #定义虚拟服务,通过proxy_pass 模块绑定负载均衡池

listen     8088;

server_name   www.nx.sgcc.com.cn;

location / {

proxy_pass http://lb_nx;

proxy_set_header Host $proxy_host;

}

}

server { #定义虚拟服务,通过proxy_pass 模块绑定负载均衡池

listen     8088;

server_name   www.jx.sgcc.com.cn;

location / {

proxy_pass http://lb_jx;

proxy_set_header Host $proxy_host;

}

}

}

3.3.2 server_2 配置

Keepalived 服务配置文件:

! 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 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

#   vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

router_id lb02

}

vrrp_script nginx_check {

script "/usr/local/nginx/conf/nginx_check.sh"

interval 4

weight   -25

#timeout  3

}

vrrp_instance VI_1 {

state BACKUP

interface ens192

virtual_router_id 21

priority 60

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.24

}

}

vrrp_instance VI_2 {

state MASTER

interface ens192

virtual_router_id 22

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.25

}

track_script {

nginx_check

}

}

vrrp_instance VI_3 {

state BACKUP

interface ens192

virtual_router_id 23

priority 80

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.26

}

}

Nginx 服务配置文件:

#user  nobody;

worker_processes  1;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

worker_connections  1024;

}

http {

include       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  logs/access.log  main;

sendfile        on;

#tcp_nopush     on;

#keepalive_timeout  0;

keepalive_timeout  65;

#gzip  on;

upstream lb_hb {

server 202.110.184.34:80  ;

server 111.161.3.158:80   backup;

server 202.120.127.248:80 backup;

}

upstream lb_nx {

server 10.2.61.28:80;

}

upstream lb_jx {

server 10.2.61.28:8088;

}

server {

listen      8088;

server_name www.hb.sgcc.com.cn;

location / {

proxy_pass http://lb_hb;

proxy_set_header Host       $proxy_host;

}

}

server {

listen     8088;

server_name   www.nx.sgcc.com.cn;

location / {

proxy_pass http://lb_nx;

proxy_set_header Host $proxy_host;

}

}

server {

listen    8088;

server_name   www.jx12.sgcc.com.cn;

location / {

proxy_pass http://lb_jx;

proxy_set_header Host $proxy_host;

}

}

}

3.3.3 server_3 配置

Keepalived 配置文件:

! 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 192.168.200.1

smtp_connect_timeout 30

router_id LVS_DEVEL

vrrp_skip_check_adv_addr

#   vrrp_strict

vrrp_garp_interval 0

vrrp_gna_interval 0

router_id lb02

}

vrrp_script nginx_check {

script "/usr/local/nginx/conf/nginx_check.sh"

interval 4

weight   -25

#timeout  3

}

vrrp_instance VI_1 {

state BACKUP

interface ens192

virtual_router_id 21

priority 60

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.24

}

}

vrrp_instance VI_2 {

state MASTER

interface ens192

virtual_router_id 22

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.25

}

track_script {

nginx_check

}

}

vrrp_instance VI_3 {

state BACKUP

interface ens192

virtual_router_id 23

priority 80

advert_int 1

authentication {

auth_type PASS

auth_pass 1322

}

virtual_ipaddress {

10.2.61.26

}

}

Nginx 配置文件:

#user  nobody;

worker_processes  1;

#error_log  logs/error.log;

#error_log  logs/error.log  notice;

#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {

worker_connections  1024;

}

http {

include       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  logs/access.log  main;

sendfile        on;

#tcp_nopush     on;

#keepalive_timeout  0;

keepalive_timeout  65;

#gzip  on;

upstream lb_hb {

server 202.110.184.34:80  ;

server 111.161.3.158:80   backup;

server 202.120.127.248:80 backup;

}

upstream lb_nx {

server 10.2.61.28:80;

}

upstream lb_jx {

server 10.2.61.28:8088;

}

server {

listen      8088;

server_name www.hb.sgcc.com.cn;

location / {

proxy_pass http://lb_hb;

proxy_set_header Host       $proxy_host;

}

}

server {

listen     8088;

server_name   www.nx.sgcc.com.cn;

location / {

proxy_pass http://lb_nx;

proxy_set_header Host $proxy_host;

}

}

server {

listen    8088;

server_name   www.jx12.sgcc.com.cn;

location / {

proxy_pass http://lb_jx;

proxy_set_header Host $proxy_host;

}

}

}

nginx 服务监测脚本:


#!/bin/bash

# keepalived script check nginx services status

#while true

#do

nginx_session=$(netstat -ntlp|grep nginx |wc -l)
echo "$nginx_session"
if [ $nginx_session -lt 1 ]
then

/usr/bin/systemctl stop keepalived

# exit
fi

#sleep 3

#done


3.4 模拟Server_1 故障设备故障测试:

Server_1 log :

Dec 11 10:45:15 localhost systemd-logind: Removed session 4.

Dec 11 10:45:16 localhost Keepalived[19875]: Stopping

Dec 11 10:45:16 localhost systemd: Stopping LVS and VRRP High Availability Monitor...

Dec 11 10:45:16 localhost Keepalived_vrrp[19877]: VRRP_Instance(VI_1) sent 0 priority

Dec 11 10:45:16 localhost Keepalived_vrrp[19877]: VRRP_Instance(VI_1) removing protocol VIPs.

Dec 11 10:45:16 localhost Keepalived_healthcheckers[19876]: Stopped

Dec 11 10:45:17 localhost Keepalived_vrrp[19877]: Stopped

Dec 11 10:45:17 localhost Keepalived[19875]: Stopped Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2

Dec 11 10:45:17 localhost systemd: Stopped LVS and VRRP High Availability Monitor.

Server_3 log : server_3 集群1 优先级 80 在server_1 故障时承载业务

Dec 11 10:45:17 localhost Keepalived_vrrp[11307]: VRRP_Instance(VI_1) Transition to MASTER STATE

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: VRRP_Instance(VI_1) Entering MASTER STATE

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: VRRP_Instance(VI_1) setting protocol VIPs.

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens192 for 10.2.61.24

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:18 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

Dec 11 10:45:23 localhost Keepalived_vrrp[11307]: Sending gratuitous ARP on ens192 for 10.2.61.24

数据包分析:

Server_3作为集群3 主负载节点发送组播数据包

Server_3作为集群1 备份负载节点发送组播数据包

第四章 总结:

  本次测试主要为了验证keepalived+ nginx 模式下构建 主 + 主 + 主 业务集群。三个集群按照优先级顺序分别为指定的三个业务的master 设备和backup 设备。在测试中有几个点。

  1.keepalived 配置分别在三台设备事先规划的master 设备上配置nginx_check.sh 脚本 # 注意不要在一个里面都进行配置,keepalived 会加载所有配置导致优先级混乱。

  2.在本次配置中没有配置   nopreempt ,在主备模式下配置抢占 。本次测试为延时抢占

  3.track_script { #绑定的执行脚     nginx_check }   必须给定执行脚本,否则   vrrp_script nginx_check  给定脚本不执行。

  4.nginx 配置配置中 定义 server 时只定义 listen 端口与 server_name   不指定监听地址,因为nginx 加载配置文件时会监测当前网卡是否监测此地址

  

  本次测试主要验证 keepalived + nginx 的主 + 主 + 主模式,后续会分别对模块进行梳理。

keepalived + nginx 搭建负载均衡集群的更多相关文章

  1. Nginx搭建负载均衡集群

    (1).实验环境 youxi1 192.168.5.101 负载均衡器 youxi2 192.168.5.102 主机1 youxi3 192.168.5.103 主机2 (2).Nginx负载均衡策 ...

  2. lvs+keepalived+nginx高性能负载均衡集群

    项目发布时候,别人还能访问呢? 双机主从热备 LVS作用 LVS是一个开源的软件,可以实现传输层四层负载均衡.LVS是Linux Virtual Server的缩写,意思是Linux虚拟服务器.目前有 ...

  3. 测试LVS+Keepalived高可用负载均衡集群

    测试LVS+Keepalived高可用负载均衡集群 1. 启动LVS高可用集群服务 此时查看Keepalived服务的系统日志信息如下: [root@localhost ~]# tail -f /va ...

  4. windows配置nginx实现负载均衡集群

    windows配置nginx实现负载均衡集群2014-08-20 09:44:40   来源:www.abcde.cn   评论:0 点击:617 网上大部分关于nginx负载均衡集群的教程都是lin ...

  5. windows配置nginx实现负载均衡集群 -请求分流

    windows配置nginx实现负载均衡集群 一.windows上安装nginx 1.下载nginx的windows版本http://nginx.org/en/download.html 2.把压缩文 ...

  6. nginx集群:nginx配置负载均衡集群(nginx1.18.0)

    一,nginx的负载均衡集群的特点: 1,nginx集群和lvs的不同? lvs集群:工作在第4层(传输层) nginx集群:工作在第7层(应用层) lvs集群:性能更强 nginx集群:功能更强:可 ...

  7. Redhat/CentOS7-环境虚拟机简单搭建Nginx+Tomcat负载均衡集群

    Tomcat服务器是一个免费的开放源代码的web应用服务器,属于轻量级应用服务器,是开发和调试JSP程序的首选.由于Tomcat处理静态HTML的能力运不及Apache或者Nginx,所以Tomcat ...

  8. 配置LVS + Keepalived高可用负载均衡集群之图文教程

    负载均衡系统可以选用LVS方案,而为避免Director Server单点故障引起系统崩溃,我们可以选用LVS+Keepalived组合保证高可用性.  重点:每个节点时间都同步哈! C++代码 [r ...

  9. LVS+Keepalived高可用负载均衡集群架构实验-01

    一.为什么要使用负载均衡技术? 1.系统高可用性 2.  系统可扩展性 3.  负载均衡能力 LVS+keepalived能很好的实现以上的要求,LVS提供负载均衡,keepalived提供健康检查, ...

随机推荐

  1. flex布局应用与踩坑

    一.预告 本文不是一篇入门的文章所有请符合以下条件的战斗人员绕道: 1.初学前端,对前端的传统布局还不是很熟悉的人 2.后端人员对前端不打算深入学习的同学 二.开篇 flex布局原本是好几个月前就一直 ...

  2. Linux网络设备驱动 _驱动模型

    Linux素来以其强大的网络功能著名,同时, 网络设备也作为三大设备之一, 成为Linux驱动学习中必不可少的设备类型, 此外, 由于历史原因, Linux并没有强制对网络设备贯彻其"一切皆 ...

  3. JVM监控和调优常用命令工具总结

    JVM监控和调优 在Java应用和服务出现莫名的卡顿.CPU飙升等问题时总是要分析一下对应进程的JVM状态以定位问题和解决问题并作出相应的优化,在这过程中Java自带的一些状态监控命令和图形化工具就非 ...

  4. Linux系统挂载windows共享目录报错mount error(121):remote error I/O error

    经查,这是由于NFS(Network File System)即网络文件系统服务器有多个版本,V2.V3.V4.而且各版本同时运行,因此挂载时需要说明版本号 mount -o username='pk ...

  5. MSF实现RID劫持和MSF实现PsExec执行命令

    msf实现rid劫持 rid劫持原理: 每个帐户都有一个指定的RID来标识它.与域控制器不同,Windows工作站和服务器会将大部分数据存储在HKLM\SAM\SAM\Domains\Account\ ...

  6. springboot源码解读01

    package org.springframework.web; @javax.servlet.annotation.HandlesTypes({org.springframework.web.Web ...

  7. poj 3304

    我老人家要开始玩几何了! .这个题有点自闭. 就是问是否存在一条直线经过所有了n条线段,(有交点). 我老人家愚昧不可救药,想了想决定先求出来 这两条直线的交点,然后看是否在线段上.但是一直写不对.. ...

  8. VS2013 Ctrl+Shift+F 没反应

    快捷键设定与搜狗输入法中文繁体切换冲突,搜狗输入法管理设置中关掉就好.

  9. CTextUI 文本控件 显示数字方法

    得将数字变成字符串才行 m_ptxtCurrentcharUI->SetText(util::int32ToCString(txtLength)); 或 String.valueOf(x) 或 ...

  10. linux命令sync,shutdown

    1.数据同步写入磁盘: sync 输入sync,那举在内存中尚未被更新的数据,就会被写入硬盘中 hling@hling:~$ sync   2.惯用的关机指令:shutdown 实例: