lvs
lvs的主要用处是四层负载均衡。 vip:虚拟ip,路由服务或者真实服务器都可以配置。 failover:故障转移,可以通过arp协议修改路由配置 ipvs:内核模块,lvs的内核实现,属于netfilter模块的子模块 ipvs table:使用ipvsadm更新或删除集群成员。使用调度算法需要和ipvs table配合选择路由。ipvs table记录着每个连接的路由。
调度算法
轮询 加权轮询 最少连接 加权最少连接(默认算法) 基于局部性的最少连接(用于cache服务,连接建立后不想变动,或者缓存就浪费了) 带复制的基于局部性的最少连接(也是cache服务,不过是副本集的cache服务) 目的地址哈希(需要查询静态哈希表中的目的ip地址) 源地址哈希(需要查询静态哈希表中的源ip地址) 最短期望延迟 never queue overflow-connection
服务掉线重连问题
连接变成0,可能会使所有新连接转发到这台服务,使这台服务短时间内承受很大压力。 解决方法:可以设置掉线的服务器为静默服务。
路由模式
nat模式(网络地址转换):需要两张物理网卡设备,将请求报文的地址替换成自己的面向内网的网卡ip,这个过程又称为ip伪装。流进和流出的数据报文都需要经过nat路由,容易有瓶颈。
dr模式(直接路由):就相当于一个路由器,只是路由的地址是可以负载均衡的。流出的数据报文可以走其他路由器。 dr模式的问题:路由的地址要怎么发给多台服务器中的一个,解决方法就是把多台服务器vip设置成一样,但是有相同vip的机子都会处理arp请求并给出自己的响应,所以需要把服务器的vip设置到lo回环设备上,然后设置忽略arp请求并且关闭lo网卡的arp_announce。由于源地址是cip目的地址是vip,需要从lo网卡发出去,需要设置一条路由规则,将lo网卡经由eth0转发出去。(arp一般15分钟请求一次更新mac/ip列表)
持久化数据和防火墙标记
持久化数据:每个连接断开都不会马上将记录删除,而是维护一个定时器。 防火墙标记:使用防火墙能标志更详细的信息包括协议,端口,并且效率更高。
一主一从架构
源码解析
1.模块注册函数 ip_vs_init 2.注册子系统 register_pernet_subsys,关键结构体 ipvs_core_ops 3.__ip_vs_init初始ipvs的netns内存空间,并注册hook: nf_register_net_hooks(ip_vs_ops),插入到ip层的hook处理函数的链表头 4.在包经过filtering,forward处理后,执行hook函数 ip_vs_ops->ip_vs_remote_request4 5.执行ip_vs_in处理包。 6.ip_vs_try_to_schedule->conn_schedule处理负载均衡算法 7.tcp执行tcp_conn_schedule->ip_vs_schedule->schedule 8.如果是rr算法,执行 ip_vs_rr_schedule得出目的地址ip_vs_dest。
keepalived
依赖lvs实现负载均衡
进程模型
1.父进程负责创建和监控子进程 2.三个子进程: 一个负责VRRP协议框架 一个负责健康检测和ipvs配置 一个负责bfd(检测两点网络故障)
使用到的内核组件
1.lvs框架:使用getsockopt和setsockopt来获取设置socket 2.netfilter框架:ipvs代码支持nat和伪装 3.netlink接口:网络接口设置和移除vrrp的虚拟ip 4.多播:可根据vrrp多播组进行多播
架构图
1.io多路复用使用epoll处理调度(thread_make_master启动该master线程)
2.核心组件 通用全局库:html parsing,链表,定时器,vector,string formating,buffer dump,网络工具,监控管理,pid handling,底层tcp L4
checkers:管理真实服务,可添加移除或者改变权重。还包括健康检查,检查结果会决定添加或者移除或者改变权重真实服务器,操作到lvs拓扑中。checkers使用多线程的有限状态机来实现。
vrrp栈(虚拟路由冗余协议栈):独立进程运行,不依赖于lvs,负责直接接管操作,提供底层路由备份,实现了完整的lvs和防火墙的标准以及扩展(vrrp_sync_group扩展管理持久化路由,使用MD5 -96位算法实现ipsec-ah安全的广播交互协议)。
bsd栈:也是独立进程运行,可以被vrrp进程和checker进程作为检查真实服务状态的功能。
system call:主要用来运行自定义健康检查脚本,脚本会被一个fork出来的进程运行。
Netlink Reflector:用来设置vrrp的vip,并且进程间通信(内核到用户空间的通信)也可以使用netlink内核广播。
smtp:通知管理员的邮件协议
ipvs wrapper:使用libipvs封装
健康检查
实现了以下检查形式: TCP_CHECK,HTTP_GET,SSL_GET,MISC_CHECK(自定义脚本),SMTP_CHECK,DNS_CHECK,BFD_CHECK,UDP_CHECK,PING_CHECK,FILE_CHECK(检查文件变动)
VRRP(故障转移)
vrrp修改vip原理:使用arp广播通知刷新mac/ip列表
use_vmac:使用虚拟mac地址 vrrp_instance instance1 { state BACKUP interface eth0 virtual_router_id 250 use_vmac vmac_xmit_base # Transmit VRRP adverts over physical interface priority 150 advert_int 1 virtual_ipaddress { 10.0.0.254 } }
路由策略
NAT: Tunneling Direct Routing
|