Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务
Posted chaochao️
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
目录
负载均衡
什么是负载均衡?
负载均衡: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映射并查看效果
修改windows的hosts文件,点击此处查看方法
在C:\\Windows\\System32\\drivers\\etc的hosts文件
在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
<html>
<head>
<title>chaochao</title>
</head>
<body>
<p>name:chaochao</p>
<p>sex:male</p>
<p>tel:1517388321</p>
<img src=1.jpg>
<a href=rep.html>reputation</a>
</body>
</html>
[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协议设备的角色
master和backup,Master路由器就是在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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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地址
8.通过查看arp缓存表查看vip作用在哪台负载均衡器上
漂移现象
当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 {
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 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 {
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 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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
<html>
<head>
<title>chaochao</title>
</head>
<body>
<p>name:chaochao</p>
<p>sex:male</p>
<p>tel:1517388321</p>
<img src=1.jpg>
<a href=rep.html>reputation</a>
</body>
</html>
[root@load-balancer-2 ~]#
创作不易,客官点个赞,评论一下吧!超超和你一起加油❤😜
以上是关于Linux进阶 | 实现负载均衡高可用(LB+HA)Web服务的主要内容,如果未能解决你的问题,请参考以下文章
Linux运维-集群技术进阶Nginx+Keepalived+Tomcat搭建高可用/负载均衡/动静分离的Webserver集群