网络协议原理和lvs三种模型,调度算法和keepalived_服务器

OSI七层模型,自顶向下

网络协议原理和lvs三种模型,调度算法和keepalived_ip地址_02

TCP三次握手

网络协议原理和lvs三种模型,调度算法和keepalived_客户端_03

第一次握手

  • 建立连接时,客户端发送 syn 包(syn=j)到服务器,并进入 SYN_SEND 状态,等待服务器确认


第二次握手


  • 服务器收到 syn 包,必须确认客户的 SYN(ack=j+1),同时自己也发送一个 SYN 包(syn=k),即 SYN+ACK 包,此时服务器进入 SYN_RECV 状态

第三次握手

  • 客户端收到服务器的 SYN+ACK 包,向服务器发送确认包 ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED 状态,完成三次握手

通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据

三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的

TCP四次分手

网络协议原理和lvs三种模型,调度算法和keepalived_客户端_04

网络协议原理和lvs三种模型,调度算法和keepalived_客户端_05

  • 客户端 A 发送一个 FIN,用来关闭客户 A 到服务器 B 的数据传送
  • 服务器 B 收到这个 FIN,它发回一个 ACK,确认序号为收到的序号加 1 和 SYN 一样,一个 FIN 将占用一个序号
  • 服务器 B 关闭与客户端 A 的连接,发送一个 FIN 给客户端 A
  • 客户端 A 发回 ACK 报文确认,并将确认序号设置为收到序号加 1

lvs原理和网络

route -n

下一跳机制

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_06

将目标IP与每一条记录的子网掩码(Genmask)一一按位与运算,匹配度最高的Destination字段的IP就是下一跳的IP

也就是网关地址GATEWAY

TCP/IP协议基于下一跳的机制

IP是端点间,mac地址是结点间

交换机学习ARP协议

arp -an

交换机接同一网络,路由器接设备

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_07

添加host和网关



route add -host *.*.*.* gw *.*.*.*


同一网关,ip地址不能重复出现

lvs(4层)hold流量,nginx(7层)hold握手,然后转到tomcat做具体计算

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_08

socket是四层,是对网络的一种封装,规范的接口

CIP 客户端地址,VIP 监听端口地址,DIP lvs调度,RIP真实服务器

  • client ip
  • vitrual ip
  • director ip
  • real ip

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_09

如果数据包中没有RIP,数据包会被丢弃

网络协议原理和lvs三种模型,调度算法和keepalived_调度算法_10

NAT模型(端口映射)

SNAT,Source nat

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_11

DNat,Destination nat (非对称)

带宽成为瓶颈,消耗算力

网络协议原理和lvs三种模型,调度算法和keepalived_客户端_12

TUN模型(tunnel)(VPN,FQ)

数据包包裹着数据包

DIP->RIP,触发跳跃,然后把外面的包撕掉,然后继续处理直接返回

可以解决物理位置限制问题

网络协议原理和lvs三种模型,调度算法和keepalived_权值_13

隐藏VIP方法:对外隐藏,对内可见

网络协议原理和lvs三种模型,调度算法和keepalived_权值_14

ifconfig

enp0s3,物理网卡

lo,虚拟网卡

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_15

网络协议原理和lvs三种模型,调度算法和keepalived_调度算法_16

lvs调度算法

静态调度

轮询调度 RR

轮询调度(Round Robin 简称'RR')算法就是按依次循环的方式将请求调度到不同的服务器上

  • 该算法最大的特点就是实现简单
  • 轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器

加权轮询调度 WRR

加权轮询(Weight Round Robin 简称'WRR')算法主要是对轮询算法的一种优化与补充

  • LVS会考虑每台服务器的性能,并给每台服务器添加一个权值
  • 如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍
  • 权值越高的服务器,处理的请求越多

目标地址散列调度

目标地址散列调度(Destination Hashing 简称'DH')算法先根据请求的目标IP地址

  • 作为散列键(Hash Key)从静态分配的散列表找出对应的服务器
  • 若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空

源地址散列调度U

源地址散列调度(Source Hashing  简称'SH')算法先根据请求的源IP地址

  • 作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空
  • 它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似

动态调度

最小连接调度 LC(具有偷窥能力)

最小连接调度(Least Connections 简称'LC')算法是把新的连接请求分配到当前连接数最小的服务器

  • 最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况
  • 调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1
  • 集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载

加权最小连接调度 WLC

加权最少连接(Weight Least Connections 简称'WLC')算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能

  • 服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值
  • 加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例
  • 调度器可以自动问询真实服务器的负载情况,并动态地调整其权值

基于局部的最少连接 LBLC

基于局部的最少连接调度(Locality-Based Least Connections 简称'LBLC')算法是针对请求报文的目标IP地址的负载均衡调度

  • 目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的
  • 这里假设任何后端服务器都可以处理任一请求
  • 算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器
  • 提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力
  • LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器
  • 若该服务器是可用的且没有超载,将请求发送到该服务器
  • 若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用'最少连接'的原则选出一个可用的服务器,将请求发送到服务器

带复制的基于局部性的最少连接

带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication  简称'LBLCR')算法也是针对目标IP地址的负载均衡

  • 目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射
  • LBLC算法维护从一个目标IP地址到一台服务器的映射
  • 按'最小连接'原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器
  • 若服务器超载,则按'最小连接'原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器
  • 同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度

最短的期望的延迟

最短的期望的延迟调度(Shortest Expected Delay 简称'SED')算法基于WLC算法

  • 举个例子吧,ABC三台服务器的权重分别为1、2、3
  • 那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个
  • 使用SED算法后会进行一个运算
  • A:(1+1)/1=2   B:(1+2)/2=3/2   C:(1+3)/3=4/3   就把请求交给得出运算结果最小的服务器

最少队列调度

最少队列调度(Never Queue 简称'NQ')算法,无需队列

  • 如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算

lvs负载均衡内核模块ipvs

装一个壳子来使用这个内核



yum install ipvsadm -y


ubuntu用 apt-get install 指令

管理集群服务

ipvsadm --help



Usage:
ipvsadm -A|E virtual-service [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]
ipvsadm -D virtual-service
ipvsadm -C
ipvsadm -R
ipvsadm -S [-n]
ipvsadm -a|e virtual-service -r server-address [options]
ipvsadm -d virtual-service -r server-address
ipvsadm -L|l [virtual-service] [options]
ipvsadm -Z [virtual-service]
ipvsadm --set tcp tcpfin udp
ipvsadm --start-daemon state [--mcast-interface interface] [--syncid sid]
ipvsadm --stop-daemon state
ipvsadm -h

Commands:
Either long or short options are allowed.
--add-service -A add virtual service with options
--edit-service -E edit virtual service with options
--delete-service -D delete virtual service
--clear -C clear the whole table
--restore -R restore rules from stdin
--save -S save rules to stdout
--add-server -a add real server with options
--edit-server -e edit real server with options
--delete-server -d delete real server
--list -L|-l list the table
--zero -Z zero counters in a service or all services
--set tcp tcpfin udp set connection timeout values
--start-daemon start connection sync daemon
--stop-daemon stop connection sync daemon
--help -h display this help message

virtual-service:
--tcp-service|-t service-address service-address is host[:port]
--udp-service|-u service-address service-address is host[:port]
--sctp-service service-address service-address is host[:port]
--fwmark-service|-f fwmark fwmark is an integer greater than zero

Options:
--ipv6 -6 fwmark entry uses IPv6
--scheduler -s scheduler one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,
the default scheduler is wlc.
--pe engine alternate persistence engine may be sip,
not set by default.
--persistent -p [timeout] persistent service
--netmask -M netmask persistent granularity mask
--real-server -r server-address server-address is host (and port)
--gatewaying -g gatewaying (direct routing) (default)
--ipip -i ipip encapsulation (tunneling)
--masquerading -m masquerading (NAT)
--weight -w weight capacity of real server
--u-threshold -x uthreshold upper threshold of connections
--l-threshold -y lthreshold lower threshold of connections
--mcast-interface interface multicast interface for connection sync
--syncid sid syncid for connection sync (default=255)
--connection -c output of current IPVS connections
--timeout output of timeout (tcp tcpfin udp)
--daemon output of daemon information
--stats output of statistics information
--rate output of rate information
--exact expand numbers (display exact values)
--thresholds output of thresholds information
--persistent-conn output of persistent connection info
--nosort disable sorting output of service/server entries
--sort does nothing, for backwards compatibility
--ops -o one-packet scheduling
--numeric -n numeric output of addresses and ports
--sched-flags -b flags scheduler flags (comma-separated)


添加



-A -t|u|f service-address [-s scheduler]
-t: TCP
-U: UDP
service-address: IP:PORT
-f: FWM: 防火墙标记
service-address: Mark Number
修改: E
删除: -D -t|u|f service-address

ipvsadm -A -t 192.18.1.1:80 -s rr


管理集群中的RS

网络协议原理和lvs三种模型,调度算法和keepalived_调度算法_17

网络协议原理和lvs三种模型,调度算法和keepalived_服务器_18

DR模型

direct routing

网络协议原理和lvs三种模型,调度算法和keepalived_调度算法_19

设置eth0的子接口



ifconfig eth0:2 192.168.150.100/24
# 或者下面这种写法
ifconfig eth0:2 192.168.150.100 netmask 255.255.255.0


/24 即 3个byte,255.255.255.0

撤销结点



ifconfig eth0:2 down


调整arp协议



cd /proc/sys/net/ipv4/conf


我的机器是ubuntu,列表如下

网络协议原理和lvs三种模型,调度算法和keepalived_ip地址_20

如果是centos,enp0s3应该是eth0

为什么要调整内核协议

参考文章:​​javascript:void(0)​

不要使用vim,使用echo重定向



echo 1 > arp_ignore
echo 2 > arp_announce


4个255,分配到不同的子网,不会产生环回

先改内核协议,改完以后配置ip



echo 1 > /proc/sys/net/ipv4/conf/eht0/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eht0/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce


设置隐藏vip



ifconfig lo:8 192.168.150.100 netmask 255.255.255.255


安装tomcat或者httpd当作RIP



yum install httpd


启动httpd



service httpd start


创建一个主页做测试



vim /var/www/html/index.html


添加内容 gogogogogogo

通过壳子使用内核管理lvs



ipvsadm -A -t 192.168.150.100:80 -s rr
ipvsadm -a -t 192.168.150.100:80 -s 192.168.150.12 -g -w 1
ipvsadm -a -t 192.168.150.100:80 -s 192.168.150.13 -g -w 1
ipvsadm -ln


验证

node01



netstat -natp


看不到socket

node02~node03



netstat -natp


看得到socket

node01,查看偷窥记录本



ipvsadm -lnc


Keepalived

为什么用keepalived

lvs会挂,业务下线,单点故障

RS会挂,一部分用户请求异常,lvs还存有这个RS的负载记录

单点故障的解决方式

  • 主备
  • 主主

ping测试的是网络层

自动运维,解决单点故障,实现HA(HIghly Available)

keepalived的好处

  • 监控自己的服务
  • Master通告自己生存状态,Backup监听Master状态,Master挂了,Backup中推举出新的Master
  • 配置VIP,添加ipvs,keepalived有配置文件

nginx也可以做负载均衡,但存在单点故障

安装keepalived



yum install keepalived -y


ubuntu下使用apt安装



apt-cache search keepalived
#keepalived - Failover and monitoring daemon for LVS clusters
apt-get install keepalived


apt安装的keepalived没有配置文件

配置的官方地址:​​https://www.keepalived.org/doc/configuration_synopsis.html​



global_defs {
notification_email {
email
email
}
notification_email_from email
smtp_server host
smtp_connect_timeout num
lvs_id string
}
virtual_server (@IP PORT)|(fwmark num) {
delay_loop num
lb_algo rr|wrr|lc|wlc|sh|dh|lblc
lb_kind NAT|DR|TUN
(nat_mask @IP)
persistence_timeout num
persistence_granularity @IP
virtualhost string
protocol TCP|UDP

sorry_server @IP PORT
real_server @IP PORT {
weight num
TCP_CHECK {
connect_port num
connect_timeout num
}
}
real_server @IP PORT {
weight num
MISC_CHECK {
misc_path /path_to_script/script.sh
(or misc_path “ /path_to_script/script.sh <arg_list>”)
}
}
}
real_server @IP PORT {
weight num
HTTP_GET|SSL_GET {
url { # You can add multiple url block
path alphanum
digest alphanum
}
connect_port num
connect_timeout num
retry num
delay_before_retry num
}
}
vrrp_sync_group string {
group {
string
string
}
notify_master /path_to_script/script_master.sh
(or notify_master “ /path_to_script/script_master.sh <arg_list>”)
notify_backup /path_to_script/script_backup.sh
(or notify_backup “/path_to_script/script_backup.sh <arg_list>”)
notify_fault /path_to_script/script_fault.sh
(or notify_fault “ /path_to_script/script_fault.sh <arg_list>”)
}
vrrp_instance string {
state MASTER|BACKUP
interface string
mcast_src_ip @IP
lvs_sync_daemon_interface string
virtual_router_id num
priority num
advert_int num
smtp_alert
authentication {
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { # Block limited to 20 IP addresses
@IP
@IP
@IP
}
virtual_ipaddress_excluded { # Unlimited IP addresses
@IP
@IP
@IP
}
notify_master /path_to_script/script_master.sh
(or notify_master “ /path_to_script/script_master.sh <arg_list>”)
notify_backup /path_to_script/script_backup.sh
(or notify_backup “ /path_to_script/script_backup.sh <arg_list>”)
notify_fault /path_to_script/script_fault.sh
(or notify_fault “ /path_to_script/script_fault.sh <arg_list>”)
}


也可以使用man帮助指令



man 5 keepalived.conf


网络协议原理和lvs三种模型,调度算法和keepalived_调度算法_21

vrrp,虚拟冗余协议

node1配置



vrrp_instance VI_1{
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
192.168.150.100/24 dev eth0 label eht0:3
}
}
# VIP
virtual_server 192.168.150.100 80{
lb_algo rr # loadbanlance 调度算法
lb_kind DR # loadbanlance 调度算法类型
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP

real_server 192.168.150.12 80{
weight 1
HTTP_GET{
url {
path /
status_code 200
}
conect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.150.13 80{
weight 1
HTTP_GET{
url {
path /
status_code 200
}
conect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}


node4配置

修改state和priority



vrrp_instance VI_1{
state BACKUP
interface eth0
virtual_router_id 51
priority 50
advert_int 1
authentication{
auth_type PASS
auth_pass 1111
}
virtual_ipaddress{
192.168.150.100/24 dev eth0 label eht0:3
}
}
# VIP
virtual_server 192.168.150.100 80{
lb_algo rr # loadbanlance 调度算法
lb_kind DR # loadbanlance 调度算法类型
nat_mask 255.255.255.0
persistence_timeout 0
protocol TCP

real_server 192.168.150.12 80{
weight 1
HTTP_GET{
url {
path /
status_code 200
}
conect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}

real_server 192.168.150.13 80{
weight 1
HTTP_GET{
url {
path /
status_code 200
}
conect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}


启动keepalived



service keepalived start


node4不会有VIP,但会配置内核模块

主挂掉以后,backup会变成主,主修复好后,主会把从抢走,keepalived不存在数据同步问题,所以主从切换消耗低,不需要考量切换主从的成本

RIP挂掉后会自动清出列表,起来后自动加入列表

查看keepalived进程



ps -fe | grep keepalived


网络协议原理和lvs三种模型,调度算法和keepalived_服务器_22

kill -9杀死所有进程

MASTER会死掉,backup会出现VIP,导致数据包混乱,所以需要zookeeper


论读书


睁开眼,书在面前 闭上眼,书在心里