关于这方面的文章网上一大堆,但是大部分都是写keepalived的配置问题,并没有说明白原理方面的东西,如果配置上稍微有点问题,都不知道问题出在什么地方,下面我写下keepalived的常用配置以及lvs的原理、负责均衡的工作原理。
DR模式(Direct Routing)【这个模式比较常用】
1)client发送请求【package】到VIP;
2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,将收到 package的dest ip地址修改为realserver的ip地址;
3)realserver收到这个package之后,判断这个dest ip是本机ip就处理这个请求,然后将请求的结果发送到VIP;
4)VIP收到请求结果之后将请求结果的dest ip改为client ip,将src ip改为VIP;
FULL NAT模式:
1)client发送请求【package】到VIP;
2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,将收到 package的dest ip地址修改为realserver的ip地址,将src ip修改为VIP的ip地址;
3)realserver收到这个package之后,判断是发送给自己的,然后就处理这个请求,将请求的结果发送到VIP上面;
4)VIP收到请求结果之后将请求结果的src ip修改为VIP的ip地址,将dest ip修改为clien的ip地址;
IP TUNNEL模式:
1)client发送请求【package】到VIP;
2)VIP收到请求之后会根据lvs设置的LB算法选择一个比较合理的realserver,VIP会将收到的package重新包装到一个新的ip包里面,新的dest ip是realserver的ip地址;
3)realserver收到package之后,判断dest ip是本机,于是处理package,然后发现里面那层package的dest ip是VIP然后判断是不是本机(这里还是需要绑定VIP的ip地址到本机要不然直接就将封包丢弃了)#全局定义块
global_defs {
# 邮件通知配置
notification_email {
email1
email2
}#这个括号里面的内容是服务器故障的通知对象
notification_email_from email #指定发件人
smtp_server host #指定smtp服务器地址
smtp_connect_timeout num #制定smtp服务器链接超时
lvs_id string
router_id string ## 标识本节点的字条串,通常为hostname
}
#VRRP 实例定义块
vrrp_sync_group string {
group {
string
string
}
}
vrrp_instance string {
state MASTER|BACKUP #指定该keepalived的初始状态
virtual_router_id num
interface string #vrrp实例绑定的接口
mcast_src_ip @IP #指定发送组播数据包的源IP地址。默认是绑定VRRP实例的接口的主IP地址。
priority num #指定优先级,优先级高的将成为MASTER。
advert_int num #指定发送VRRP通告的间隔。单位是秒。
nopreempt #设置为不抢占。默认是抢占的,当高优先级的机器恢复后,会抢占低优先级的机器成为MASTER,而不抢占,则允许低优先级的机器继续成为MASTER,即使高优先级的机器已经上线。如果要使用这个功能,则初始化状态必须为BACKUP。
smtp_alert
authentication {
auth_type PASS|AH
auth_pass string
}
virtual_ipaddress { # Block limited to 20 IP addresses @IP
@IP #这里填写VIP服务器的对外的IP地址
@IP
}
}
#虚拟服务器定义块
virtual_server (@IP PORT)|(fwmark num) {
delay_loop num #健康检查的时间间隔。
lb_algo rr|wrr|lc|wlc|sh|dh|lblc #LVS调度算法。
lb_kind NAT|DR|TUN #lvs工作模式,具体的原理见上面
persistence_timeout num #持久化超时时间,单位是秒。默认是6分钟。
protocol TCP|UDP #4层协议。
real_server @IP PORT {
weight num #给服务器指定权重。默认是1.
notify_down /path/script.sh #当服务器健康检查失败时,执行的脚本。
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 ”)
}
}
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
nb_get_retry num
delay_before_retry num
}
}
}
netsh interface ipv4 set interface "realserver网络接口名称" weakhostreceive=enabled
netsh interface ipv4 set interface "realserver网络接口名称" weakhostsend=enabled
netsh interface ipv4 set interface "环回网络接口名称" weakhostreceive=enabled
netsh interface ipv4 set interface "环回网络接口名称" weakhostsend=enabled