##LVS+KeepAlived+Nginx高可用部署

##准备了4台虚拟机,用于测试


 IP                              作用
192.168.100.20       keepalived master
192.168.100.21       keepalived backup
192.168.100.30       nginx1
192.168.100.31       nginx2
192.168.100.200      虚拟ip VIP

##关闭selinux:

sed -ri '/^[^#]*SELINUX=/s#=.+$#=disabled#' /etc/selinux/config 或者

vim /etc/sysconfig/selinux
SELINUX=enforcing 改为 SELINUX=disabled

##关闭防火墙:
systemctl disable firewalld.service

##重启使生效:
shutdown -r now

 ##软件安装

在192.168.100.20及192.168.100.21上安装keepalived
在192.168.100.30及192.168.100.31上安装nginx

##安装依赖包(4个机器都需要安装)

[root@localhost ~]# yum install -y gcc   openssl-devel   libnl libnl-devel  libnfnetlink-devel  net-tools  vim wget  lrzsz xz make

第一种编译安装keepalived方式

##keepalived-2.0.10.tar.gz下载 

此为keepalived下载地址https://www.keepalived.org/index.html

 将下载的2.0.10的版本拷贝至/use/local/src下 解压安装

[root@localhost ~]# cd /usr/local/src
[root@localhost src]# rz -E   ##上传keepalived-2.0.10.tar.gz
rz waiting to receive.
[root@localhost ~]# ls
keepalived-2.0.10.tar.gz
[root@localhost src]#  tar -zxvf keepalived-2.0.10.tar.gz
keepalived-2.0.10/
....
....
....
[root@localhost src]# mv keepalived-2.0.10 ../keepalived
[root@localhost src]# cd /usr/local/keepalived/
[root@localhost keepalived]# ./configure 

checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
....
....
....
[root@localhost keepalived]# make && make install

Making all in lib
make[1]: 进入目录“/usr/local/keepalived/lib”
make  all-am
make[2]: 进入目录“/usr/local/keepalived/lib”
  CC       memory.o

  CC       utils.o
....
....
....
[root@localhost keepalived]# 

##keepalived配置
将keepalived配置文件拷贝到etc/keepalived下

[root@localhost keepalived]# mkdir /etc/keepalived
[root@localhost keepalived]# cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
[root@localhost keepalived]# 

##开机启动项
把 keepalived的启动文件复制到init.d下,加入开机启动项

[root@localhost keepalived]# cp /usr/local/keepalived/keepalived/etc/init.d/keepalived  /etc/rc.d/init.d/

把keepalived加入系统命令目录

[root@localhost keepalived]# cp /usr/local/sbin/keepalived /usr/sbin/

启动keepalived命令

root@localhost keepalived]# /etc/init.d/keepalived start
Starting keepalived (via systemctl):                       [  确定  ]
[root@localhost keepalived]# 
[root@localhost keepalived]# /etc/init.d/keepalived restart
Restarting keepalived (via systemctl):                     [  确定  ]
[root@localhost keepalived]# 

第二种yum源安装keepalived方式

添加阿里源,安装keepalived包

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum install -y keepalived.x86_64 
[root@localhost ~]# rpm -ql keepalived
/etc/keepalived
/etc/keepalived/keepalived.conf     ##主配置文件

配置keepalived

##配置MASTER服务器

cd /etc/keepalived   #备份默认的keepalived配置

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# ls
keepalived.conf
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak

配置MASTER

[root@localhost keepalived]# vim keepalived.conf
global_defs {
   notification_email {
         edisonchou@hotmail.com
   }
   notification_email_from sns-lvs@gmail.com
   smtp_server 192.168.80.1
   smtp_connection_timeout 30
   router_id LVS_DEVEL           # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER                 #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface ens160             #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51          #虚拟路由编号,主备要一致
    priority 100                  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1                  #检查间隔,默认为1s
    authentication {               #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.200            #定义虚拟IP(VIP)为192.168.100.200,可多设,每行一个
    }
}

定义对外提供服务的LVS的VIP以及**`port`**

virtual_server 192.168.100.200 80 {
    delay_loop 6             # 设置健康检查时间,单位是秒
    lb_algo rr               # 设置负载调度的算法为wlc
    lb_kind DR               # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP
    real_server 192.168.100.30 80 {    # 指定Nginx1的IP地址
        weight 3                       # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
    real_server 192.168.100.31 80 {     # 指定Nginx2的IP地址
        weight 3                        # 配置节点权值,数字越大权重越高
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

配置BACKUP服务器

cd /etc/keepalived  ##备份默认的keepalived配置

[root@localhost ~]# cd /etc/keepalived/
[root@localhost keepalived]# cp keepalived.conf keepalived.conf.bak

配置BACKUP

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
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens160
    virtual_router_id 51
    priority 100
    advert_int 1
  authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.100.200
    }
}

virtual_server 192.168.100.200 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 0
    protocol TCP

real_server 192.168.100.30 80 {
        weight 3
        weight 3
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
    }
 real_server 192.168.100.31 80 {
        weight 3
        TCP_CHECK {
        connect_timeout 10
        nb_get_retry 3
        delay_before_retry 3
        connect_port 80
        }
     }
}

启动keepalived服务

systemctl start keepalived.service 
systemctl restart keepalived.service 

第一种安装keepalived服务方式启动

/etc/init.d/keepalived start
/etc/init.d/keepalived restart

##nginx安装(第一种编译安装Nginx)
在192.168.100.30及192.168.100.31上安装nginx

##下载依赖文件压缩包

[root@localhost ~]# cd /usr/local/src/
[root@localhost src]#wget http://nginx.org/download/nginx-1.12.1.tar.gz

##解压资源
[root@localhost src]#tar -xf nginx-1.12.1.tar.gz

##设置权限
[root@localhost src]#t chown -R root:root ./

##编译安装

[root@localhost src]# cd /usr/local/src/nginx-1.12.1/
[root@localhost nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module 
checking for OS
 + Linux 3.10.0-693.el7.x86_64 x86_64
....
....
....
  nginx http client request body temporary files: "client_body_temp"
  nginx http proxy temporary files: "proxy_temp"
  nginx http fastcgi temporary files: "fastcgi_temp"
  nginx http uwsgi temporary files: "uwsgi_temp"
  nginx http scgi temporary files: "scgi_temp"
[root@localhost nginx-1.12.1]# make && make install
make -f objs/Makefile
make[1]: 进入目录“/usr/local/src/nginx-1.12.1”
cc -c -pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -Werror -g  -I src/core -I src/event -I src/event/modules -I src/os/unix -I objs \
	-o objs/src/core/nginx.o \
	src/core/nginx.c
....
....
....
make[1]: 离开目录“/usr/local/src/nginx-1.12.1”
[root@localhost nginx-1.12.1]# 

查看版本  检查正确性

[root@localhost nginx-1.12.1]# cd /usr/local/nginx/
[root@localhost nginx]# sbin/nginx -v
nginx version: nginx/1.12.1
[root@localhost nginx]# sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
##设置开机自启动
chkconfig nginx on

启动nginx服务
确保nginx已经正常运行了
[root@localhost /]# ps -ef|grep nginx
root      1552     1  0 15:27 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     1553  1552  0 15:27 ?        00:00:00 nginx: worker process
nginx     1554  1552  0 15:27 ?        00:00:00 nginx: worker process
root     11642  1258  0 16:55 pts/0    00:00:00 grep --color=auto nginx

第二种yum源安装Nginx

yum install nginx -y

启动Nginx服务

systemctl start nginx
systemctl restart nginx
systemctl stop nginx

##编辑realserver脚本文件两台机器都要搞  (Nginx服务器下)

进入init文件夹cd /etc/init.d/

##编辑脚本

[root@localhost init.d]# vim /etc/init.d/realserver
SNS_VIP=192.168.100.200
/etc/rc.d/init.d/functions
case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac
exit 0

[root@localhost init.d]# 

##保存并设置脚本的执行权限  

[root@localhost init.d]# chmod 755 /etc/init.d/realserver
[root@localhost init.d]# chmod 755 /etc/rc.d/init.d/functions
[root@localhost init.d]# service realserver start     ##出现以下代表成功
/etc/rc.d/init.d/functions: 第 690 行:return: 只能从函数或者源脚本`返回'
RealServer Start OK

##查看执行结果    在Nginx服务器查看

网卡:inet 192.168.100.200/32 brd 192.168.100.200 scope global lo:0      VIP配置成功

[root@localhost init.d]# ip  addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet 192.168.100.200/32 brd 192.168.100.200 scope global lo:0
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:54:21:3b brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.30/24 brd 192.168.100.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d58a:a5b6:58b5:ac6a/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::ddfb:715a:9aa4:7292/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::f192:baab:eec0:800a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

修改Nginx网页


这个添加IP100.30 服务器
echo "Welcome to 192.168.100.30" > /usr/share/nginx/html/index.html

这个添加IP100.31 服务器
echo "Welcome to 192.168.100.31" > /usr/share/nginx/html/index.html

##ipvsadm管理虚拟服务

##安装ipvsadm   (在keepalived服务器上添加)
用于查看lvs转发及代理情况的工具
在192.168.100.20及192.168.100.21上安装

[root@localhost keepalived]#yum install ipvsadm -y
##添加一个虚拟服务192.168.100.200:80,使用轮询算法
ipvsadm -A -t 192.168.100.200:80 -s rr
##修改虚拟服务的算法为加权轮询
ipvsadm -E -t 192.168.100.200:80 -s wrr
##删除虚拟服务
ipvsadm -D -t 192.168.100.200:80
##2. 管理真实服务
添加一个真实服务器192.168.100.200,使用DR模式,权重2


[root@localhost /]# ipvsadm -A -t 192.168.100.200:80 -s rr

[root@localhost /]# ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.30 -g  -w 1

[root@localhost /]# ipvsadm -a -t 192.168.100.200:80 -r 192.168.100.31  -g  -w 1


[root@localhost keepalived]#  ipvsadm -Ln     ##主keepalived服务器
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.200:80 rr
  -> 192.168.100.30:80            Route   3      0          0         
  -> 192.168.100.31:80            Route   3      0          0         


[root@localhost /]# ipvsadm -Ln     ##备keepalived服务器
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  192.168.100.200:80 rr
  -> 192.168.100.30:80            Route   3      0          0         
  -> 192.168.100.31:80            Route   3      0          0     

检查主keepalived 启动后的配置情况(网卡下出现192.168.100.200  VIP 说明主已经启动成功)

[root@localhost keepalived]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:ef:bd:98 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.20/24 brd 192.168.100.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet 192.168.100.200/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d58a:a5b6:58b5:ac6a/64 scope link 
       valid_lft forever preferred_lft forever
    inet6 fe80::ddfb:715a:9aa4:7292/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::f192:baab:eec0:800a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

检查备keepalived 启动后的配置情况(网卡没出现192.168.100.200  VIP说明备服务器正常)

[root@localhost keepalived]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:85:8b:f4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.21/24 brd 192.168.100.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d58a:a5b6:58b5:ac6a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::ddfb:715a:9aa4:7292/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::f192:baab:eec0:800a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

##验证成功 :(在Nginx服务器上验证)

[root@localhost /]# curl  http://192.168.100.200
Welcome to 192.168.100.31
root@localhost /]# curl  http://192.168.100.200
Welcome to 192.168.100.30

测试vip监听的端口 telnet 192.168.100.200 80  (80为端口号)

请求虚拟IP查看转发的服务


 

KeepAlived高可用测试

停用主Keepalived后

[root@localhost /]# systemctl stop keepalived.service 
[root@localhost /]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:e8:f9:a4 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.20/24 brd 192.168.100.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d58a:a5b6:58b5:ac6a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::ddfb:715a:9aa4:7292/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::f192:baab:eec0:800a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever

主Keepalived会飘到备keepalived服务器上 VIP地址回出现备Keepalived的网卡上

[root@localhost keepalived]# ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
    link/ether 00:0c:29:4d:44:cd brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.21/24 brd 192.168.100.255 scope global ens160
       valid_lft forever preferred_lft forever
    inet 192.168.100.200/32 scope global ens160
       valid_lft forever preferred_lft forever
    inet6 fe80::d58a:a5b6:58b5:ac6a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::ddfb:715a:9aa4:7292/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::f192:baab:eec0:800a/64 scope link tentative dadfailed 
       valid_lft forever preferred_lft forever
[root@localhost keepalived]# 

重启主keepalived
主服务恢复之后;vip又会自动漂移回主服务

LVS+KeepAlived+Nginx高可用验证成功


版权声明:本文为qq_15290209原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。