搭建Keepalived+Nginx负载均衡及实验

搭建Keepalived+Nginx负载均衡及实验

什么是keepAlived

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。

简介

Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

工作原理

Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下: Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。 Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。 Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。 SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。 MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)

作用

主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间failover的实现。 高可用web架构: LVS+keepalived+nginx+apache+php+eaccelerator(+nfs可选 可不选)

为什么要使用

当我们的服务器意外挂了之后,我们要怎么做? 当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射,域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这会儿估计运营早就提着菜刀架在你脖子上了; 但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉之后,自动将VIP给你切换到备用机,并且以邮件的形式告诉你说主服务已经挂了,你得赶紧恢复起来;这时候你就可以慢慢的去找主服务的问题,这时候并不会影响到你的正常业务运行。
搭建Keepalived+Nginx负载均衡及实验_第1张图片

IP规划:

42.51.78.140------虚拟VIP
42.51.78.141------Nginx-1
42.51.78.142------Nginx-2
42.51.78.143------Keepalived-1
42.51.78.144------Keepalived-2

设置主机名:

42.51.78.141------hostnamectl set-hostname web01
42.51.78.142------hostnamectl set-hostname web02
42.51.78.143------hostnamectl set-hostname lb01
42.51.78.144------hostnamectl set-hostname lb02

设置个性主机名颜色:

echo "PS1='\[\e[37;1m\][\[\e[36;40m\]\[\e[32;40m\]\u\[\e[33;40m\]@\[\e[31;40m\]\h \[\e[34;40m\]\w\[\e[37;1m\]]\\$\[\e[m\]'" >>.bashrc

在各节点执行—修改DNS

cat <<EOF> /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
EOF

在各节点执行—添加阿里yum源和清理yum缓存和生成新的yum缓存

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all && yum makecache fast

在各节点执行—关闭selinux

sed -i 's/enforcing/disabled/' /etc/selinux/config && setenforce 0

在各节点执行—关闭防火墙

systemctl stop firewalld && systemctl disable firewalld 

在各节点都采用网络时间服务器 安装时间服务器软件

yum install -y chrony

修改配置文件/etc/chrony.conf

sed -i -e '/^server/d' -e '1aserver ntp.aliyun.com iburst\nserver tw.pool.ntp.org iburst' -e '/local stratum 10/clocal stratum 10\nbindcmdaddress 127.0.0.1\nbindcmdaddress ::1' /etc/chrony.conf

chronyd服务启动并自启

systemctl start chronyd && systemctl enable chronyd

检查323 udp端口的监听是否是:323*

ss -ntlup | grep 323

检查时间同步状态

chronyc sources

在42.51.78.141,42.51.78.142,42.51.78.143,42.51.78.144

机器上安装Nginx

yum install nginx -y

设置开机自启并启动

systemctl enable nginx --now

在42.51.78.141,42.51.78.142机器上修改index.html,方便访问nginx测试 在42.51.78.141机器上

echo This is Server 42.51.78.141 >/usr/share/nginx/html/index.html

在42.51.78.142机器上

echo This is Server 42.51.78.142 >/usr/share/nginx/html/index.html

官方格式:

upstream backend {
    server backend1.example.com       weight=5;
    server backend2.example.com:8080;
    server unix:/tmp/backend3;

    server backup1.example.com:8080   backup;
    server backup2.example.com:8080   backup;
}

server {
    location / {
        proxy_pass http://backend;
    }
 }
参数说明:

backend这个是一个名称,可以更改
server后边写IP默认是80端口,为了规范我们写上80端口
weight是权重,权重越大得到的请求比例就越多
下面为可用参数:

max_fails=5; 尝试连接后端主机失败的次数,最多尝试连接后端主机5次。
fail_timeout=10; 失败的超时时间,比如设置为10秒,那么就是每10秒去尝试连接一次。
max_conns=10; 限制最大连接数

在lb01和lb02机器上复制粘贴如下改好的nginx配置文件—< 负载均衡 >

vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream web_pools {
    server 42.51.78.141:80  weight=5;
    server 42.51.78.142:80  weight=5;
    #server 42.51.78.142:80  weight=5  backup;  #这个为主备,不是负载均衡
}
    server {
        listen       80;   #这是我们的web端口
        server_name  gky.myit.icu;   #这是我们的域名
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://web_pools;
        }
    }
}

重启nginx服务:

systemctl restart nginx

在lb01机器上进行访问—nginx负载均衡已经轮询

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142

以下功能测试—要修改lb01和lb02机器上的配置文件才可用于生产环境

一:如果两台Nginx主机硬件配置不一样,可以进行设置权重来进行均衡请求

我们这里测试把server 42.51.78.141:80  weight=5;的weight值改为1

重启nginx服务

systemctl restart nginx

在lb01机器上进行访问—nginx负载均衡已经有了效果

测试结论:
一个权重为5,一个权重为1,这样请求5次权重为5的机器,会请求一次权重为1的机器

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141

二:其他场景可使用ip_hash算法 说明: 当使用ip_hash算法时,不能使用backup功能,权重功能也会失效,这样的效果主要用于会话保持,单台客户端一直保持某个IP连接。

$ vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

upstream web_pools {
ip_hash;  #ip_hash算法
    server 42.51.78.141:80  weight=5;
    server 42.51.78.142:80  weight=5;
    #server 42.51.78.142:80  weight=5  backup;  #使用ip_hash算法不允许使用backup
}

    server {
        listen       80;   #这是我们的web端口
        server_name  gky.myit.icu;   #这是我们的域名
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://web_pools;
        }
    }

在lb01机器上进行访问—nginx的ip_hash算法已经有了效果

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142

三:使用backup热备功能—当主nginx关掉,会立即切换到备nginx上

vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
upstream web_pools {
    server 42.51.78.141:80  weight=5;
    server 42.51.78.142:80  weight=5  backup;  #这里是备
}
    server {
        listen       80;   #这是我们的web端口
        server_name  gky.myit.icu;   #这是我们的域名
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://web_pools;
        }
    }
}

重启nginx服务

systemctl restart nginx

在lb01机器上进行访问Nginx—发现请求都在主Nginx上

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141

在42.51.78.141机器上停止主Nginx

systemctl stop nginx

在lb01机器上再次进行访问Nginx—发现已经切换到备Nginx上

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.142

在42.51.78.141机器上启动主Nginx

systemctl start nginx

在lb01机器上再次进行访问Nginx—发现已经切换到主Nginx上

[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141
[root@lb01 ~]#curl 42.51.78.143
This is Server 42.51.78.141

在42.51.78.143和42.51.78.144机器上安装Keepalived 安装基础软件:

yum install -y gcc openssl-devel libnl libnl-devel libnfnetlink-devel net-tools vim wget pcre socat conntrack

安装keepalived

yum install -y keepalived

配置MASTER 在42.51.78.143服务器上操作 备份默认的keepalived配置

mv /etc/keepalived/keepalived.conf /tmp/keepalived-back.conf
编辑配置 vim /etc/keepalived/keepalived.conf 添加以下配置:

global_defs {
   router_id LVS_01  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface eth0  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 150  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1997
    }
    virtual_ipaddress {
        42.51.78.140/24  #定义虚拟IP(VIP)为42.51.78.140,可多设,每行一个
    }
}   
配置BACKUP 在42.51.78.144服务器上操作 备份默认的keepalived配置

mv /etc/keepalived/keepalived.conf /tmp/keepalived-back.conf
编辑配置 vim /etc/keepalived/keepalived.conf

添加以下配置:
global_defs {
   router_id LVS_02  # 设置lvs的id,在一个网络内应该是唯一的
}
vrrp_instance VI_1 {
    state BACKUP #指定Keepalived的角色,MASTER为主,BACKUP为备 记得大写
    interface eth0  #网卡id 不同的电脑网卡id会有区别 可以使用:ip a查看
    virtual_router_id 51  #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR
    advert_int 1  #检查间隔,默认为1s
    authentication {   #这里配置的密码最多为8位,主备要一致,否则无法正常通讯
        auth_type PASS
        auth_pass 1997
    }
    virtual_ipaddress {
        42.51.78.140/24  #定义虚拟IP(VIP)为42.51.78.140,可多设,每行一个
    }
}

设置开机自启并启动和查看状态

systemctl enable keepalived --now && systemctl status keepalived

配置注意项 router_id

后面跟的自定义的ID在同一个网络下是一致的

state

state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题

interface

网卡ID;这个值不能完全拷贝我的配置,要根据自己的实际情况来看,可以使用

Priority

主备优先级
MASTER中配置的priority必须比BACKUP大;差值最好>=50

Authentication

主备之间的认证方式
一般使用PASS即可;主备配置必须一致;否则无法通讯,会导致裂脑;密码不能大于8位

virtual_ipaddress

配置的VIP;允许配置多个

检查lb01机器上主keepalived 启动后的配置情况

ip a
如果网卡下出现42.51.78.140(VIP)说明主已经启动成功

检查lb02机器上备keepalived 启动后的配置情况

ip a
备服务器的网卡下没有出现42.51.78.140(VIP)的ip,说明备服务正常

注:如果这里也出现了VIP,那么说明裂脑了,需要检查防火墙是否配置正确;是否允许了vrrp的多播通讯

问题回顾:

1:我在hyper-集群上,VIP的ip一直出现脑裂,用esxi集群就没问题

2:我在esxi集群上使用的VIP的ip出现不通,

原因一:arp没清理,

原因二:iptables -L查看规则,发现存在一个规则,这个可能是跟我安装了ipvsadm有关。 使用iptables -X和iptables -F进行清除即可。

-F 是清空指定某个 chains 内所有的 rule 设定。比方 iptables -F -t filter,那就是把 filter table 内所有的INPUT/OUTPUT/FORWARD chain 设定的规则都清空。
-X 是删除使用者自订 table 项目,一般使用 iptables -N xxx 新增自订 chain 后,可以使用 iptables -X xxx 删除之。

给Keepalived设置日志文件 原日志在此文件,比较杂乱

tail -f /var/log/messages

设置日志的配置信息

vim /etc/sysconfig/keepalived
KEEPALIVED_OPTIONS="-D -S 0 -d"

设置syslog日志配置文件

vim /etc/syslog.conf
local0.*        /var/log/keepalived.log

重启rsyslog

systemctl restart rsyslog

重启keepalived

systemctl restart keepalived

查看Keepalived日志信息

tail -f /var/log/keepalived.log

Keepalived高可用测试 停掉主keepalived

systemctl stop keepalived

VIP漂移至备keepalived

在lb02机器上通过命令:ip a|grep 42.51.78.140  可以查看到

此时网页访问:42.51.78.140依然能够正常访问;却分发依然正常 启动主keepalived

主服务恢复之后;VIP又会自动漂移回主keepalived服务
在lb01机器上通过命令:ip a|grep 42.51.78.140  可以查看到

你可能感兴趣的:(nginx,负载均衡)