关于这方面的文章网上一大堆,但是大部分都是写keepalived的配置问题,并没有说明白原理方面的东西,如果配置上稍微有点问题,都不知道问题出在什么地方,下面我写下keepalived的常用配置以及lvs的原理、负责均衡的工作原理。
1.keepalived和lvs是干什么的
2.lvs的几种常见的模式(读懂这一部分需要有TCP封包的基础知识)
DR模式(Direct Routing)【这个模式比较常用】
(1)基本工作原理
(2)注意事项:
(1)基本原理:
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)基本原理:
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)基本原理:
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地址到本机要不然直接就将封包丢弃了)3.keepalived常用配置和说明
keepalived的配置全都在keepalived.conf的配置文件中;#全局定义块 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 <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 nb_get_retry num delay_before_retry num } } }
4.答疑:
1)为什么windows的真实主机需要配置IP地址为VIP的环回适配器?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