1. 负载均衡集群介绍
- 主流开源软件LVS、keepalived、haproxy、nginx等。
- LVS属于4层负载均衡,Nginx属于7层负载均衡,Haproxy 既可以认为是4层,也可以做7层使用。
- LVS这种4层的负载均衡是可以分发除80外的其他端口通信的,比如MySQL的,而Nginx仅仅支持HTTP、HTTPS、MAIL; Haproxy也支持MySQL这种。
- 相比较来说,LVS这种4层的更稳定,能承受更多的请求,而Nginx这种7层的更加灵活,能实现更多个性化需求。
2. LVS简介
- LVS是由国人章文嵩开发。
- LVS是基于TCP/IP做的路由和转发,稳定性和效率很高。
- LVS是工作于Linux内核中的。
- LVS有三种常见的模式:NAT、DR、IP Tunnelo
- LVS架构中有一个核心角色叫做分发器(Load Balancer),它用来分发用户的请求。
一个LVS集群往往包含以下角色:
- DS: Director Server。指的是前端负载均衡器节点。
- RS: Real Server。后端真实的工作服务器。
- VIP:向外部直接面向用户请求,作为用户请求的目标的IP地址。
- DIP: Director Server lP,主要用于和内部主机通讯的IP地址。
- RIP: Real ServerlP,后端服务器的IP地址。
- CIP: Client lP,访问客户端的IP地址。
3. LVS NAT模式 - 改IP实现
- 这种模式借助iptables的nat表来实现。
- 用户的请求到分发器后,通过预设的iptables规则,把请的数据包转发到后端的RS上去。
- RS需要设定网关为分发器的内网IP。
- 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈。
- 在nat模式中,只需要分发器有公网IP即可,所以比较节省公网IP资源。
4. LVS IP Tunnel 模式 - 封装报文实现
- 这种模式需要有一个公共的IP配置在分发器和所有的RS上我们把它叫做VIP。
- 客户端请求的目标lP为VIP,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为RS的IP,这样数据包
就到了RS上。 - RS接收数据包后,会还原原始数据包,这样目标IP为VIP,因为所有RS上配置了这个VIP,所以它会认为是它自己。
5. LVS DR模式 - 改MAC地址实现
- 这种模式,也需要有一个公共的IP配置在分发器和所有RS上,也就是VIP。
- 和IP Tunnel不同的是,它会把数据包的MAC地址修改为RS的MAC地址。
-
RS接收数据包后,会还原原始数据包,这样目标IP为VIP,因为所有RS上配置了这个VIP,所以它会认为是它自己。
6. LVS调度算法
针对不同的网络服务需求和服务器配置,IPVS调度器实现了如下八种负载调度算法:
- 轮叫(Round Robin)
- 加权轮叫(Weighted Round Robin)
- 最少链接(Least Connections)
- 加权最少链接(Weighted Least Connections)
- 基于局部性的最少链接(Locality-Based Least Connections)
- 带复制的基于局部性最少链接((Locality-Based Least Connections with Replication)
- 目标地址散列(Destination Hashing)
- 源地址散列(Source Hashing)
7. LVS 集群搭建
环境准备:
- 虚拟机:Oracle VM VirtualBox 5.2.22
- 虚拟主机:(example)
- Host1-vbox: Ubuntu 18.04、192.168.3.101
- Host2-vobx: Ubuntu 18.04、192.168.3.102
- Host3-vbox: Ubuntu 18.04、192.168.3.103
- Host4-vbox: Ubuntu 18.04、192.168.3.104
- 系统服务:LVS,Keepalived
- Web服务:Nginx
- 集群搭建:LVS DR模式
7.1 安装ipvs 和 keepalived
根据需要可能需要 sudo
yum -y install ipvsadm
yum -y install keepalived
or
apt install ipvsadm
apt install keepalived
7.2 查看本机内核是否支持ipvs
sudo lsmod | grep ip_vs
7.3 创建keepalived.conf
vim /etc/keepalived/keepalived.conf
# Global Configuration
global_defs{
lvs_id director1
}
vrrp_instance LVS {
state MASTER
interface eth0 #对应虚拟机的网卡,使用ifconfig查看
virtual_router_id 100 #这个数值 master和slave必须统一
priority 151 #这个数值决定哪台服务器是master
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.3.110
}
}
#Virtual Server Configuration - for www server
virtual_server 192.168.3.110 80 {
delay_loop 6
lb_algo rr # 负载均衡逻辑策略 rr 表示轮叫(轮询)
lb_kind DR # 负载均衡模式DR
# 同一个IP地址,同一个子集,在同一段时间返回的Real Server IP一样
# 0 表示每次返回都不相同,60表示一分钟
# persistence_timeout 50
protocol TCP # 协议TCP
# Real Server 1 configuration
real_server 192.168.146.139 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# Real Server 2 configuration
real_server 192.168.146.140 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
host2 配置基本一致
# Global Configuration
global_defs{
lvs_id director2
}
vrrp_instance LVS {
state MASTER
interface eth0 #对应虚拟机的网卡,使用ifconfig查看
virtual_router_id 100 #这个数值 master和slave必须统一
priority 150 #这个数值决定哪台服务器是master
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.3.110
}
}
#Virtual Server Configuration - for www server
virtual_server 192.168.3.110 80 {
delay_loop 6
lb_algo rr # 负载均衡逻辑策略 rr 表示轮叫(轮询)
lb_kind DR # 负载均衡模式DR
# 同一个IP地址,同一个子集,在同一段时间返回的Real Server IP一样
# 0 表示每次返回都不相同,60表示一分钟
# persistence_timeout 50
protocol TCP # 协议TCP
# Real Server 1 configuration
real_server 192.168.146.139 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
# Real Server 2 configuration
real_server 192.168.146.140 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
7.4 修改Nginx配置
- host3
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
server {
listen 80; # 监听80端口
location / {
default_type text/html;
return 200 "Hello, Nginx! Server host3@192.168.3.103";
}
}
}
- host4
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
server {
listen 80; # 监听80端口
location / {
default_type text/html;
return 200 "Hello, Nginx! Server host4@192.168.3.104";
}
}
}
可以使用curl -i 192.168.3.103/104
测试是否访问正常
7.5 创建lvrs文件 host3 和 host4 都需要
vim emacs /etc/init.d/lvsrs
# 如果要关闭则全部写 echo "0"
#!/bin/bash
ifconfig lo:192.168.3.110 netmask 255.255.255.255 broadcast 192.168.3.110 up route add -host 192.168.3.110 dev lo:0
echo "0" > /proc/sys/net/ipv4/ip_forward
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
exit 0
将以上文件设置成可执行的
sudo chmod +x /etc/init.d/lvsrs
然后执脚本即可
sudo /etc/init.d/lvsrs
7.6 启动host1 和 host2 的keepalived即可
sudo service keepalived start
查看
sudo ipvsadm -ln
如果觉得有收获,欢迎点赞和评论,更多知识,请点击关注查看我的主页信息哦~
网友评论