负载均衡
主流开源软件: LVS,keepalived,haproxy,nginx 等;
OSI 层: LVS(4),nginx(7),haproxy(4,7);
keepalived 的负载均衡功能其实就是 lvs
LVS 负载均衡可以分发除了 80 以外的其他端口通信, 比如 MySQL, 而 nginx 仅仅支持 http,https,mail;
LVS 介绍
最新版本: 基于 Linux 内核 2.6
常见三种模式: NAT,DR,IP Tunnel
LVS 架构中有一个核心角色叫分发器(Load Balance), 用来分发用户的请求, 还有诸多处理用户请求的服务器 RS;
NAT 模式
这种模式借助 iptables 的 nat 表来实现
用户的请求到分发器 (dir) 后, 通过预设的 iptables 规则, 把请求的数据包转发到后端的 rs 上去
rs 需要设定网关为分发器 (dir) 的内网 ip
用户请求的数据包和返回给用户的数据包全部经过分发器, 所以分发器成为瓶颈
在 nat 模式中, 只需要分发器有公网 ip 即可, 所以比较节省公网 ip 资源
dir 双网卡, 外网口设置公网 ip, 内网口设置内网 ip
sr 的网关指向 dir 内网 ip
dir 安装 ipvsadm 创建脚本 运行脚本就 ok
IP Tunnel 模式
这种模式, 需要有一个公共的 IP 配置在分发器 (dir) 和所有 rs 上, 我们把它叫做 vip
客户端请求的目标 IP 为 vip, 分发器接收到请求数据包后, 会对数据包做一个加工, 会把目标 IP 改为 rs 的 IP, 这样数据包就到了 rs 上
rs 接收数据包后, 会还原原始数据包, 这样目标 IP 为 vip, 因为所有 rs 上配置了这个 vip, 所以它会认为是它自己
DR 模式
这种模式, 也需要有一个公共的 IP 配置在分发器和所有 rs 上, 也就是 vip
和 IP Tunnel 不同的是, 它会把数据包的 MAC 地址修改为 rs 的 MAC 地址
rs 接收数据包后, 会还原原始数据包, 这样目标 IP 为 vip, 因为所有 rs 上配置了这个 vip, 所以它会认为是它自己
算法
轮询 Round-Robin rr
加权轮询 Weight Round-Robin wrr
最小连接 Least-Connection lc
加权最小连接 Weight Least-Connection wlc
基于局部性的最小连接 Locality-Based Least Connections lblc
带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr
目标地址散列调度 Destination Hashing dh
源地址散列调度 Source Hashing sh
LVS NAT 模式配置
准备
分发器, 调度器(dir): 内网 ip192.168.188.2, 外网 ip192.168.200.200(虚拟, 仅主机模式)
rs1: 内网 ip192.168.188.3, 网关 192.168.188.2(网关指向分发器的 ip)
rs2: 内网 ip192.168.188.6, 网关 192.168.188.2(网关指向分发器的 ip)
防火墙设置
关闭 SELinux
- setenforce 0 // 临时关闭
- getenforce 0 // 查看 SELinux 当前状态
vim /etc/selinux/config // 修改配置文件, 永久关闭 SELinux
关闭 firewalld
- systemctl stop firewalld // 停用 firewalld
- systemctl disable firewalld // 禁止 firewalld
配置 iptables
- systemctl start iptables // 启用 iptables
- iptables -F // 清空配置
service iptables save // 保存配置
安装与配置 ipvsadm
- yum install -y ipvsadm // 安装 ipvsadm
- vim /usr/local/sbin/lvs_nat.sh // 创建 vls_nat 的 shell 脚本
- #! /bin/bash
- # director 服务器上开启路由转发功能
- echo 1> /proc/sys/net/ipv4/ip_forward
- # 关闭 icmp 的重定向
- echo 0> /proc/sys/net/ipv4/conf/all/send_redirects
- echo 0> /proc/sys/net/ipv4/conf/default/send_redirects
- # 注意区分网卡名字, 两个网卡分别为 ens33 和 ens37
- echo 0> /proc/sys/net/ipv4/conf/ens33/send_redirects
- echo 0> /proc/sys/net/ipv4/conf/ens37/send_redirects
- # director 设置 nat 防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j MASQUERADE
- # director 设置 ipvsadm
- IPVSADM='/usr/sbin/ipvsadm'
- $IPVSADM -C
- $IPVSADM -A -t 192.168.200.200:80 -s lc -p 300 // 其中 lc 为算法,-p 300 为 300 秒
- $IPVSADM -a -t 192.168.200.200:80 -r 192.168.188.3:80 -m -w 1
- $IPVSADM -a -t 192.168.200.200:80 -r 192.168.188.6:80 -m -w 1
- sh /usr/local/sbin/lvs_nat.sh // 执行脚本
测试
将 sr1 与 sr2 的 nginx 开启, 编辑 sr1 的首页输出为 sr1, 编辑 sr2 的首页输出为 sr2
由于 sr1 与 sr2 是使用 yum 安装的, vim /usr/share/nginx/html/index.html
- ipvsadm -ln // 查看 ipvsadm 规则
- curl 192.168.200.200 // 测试是否随机访问 SR1 和 sr2
来源: http://www.bubuko.com/infodetail-2557986.html