Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务

 创作不易,来了的客官点点关注,收藏,订阅一键三连❤  


前言

运维之基础——Linux。我是一个即将毕业的大学生,超超。如果你也在学习Linux,不妨跟着萌新超超一起学习Linux,拿下Linux,一起加油,共同努力,拿到理想offer!


系列文章

Linux进阶 | ❤Docker+NFS+Volume实现数据一致性❤

Linux进阶 | 超详细全方面的Docker Swarm Web集群介绍与部署!

Linux进阶 | docker compose的安装与使用详解,超详细!


概述

本期内容为Docker第七期,通过本期内容将会掌握Nginx的负载均衡、keepalived实现高可用等,同时将负载均衡+高可用(LB+HA)实现双VIP。


目录

前言

系列文章

概述

负载均衡

什么是负载均衡?

为什么要实现负载均衡?

负载均衡的算法

负载均衡的实现

负载均衡高可用的实现

何为高可用?

为何要实现高可用?

keepalived

VRRP协议

负载均衡高可用的实现

漂移现象

脑裂现象

什么是脑裂现象?

发生脑裂的原因?

脑裂是否有危害?

负载均衡双VIP高可用的实现


负载均衡

什么是负载均衡?

负载均衡:load balancing,将用户的访问请求均衡的分散到真正提供服务的机器上

负载均衡器:load balancer,实现负载均衡功能的一个机器

为什么要实现负载均衡?

1.能够将大量的请求比较均匀的分散到后端,不会导致某台服务器访问量过大,某个服务又没有访问量

2.高可用(对后端的服务器进行健康检测,如果后端那台服务器出现问题,就不会再将请求转发给它,从而避免用户访问不了服务器,启动一个容错的功能)

负载均衡的算法

1.轮询(roundrobin):默认下为轮询算法,默认情况下所有的服务器的权重值都是1 ,值越大优先级越好(加权轮询)

2.ip_hash:基于客户端的ip地址做负载均衡,相同的ip地址转发到同一个服务器  --》用户的会话信息需要保存的,尽量让这个客户机每次都访问相同的一台

3.least-connected:最小连接数首选遍历后端集群,比较每个后端的conns/weight,选取该值最小的后端。如果有多个后端的conns/weight值同为最小的,那么对它们采用加权轮询算法。

负载均衡的实现

1.准备一台客户机作为负载均衡器

IP:192.168.232.136 主机名:load-balancer担任角色:负载均衡器(需要配置)

IP:192.168.232.132 主机名:docker-manager-1 担任角色:swarm manager

IP:192.168.232.133 主机名:docker-2 担任角色:swarm node1

IP:192.168.232.134 主机名:docker-3 担任角色:swarm node2

IP:192.168.232.131 主机(ubuntu)名:chaochao 担任角色:swarm node3

IP:192.168.232.135 主机名:nfs-server 担任角色:nfs服务器

2.编译脚本

[root@load-balancer ~]# vim onekey_install_lizhichao_nginx_v10.sh

[root@load-balancer ~]# cat onekey_install_lizhichao_nginx_v10.sh

#!/bin/bash


#解决软件的依赖关系,需要安装的软件包

yum -y install zlib zlib-devel openssl openssl-devel pcre pcre-devel gcc gcc-c++ autoconf automake make psmisc net-tools lsof vim wget

 
#新建chaochao用户和组

id  chaochao || useradd chaochao -s /sbin/nologin


#下载nginx软件

mkdir  /lzc_load_balancing -p

cd /lzc_load_balancing

wget  http://nginx.org/download/nginx-1.21.1.tar.gz



#解压软件

tar xf nginx-1.21.1.tar.gz

#进入解压后的文件夹

cd nginx-1.21.1
 

#编译前的配置

./configure --prefix=/usr/local/lzc_load_balancing  --user=chaochao --group=chaochao  --with-http_ssl_module   --with-threads  --with-http_v2_module  --with-http_stub_status_module  --with-stream
 

#如果上面的编译前的配置失败,直接退出脚本

if (( $? != 0));then

  exit

fi

#编译

make -j 2

#编译安装

make  install



#修改PATH变量

echo  "PATH=$PATH:/usr/local/lzc_load_balancing/sbin" >>/root/.bashrc

#执行修改了环境变量的脚本

source /root/.bashrc
 

#firewalld and selinux

 
#stop firewall和设置下次开机不启动firewalld

service firewalld stop

systemctl disable firewalld



#临时停止selinux和永久停止selinux

setenforce 0

sed  -i '/^SELINUX=/ s/enforcing/disabled/' /etc/selinux/config



#开机启动

chmod +x /etc/rc.d/rc.local

echo  "/usr/local/lzc_load_balancing/sbin/nginx" >>/etc/rc.local

 
[root@load-balancer ~]#

3.安装运行脚本

[root@load-balacer ~]# bash onekey_install_lizhichao_nginx_v10.sh

……

test -d '/usr/local/lzc_load_balancing/logs' \

|| mkdir -p '/usr/local/lzc_load_balancing/logs'

make[1]: 离开目录“/lzc_load_balancing/nginx-1.21.1”

Redirecting to /bin/systemctl stop firewalld.service

[root@load-balancer ~]#

4.启动nginx

命令:

nginx  启动nginx

nginx -s stop  关闭nginx

[root@load-balancer nginx-1.21.1]# nginx

[root@load-balancer nginx-1.21.1]#

[root@load-balancer nginx-1.21.1]# ps aux|grep nginx

root        9301  0.0  0.2 119148  2176 ?        Ss   18:20   0:00 nginx: master process nginx

nginx       9302  0.0  0.9 151824  7912 ?        S    18:20   0:00 nginx: worker process

root        9315  0.0  0.1  12344  1108 pts/0    S+   18:21   0:00 grep --color=auto nginx

[root@load-banlancer nginx-1.21.1]# ss -anplut|grep nginx

tcp     LISTEN   0        128              0.0.0.0:80            0.0.0.0:*       users:(("nginx",pid=9302,fd=9),("nginx",pid=9301,fd=9))                       

tcp     LISTEN   0        128                 [::]:80               [::]:*       users:(("nginx",pid=9302,fd=10),("nginx",pid=9301,fd=10))                     

[root@load-banlancer nginx-1.21.1]#

5.配置nginx里的负载均衡功能

[root@load-balancer nginx-1.21.1]# cd /usr/local/lzc_load_balancing/

[root@load-balancer lzc_load_balancing]# ls

conf  html  logs  sbin

[root@load-balancer lzc_load_balancing]# cd conf/

[root@load-balancer conf]# ls

fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params

fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default

fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf

[root@load-balancer conf]# vim nginx.conf

[root@load-balancer conf]# cat nginx.conf #以下仅显示修改了的脚本部分

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 chaoweb{ #定义一个负载均衡器的名字为:chaoweb

        server 192.168.232.132:8026;

        server 192.168.232.131:8026;

        server 192.168.232.133:8026;

        server 192.168.232.134:8026;

       

}

    server {

        listen       80;

        server_name  www.lizhichao.com; #设置域名为www.sc.com

 

        #charset koi8-r;

 

        #access_log  logs/host.access.log  main;

 

        location / {

        server 192.168.232.134:8026;

 

}

    server {

        listen       80;

        server_name  www.lizhichao.com; #设置域名为www.sc.com

        location /{

            proxy_pass http://chaoweb; #调用负载均衡器

}

[root@load-balancer conf]# nginx -s reload # 重新加载配置文件

[root@load-banlancer conf]# ps aux|grep nginx

root        9301  0.0  1.2 120068  9824 ?        Ss   18:20   0:00 nginx: master process nginx

nginx       9395  0.1  1.0 152756  8724 ?        S    19:16   0:00 nginx: worker process

root        9397  0.0  0.1  12344  1044 pts/0    S+   19:18   0:00 grep --color=auto nginx

[root@load-balancer conf]#

6.在Windows添加IP映射并查看效果

修改windowshosts文件,点击此处查看方法

在C:\Windows\System32\drivers\etc的hosts文件

Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务_第1张图片

Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务_第2张图片

swarm集群上查看

[root@docker-manager-1 ~]# vim /etc/hosts

[root@docker-manager-1 ~]# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.232.132 manager

192.168.232.133 worker1

192.168.232.134 worker2

192.168.232.131 worker3

192.168.232.136 www.lizhichao.com

[root@docker-manager-1 ~]# curl www.lizhichao.com





chaochao





name:chaochao

sex:male

tel:1517388321

reputation [root@docker-manager-1 ~]#

7.查看负载均衡的分配情况

用抓包工具来查看:tcpdump

[root@load-balancer ~]# yum install tcpdump -y

负载均衡高可用的实现

何为高可用?

高可用(High Availability),一个业务不会因为某个设备或某个点出现问题而导致整个业务不能正常运行,不能有单点故障。

为何要实现高可用?

防止单点故障。

单点:整个架构中只有一台服务器的环境

单点故障:如果一台服务器down机,导致整个集群出现异常

keepalived

官方文档: https://www.keepalived.org/

Keepalived 是一个用 C 编写的路由软件。该项目的主要目标是为 Linux 系统和基于 Linux 的基础设施提供简单而强大的负载平衡和高可用性设施。

负载均衡框架依赖于众所周知且广泛使用的Linux 虚拟服务器 (IPVS)内核模块,提供第 4 层负载均衡。Keepalived 实现了一组检查器,以根据其健康状况动态和自适应地维护和管理负载平衡的服务器池。

另一方面,高可用性是通过VRRP实现的协议。VRRP 是路由器故障转移的基础。此外,Keepalived 为 VRRP 有限状态机实现了一组钩子,提供低级和高速协议交互。为了提供最快的网络故障检测,Keepalived 实现了BFD协议。VRRP 状态转换可以考虑 BFD 提示来驱动快速状态转换。Keepalived 框架可以单独使用,也可以一起使用,以提供弹性基础设施。

keepalive两大功能

1.实现高可用

2.负载均衡

VRRP协议

       VRRP:虚拟路由冗余协议,它是一种容错协议,它保证当用户设备的下一跳路由器失效时,可以及时的由另一台路由器来替代,从而保持通讯的连续和可靠。

       VRRP包的源地址是本机地址,目的地址必须为224.0.0.18,跟TCP的协议号为6,UDP的协议号为17,ICMP的协议号为1一样,VRRP协议一样需要协议号,为112

       VRRP通过交互报文的方法将多台路由器模拟成一台虚拟路由器(该虚拟路由器可以有多个虚拟IP地址),网络上的主机与虚拟路由器进行通讯。一旦VRRP组中的某台物理路由器失效,其它路由器自动接替工作。

       启动VRRP协议设备的角色

       masterbackupMaster路由器就是在VRRP组实际转发数据包的路由器,Backup路由器就是在VRRP组中处于监听状态的路由器。一旦Master路由器出现故障,Backup路由器就开始接替工作

负载均衡高可用的实现

1.环境部署,需要准备两台服务器作为负载均衡器

IP:192.168.232.136 主机名:load-balancer担任角色:负载均衡器(master)

IP:192.168.232.137 主机名:load-balancer担任角色:负载均衡器

IP:192.168.232.168 担任角色:虚拟路由器1

IP:192.168.232.169 担任角色:虚拟路由器2

IP:192.168.232.132 主机名:docker-manager-1 担任角色:swarm manager

IP:192.168.232.133 主机名:docker-2 担任角色:swarm node1

IP:192.168.232.134 主机名:docker-3 担任角色:swarm node2

IP:192.168.232.131 主机(ubuntu)名:chaochao 担任角色:swarm node3

IP:192.168.232.135 主机名:nfs-server 担任角色:nfs服务器

2.配置负载均衡

因为第1台已经配置好了负载均衡功能,所以我们直接配置第2台负载均衡服务器,通过克隆安装第2台nginx负载均衡器

3.安装keepalived

命令:yum install keepalived -y

[root@load-balancer ~]# yum install keepalived -y
[root@load-balancer-2 ~]# yum install keepalived -y

4.配置/etc/keepalived/keepalived.conf

注释:vrrp_strict

删掉:文件内负载均衡的功能(esc模式下输入d999然后enter键,可以快速删除,但要补上global_defs {的“}”)

修改keepalived.conf以下部分

对于load balancing:

vrrp_instance VI_1 { #启动一个vrrp的实例 VI_1 实例名,可以自定义

    state MASTER #角色是master

    interface ens33  #在ens33接口上监听vrrp协议,同时绑定vip到ens33接口

    virtual_router_id 168  #虚拟路由id: 0~255范围

    priority 220  #优先级(master要高于backup)  0~255

    advert_int 1  #advert interval 宣告消息 时间间隔 1秒

    authentication {  #认证

        auth_type PASS  #认证的类型是密码认证  password

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.168  #vip的配置,vip可以是多个ip

}

}

对于load balancing-2(backup):

vrrp_instance VI_1 {

    state BACKUP

    interface ens33

    virtual_router_id 168

    priority 130

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.168

}

}

5.重启keepalived服务

命令:service keepalived restart

[root@load-balancer ~]# service keepalived restart

Redirecting to /bin/systemctl restart keepalived.service

[root@load-balancer ~]#
[root@load-balancer-2 ~]# service keepalived restart

Redirecting to /bin/systemctl restart keepalived.service

[root@load-balancer-2 ~]#

6.ip add查看是否keepalied部署成功

MASTER

[root@load-balancer ~]# ip add

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    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: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:9a:d6:b6 brd ff:ff:ff:ff:ff:ff

    inet 192.168.232.136/24 brd 192.168.232.255 scope global dynamic noprefixroute ens33

       valid_lft 1232sec preferred_lft 1232sec

    inet 192.168.232.168/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::b4cd:b005:c610:7b3b/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::40fb:5be0:b6f9:b063/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::2513:c641:3555:5eeb/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

[root@load-balancer ~]#

注:vip虚拟路由部署成功

BACKUP

[root@load-balancer-2 ~]# ip a

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    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: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:04:e5:b4 brd ff:ff:ff:ff:ff:ff

    inet 192.168.232.137/24 brd 192.168.232.255 scope global dynamic noprefixroute ens33

       valid_lft 1153sec preferred_lft 1153sec

    inet6 fe80::b4cd:b005:c610:7b3b/64 scope link noprefixroute

       valid_lft forever preferred_lft forever

[root@load-balancer-2 ~]#

TIPS

同时可以通过ping 虚拟路由地址,ping通说明部署成功

[root@load-balancer-2 ~]# ping 192.168.232.168

PING 192.168.232.168 (192.168.232.168) 56(84) bytes of data.

64 bytes from 192.168.232.168: icmp_seq=1 ttl=64 time=1.57 ms

64 bytes from 192.168.232.168: icmp_seq=2 ttl=64 time=0.625 ms

c64 bytes from 192.168.232.168: icmp_seq=3 ttl=64 time=0.514 ms

64 bytes from 192.168.232.168: icmp_seq=4 ttl=64 time=0.525 ms

^C

--- 192.168.232.168 ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 88ms

rtt min/avg/max/mdev = 0.514/0.809/1.572/0.442 ms

[root@load-balancer-2 ~]#

7.访问虚拟路由地址(VIP

访问:https//vip地址

Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务_第3张图片

8.通过查看arp缓存表查看vip作用在哪台负载均衡器上

Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务_第4张图片

漂移现象

当master服务器的keepalived服务关闭后,master转移到backup的现象。

脑裂现象

什么是脑裂现象?

服务器中有2台或2台以上vip地址

脑裂是因为考虑不周或者误操作导致,我们一般不去故意制造脑裂。

发生脑裂的原因?

1.virtual_router_-id不一样

2.防火墙阻止了keepalived的vrrp消息的通告

脑裂是否有危害?

脑裂现象对于高可用而言,没有危害。

防火墙导致的脑裂现象,是有危害的,用户将不能进行访问。

master工作时,backup服务器属于闲置状态,如果将backup也对外提供服务?

1.故意制造脑裂

2.DNS域名解析+使用双VIP

负载均衡双VIP高可用的实现

原理:通过设置keepalived.conf文件,增加一个vrrp实例,试得backup具有master角色,同时master也具备了backup的角色。

步骤如下:

1.配置keepalived.conf文件

对于单VIP下的master

[root@load-balancer ~]# vim /etc/keepalived/keepalived.conf

[root@load-balancer ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   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 MASTER

    interface ens33

    virtual_router_id 168

    priority 220

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.168

    }

}

 

vrrp_instance VI_2 {

    state BACKUP

    interface ens33

    virtual_router_id 169

    priority 180

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.169

    }

}

 

[root@load-balancer ~]#

对于单VIP下的backup

[root@load-balancer-2 ~]# vim /etc/keepalived/keepalived.conf

[root@load-balancer-2 ~]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

   notification_email {

     [email protected]

     [email protected]

     [email protected]

   }

   notification_email_from [email protected]

   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 ens33

    virtual_router_id 168

    priority 130

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.168

}

}

 

vrrp_instance VI_2 {

    state MASTER

    interface ens33

    virtual_router_id 169

    priority 200

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        192.168.232.169

    }

}

 

[root@load-balancer-2 ~]#

2.重启keepalived服务

对于单VIP下的master

[root@load-balancer ~]# service keepalived restart

Redirecting to /bin/systemctl restart keepalived.service

[root@load-balancer ~]# ip a

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    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: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:9a:d6:b6 brd ff:ff:ff:ff:ff:ff

    inet 192.168.232.136/24 brd 192.168.232.255 scope global dynamic noprefixroute ens33

       valid_lft 1374sec preferred_lft 1374sec

    inet 192.168.232.168/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::b4cd:b005:c610:7b3b/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::40fb:5be0:b6f9:b063/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::2513:c641:3555:5eeb/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

[root@load-balancer ~]#

对于单VIP下的backup

[root@load-balancer-2 ~]# service keepalived restart

Redirecting to /bin/systemctl restart keepalived.service

[root@load-balancer-2 ~]# ip a

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    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: ens33:  mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether 00:0c:29:04:e5:b4 brd ff:ff:ff:ff:ff:ff

    inet 192.168.232.137/24 brd 192.168.232.255 scope global dynamic noprefixroute ens33

       valid_lft 1435sec preferred_lft 1435sec

    inet 192.168.232.169/32 scope global ens33

       valid_lft forever preferred_lft forever

    inet6 fe80::b4cd:b005:c610:7b3b/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::40fb:5be0:b6f9:b063/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

    inet6 fe80::2513:c641:3555:5eeb/64 scope link dadfailed tentative noprefixroute

       valid_lft forever preferred_lft forever

[root@load-balancer-2 ~]#

3.测试是否成功实现

[root@load-balancer-2 ~]# nginx

[root@load-balancer-2 ~]# curl 192.168.232.169





chaochao





name:chaochao

sex:male

tel:1517388321

reputation [root@load-balancer-2 ~]#

创作不易,客官点个赞,评论一下吧!超超和你一起加油❤  

你可能感兴趣的:(Linux,docker,运维,负载均衡,nginx,keepalived)