理论:
- 网络知识
- 七层模型:物数网传会表应
- 物理层,数据链路层,网络层,传输层,会话层,表示层,应用层
- 四层模型:物数网传
- 物理层,数据链路层,网络层,传输层
- 负载均衡:
- 负载均衡包括应用程序处理和网络流程负载均衡
- 负载均衡实现方式分为:硬件和软件
- 硬件负载均衡:F5 深信服 rasware
- 软件负载均衡:LVS HAPROXY ATS
- 负载均衡分类:
- 二层:虚拟mac地址作为相应
- 三层:虚拟IP地址进行相应
- 四层:在三层的基础上添加port(端口)
- 七层:虚拟URL或者ip,主机名接收请求,站到相应的处理服务器
- 四层与七层负载均衡的区别
- 四层负载均衡基于ip和port,链接路由器,复杂度低,性能高,无需解析内容,但是安全性低
- 七层负载均衡基于虚拟URL和主机ip,连接代理服务器,安全性高,有会话保持和图片压缩功能,但是复杂度高,性能低需要对内容进行解析。
- 专业术语:
VS:Virtual Server #虚拟服务
Director, Balancer #负载均衡器、分发器
RS:Real Server #后端请求处理服务器
CIP: Client IP #用户端IP
VIP:Director Virtual IP #负载均衡器虚拟IP
DIP:Director IP #负载均衡器IP
RIP:Real Server IP #后端请求处理服务器IP
- LVS的优势与不足
高并发连接:单台LVS负载均衡器可以并发上万条连接
稳定性强:基于4层网络上建立的应用,稳定想抢,内存和cpu消耗少
成本低:1台即可部署
配置简单:
支持多种算法:
支持多种工作模型
应用范围广:
但是:工作在4层,不支持7层规则修改,机制过于庞大,不适合小规模应用。
- Lvs的四种工作模式
- NAT :只需要一个合法ip,但是扩展性有限,负载过多,整个路径瘫痪。
- DR直接路由:不需要隧道结构,不需要太多的操作系统座位物理服务器,但是负载均衡器的网卡必须与物理网卡在一个物理段上。
- IP隧道
- LVS的算法调度:静态和动态
静态:RR(轮叫) WRR(加权轮叫)DH(目标地址散列) SH(源地址)
动态:LC(最少链接) WLC(加权最少连接) SED(最短期望延迟调度) NQ(永不排队) LBLC(局部性最少连接) LBLCR(复制的基于局部性最少连接)
实操:
-
LVS负载均衡四种工作模式
- LVS/NAT:网络地址转换模式,进站/出站的数据流量经过分发器(IP负载均衡,他修改的是IP地址) --利用三层功能
- LVS/DR :直接路由模式,只有进站的数据流量经过分发器(数据链路层负载均衡,因为他修改的是目的mac地址)--利用二层功能mac地址
- LVS/TUN: 隧道模式,只有进站的数据流量经过分发器
- LVS/full-nat:双向转换:通过请求报文的源地址为DIP,目标为RIP来实现转发:对于响应报文而言,修改源地址为VIP,目标地址为CIP来实现转发
-
NAT的工作原理
客户发来数据包ip到负载端,director负载将客户的cip转位vip传输给rs机器,
rs机器处理,处理结束后将vip包结果反馈给负载均衡器
负载均衡器将回收的反馈vip结果转化为cip包发送给客户端。
-
LVS ipvsadm命令
规则保存工具:/usr/sbin/ipvsadm-save > /path/to/file
配置文件:/etc/sysconfig/ipvsadm-config
命令参数
-A 在服务器列表中新添加一条新的虚拟服务器记录
-s 使用的调度算法, rr | wrr | lc | wlc | lblb | lblcr | dh | sh | sed | nq
-a 在服务器表中添加一条新的真实主机记录
-t 说明虚拟服务器提供tcp服务:ipvsadm -a -t
-u 说明虚拟服务器提供udp服务
-r 真实服务器地址
-m 指定LVS工作模式为NAT模式
-w 真实服务器的权值
-g 指定LVS工作模式为直接路由器模式(也是LVS默认的模式)
-i 指定LVS的工作模式为隧道模式
-p 会话保持时间,定义流量被转到同一个realserver的会话存留时间
例:ipvsadm -a -t 192.168.1.2:80 -r 192.168.2.10:80 -m -w 1
-E 编辑内核虚拟服务器表中的一条虚拟服务器记录。
-D 删除内核虚拟服务器表中的一条虚拟服务器记录。
-C 清除内核虚拟服务器表中的所有记录。
-R 恢复虚拟服务器规则
-S 保存虚拟服务器规则到标准输出,输出为-R 选项可读的格式
-e 编辑一条虚拟服务器记录中的某条真实服务器记录
-d 删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l 显示内核虚拟服务器表
-n 以数字形式输出地址和端口号
--exact 扩展信息,精确值
--connection,-c: #当前IPVS连接输出
--stats: #统计信息
--rate : #输出速率信息
参数也可以从/proc/net/ip_vs*映射文件中查看
-Z –zero #虚拟服务表计数器清零(清空当前的连接数量等)
-
NAT模式下的配置方法:
- 负载平衡:
- ipvsadm:
- 安装ipvsadm: yun -y ipvsadm
- 启动ipvsadm: touch /etc/sysconfig/ipvsadm && systemctl start ipvsadm && systemctl enadle ipvsadm
- 配置负载均衡主机: ipvsadm -A -t(tcp协议) ip:port(端口)-s(算法) rr(调度)/wrr
- 真实主机:ipvsadm -a -t 负载ip:port -r ip:port -m(nat模式) -w(权重)
- 虚拟路由器转发:
- 在虚拟机上添加临时nat网卡,或者临时添加网卡§ip a add 新ip dev ens33
- 路由配置:Cat >> /etc/sysctl.conf <<EOF
Net.ipv4.ip_forward=1
EOF
-
- 路由规则生成:Sysctl -p
备注:在使用过程中,出错可以使用journalctl -xe 查看日志。
- 真实机器:
- 配置跳转路由:ip r add default via 负载均衡的新ip
- 安装对应服务,上传web包。
- DR模式下的配置方法:
- keepalived 高可用项目实战
-
实操-nginx:
准备四台机器:
类型 | 安装的软件 | |
Kedpalived 1 | Ipvsadm keepalived | Maxist |
Keepalived 2 | Ipvsadm keepalived | backup |
真实机 1 | Nginx | |
真实机 2 | Nginx |
- NGINX安装:
下载数据包:yum -y install nginx
启动nginx: systemctl start nginx |systemctl enable nginx
添加虚拟网关:ip a a dev lo 相同ip和32位子网掩码
添加开机自动绑定ip:echo “ip a add dev lo ip ” >> /etc/rc.local
关闭广播: echo “net.ipv4.conf.all.arp_ignore=1” >> /etc/sysctl.conf
echo “net.ipv4.conf.all.arp_announce=2” >> /etc/sysctl.conf
刷新内核参数:sysctl -p
- Ipvsadm 和keepalived 的安装
-
方法一:使用命令建立关联
- Ipvsadm 建立
安装ipvsadm:yum -y install ipvsadm
启动:systemctl start ipvsadm && systemctl enable ipvsadm
启动失败排查: journalctl -xe
添加负载dip: ipvsadm -A -t ip:pront -s (rr wrr)
添加rip: ipvsadm -a -t dip:pront -r rip:pront -g(m) -w 权重
- Keepalived 高可用
安装keepalived:yum -y install keepalived
修改/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为directory2
}
#定义轮转时发送邮件提醒的脚本位置
vrrp_script check_run {
script /etc/keepalived/keepalived_check_mysql.sh
interval 5
}
vrrp_instance VI_1 {
state MASTER #定义主还是备
interface ens33 #VIP绑定接口
nopreempt #设置到back上面,不抢占资源
virtual_router_id 80 #整个集群的调度器一致
priority 100 #back改为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.147.100/24 # vip
}
#脚本引用
track_script {
check_run
}
#脚本中各个参数的引用
notify_master "/etc/keepalived/sendmail.sh master"
notify_backup "/etc/keepalived/sendmail.sh backup"
notify_fault "/etc/keepalived/sendmail.sh fault"
}
}
添加脚本,当发升故障跳转时发送邮件。Vim sendmail.sh
#!/bin/bash
to_email='1428653005@qq.com'
ipaddress=`ip -4 a show dev ens33 | awk '/brd/{print $2}'`
notify() {
mailsubject="${ipaddress}to be $1, vip转移"
mailbody="$(date +'%F %T'): vrrp 飘移, $(hostname) 切换到 $1"
echo "$mailbody" | s-nail -s "$mailsubject" $to_email
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
启动高可用: systemctl start keepalived && systemctl enable keepalived
-
方法二:配置文件实现ipvsadm和高可用
Keepalived 高可用和 ipvsadm
安装keepalived:yum -y install keepalived
修改/etc/keepalived/keepalived.conf配置文件
! Configuration File for keepalived
global_defs {
router_id directory1 #辅助改为directory2
}
#定义轮转时发送邮件提醒的脚本位置
vrrp_script check_run {
script /etc/keepalived/keepalived_check_mysql.sh
interval 5
}
vrrp_instance VI_1 {
state MASTER #定义主还是备
interface ens33 #VIP绑定接口
nopreempt #设置到back上面,不抢占资源
virtual_router_id 80 #整个集群的调度器一致
priority 100 #back改为50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.16.147.100/24 # vip
}
#脚本引用
track_script {
check_run
}
#脚本中各个参数的引用
notify_master "/etc/keepalived/sendmail.sh master"
notify_backup "/etc/keepalived/sendmail.sh backup"
notify_fault "/etc/keepalived/sendmail.sh fault"
}
}
#设置vs的dip
virtual_server 172.16.147.101 80 {
delay_loop 3
lb_algo rr
lb_kind DR
net_mask 255.255.255.0
protocol TCP
#设置rs的 rip1
real_server 172.16.147.153 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为
TCP_CHECK {
connect_port 80
connect_timeout 3
}
}
#设置rs的 rip2
real_server 172.16.147.156 80 {
weight 1
inhibit_on_failure #当该节点失败时,把权重设置为
TCP_CHECK {
connect_timeout 3
connect_port 80
}
}
}
添加脚本,当发升故障跳转时发送邮件。Vim sendmail.sh
#!/bin/bash
to_email='1428653005@qq.com'
ipaddress=`ip -4 a show dev ens33 | awk '/brd/{print $2}'`
notify() {
mailsubject="${ipaddress}to be $1, vip转移"
mailbody="$(date +'%F %T'): vrrp 飘移, $(hostname) 切换到 $1"
echo "$mailbody" | s-nail -s "$mailsubject" $to_email
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
启动高可用: systemctl start keepalived && systemctl enable keepalived