匿名
未登录
登录
Linux78|wiki
搜索
查看“Keepalived设计与实现”的源代码
来自Linux78|wiki
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
Keepalived设计与实现
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
wiki:用户|用户
您可以查看与复制此页面的源代码。
===Keepalived设计与实现=== Keepalived是一个高度模块化设计的软件,源代码的结构似乎也很容易 看出这一点,里面只有 check core libipfwc libipvs-2.4 libipvs-2.6 vrrp [[File:keepalived-1.jpg|500}px|center|border]] core keepalived的核心程序,比如全局配置的解析,进程启动等等; vrrp Keepalived的vrrpd子进程以及相关的代码。 check keepalived的healthchecker子进程的目录,包括了所有的健康检查方 式以及对应的配置的解析,LVS的配置解析也在这个里面 libipfwc iptables(ipchains)库,主要用来配置LVS中的firewall-mark。 libipvs*也是使用LVS需要用到的。 ==== 多进程模式 ===== keepalived采用了多进程的设计模式,每个进程负责不同的功能,我们 在使用LVS的机器上通常可以看到这样的进程: Keepalived <父进程:内存管理,监控子进程 \_ Keepalived < VRRP子进程 \_ Keepalived < healthchecker子进程 有些命令行参数来控制不开启某些进程,比如不运行LVS的机器上,只开 启VRRP就可以了(-P),如果只运行healthchecker子进程,使用-C。 ==== 控制面板 ==== 所谓的控制面板就是对配置文件的编译和解析,Keepalived的配置文 件解析比较另类,并不是一次统统解析所有的配置,只在用到某模块的时 候才解析相应的配置,在每个模块里面都可以看到XXXparser.c这样的文 件,就是做这个作用的。 ==== WatchDog ==== 这种框架提供了对子进程(VRRP和healthchecker)的监控. ==== IPVS 封装 ==== Keepalived里面所有对LVS的相关操作并不直接使用ipvsadm这样的 用户端程序,而是直接使用IPVS提供的函数进程操作,这些代码都 在 check/ipwrapper.c 中。 === KeepAlived 的安装 === 安装Keepalived和安装其他开源软件一样,非常的简单,configure, make, make install就可以搞定,但是还是需要简单的说明一下这个操作过程: ./configure 一一prefix=/ \ 一一mandir=/usr/local/share/man \ 一一with-kernel-dir=/usr/src/kernels/2.6.9-67.EL-smp-i686/ make make install •说明如下: 1. prefix这个指定为/吧,这样配置文件会放到目录下,方便操作。 2. mandir这个也放到Linux系统默认的man目录下,方便查看。 3. with-kernel-dir这是个重要的参数,这个参数并不表示我们要把Keepalived编进内核,而是指使用内核源码里面的头文件,也就是include目录。 ◎如果要用到LVS,才需要这样的指定,否则是不需要的,而且如果要使用netlink,还需要link_watch.c这个文件 令注意 Use IPVS Framework IPVS框架一也即LVS的核心代码框架,如果不 使用LVS,可以在configure时指定参数disable-lvs,这样的话,这里看 到的就是No而不是Yes IPVS sync daemon support IPVS同步进程,很显然,如果前面那项 是No的话,那么这里肯定也是No,当然如果前面这项是Yes-即使 用LVS,而不想使用LVS的同步进程(sync daemon),可以在configure的 时候指定 disable-lvs-syncd。 Use VRRP Framework VRRP框架,这基本上是必须的,Keepalived的 核心进程vrrpd。 Use LinkWatch所谓的Linkwatch大概意思是通过接收内核发出的关于网 卡的状态信息来判断网卡的状态,因为是内核发出的信息,这样在用 户端只需要捕捉这些信息即可,相比直接在用户端通过其他方式来 实现看起来会更省资源,Keepalived在网卡超过20块的情况下推荐使用。 简而言之,如果不使用LVS功能,那么只要看到Use VRRP Frame¬work 为Yes就可以,反之,必须有Use IPVS Framework为Yes,其他都 是 optional 的。 安装基本就这么简单,但是你可能还有疑问,到底在哪里下载Keepalived? 直接到Keepalived 的官网下吧:www. keepalived .org === KeepAlived 配置详解 === Keepalived的所有配置都在一个配置文件里面设置,支持的配置项也比 较多。但分为三类: 1. 全局配置(Global Configuration) 2. VRRPD配置 3. LVS配置 很明显,全局配置就是对整个keepalived起效的配置,不管是否使 用LVS。VRRPD是keepalived的核心,LVS配置只在要使用keepalived来配 置和管理LVS时需要使用,如果仅使用keepalived来做HA2,LVS的配置完 全是不需要的。 配置文件都是以块(block)形式组织的,每个块都在{和}包围的范围 内。#和!开头的行都是注释。 ==== 全局配置 ==== 全局配置包括两个子配置,即所谓的:全局定义(global definition)和静 态地址路由(static ipaddress/routes) ==== 全局定义 ==== 全局定义主要设置keepalived的通知机制和标识: global_defs { notification_email { admin@example.com } notification_email_from admin@example.com smtp_server 127.0.0.1 stmp_connect_timeout 30 router_id my_hostname } • notification_email指定keepalived在发生事件(比如切换)时,需要发 送email到的对象,可以有多个,每行一个。 • smtp_*指定发送email的smtp服务器,如果本地开启了 sendmail的话, 可以使用上面的默认配置。 • route_id运行keepalived的机器的一个标识。 ==== 静态地址和路由 ==== 所谓静态(static)就是说不会随vrrpd instance的开/关而变化的,VIP就 不是static的,会随着vrrpd而添加/删除。这个配置可以用来给服务器配置 静态的IP地址/路由,当然如果服务器的配置里面已经有这些配置,这里就 不需要设置了。 static_ipaddress { 192.168.1.1/24 brd + dev eth0 scope global } static_routes { src $SRC_IP to $DST_IP dev $SRC_DEVICE src $SRC_IP to $DST_IP via $GW dev $SRC_DEVICE } 每一行设置一个IP,这些配置都是Linux下ip这个命令的参数,比如上 面的 192.168.1.1/24 brd + dev ethO scope global, keepalived最终会 直接使用ip addr add 192.168.1.1/24 brd + dev ethO scope global来添加,所 以这里的配置都要符合ip命令的规则。 这就是全局配置段的全部。 ==== VRRPD 配置 ==== VRRPD的配置也包括2部分:VRRP同步组(synchroization group )和V RRP实 例(VRRP Instance)» VRRP Sync Groups(s) 不使用Sync Group的话,如果机器(或者说router)有两个网段,一个 内网一个外网,每个网段开启一个VRRP实例,假设VRRP配置为检查内 网,那么当外网出现问题时,VRRPD认为自己仍然健康,那么不会发 送Master和Backup的切换,从而导致了问题。Sync group就是为了解决这 个问题,可以把两个实例都放进一个Sync Group,这样的话,group里面任 何一个实例出现问题都会发生切换。 vrrp_sync_group VG_1 { group { inside_network #这里是实例名(比如VI_1) outside_network } notify_master /path/to/to_master.sh notify_backup /path_to/to_backup.sh notify_fault "/path/fault.sh VG_1" notify /path/to/notify.sh smtp_alert } • notify_master指定当切换到Master时,执行的脚本,这个脚本可以传 入参数(引号引起),其他2个类推。 • notify指令有3个参数,这些参数由keepalived提供:$l(GROUP—INSTANCE),$2(group或 者 instance 的名字),$3(MASTER—BACKUP—FAULT) • smtp_alter使用globaLdefs里面定义的邮件地址和smtp服务器在切换 后发送邮件通知。 ==== VRRP 实例(ins tance)配置 ==== VRRP实例就表示在上面开启了VRRP协议,这个实例说明了VRRP的 一些特性,比如主从、VRID等等,可以在每个interface上开启一个实 例。VRRP实例配置主要定义vrrp_sync_group里面的每个组的漂移IP等。 vrrp_instance inside_network { state MASTER interface eth0 dont_track_primary track_interface { eth0 eth1 } mcast_src_ip <IPADDR> garp_master_delay 10 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS autp_pass 1234 } virtual_ipaddress { #<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPT> label <LABEL> 192.168.200.17/24 dev eth1 192.168.200.18/24 dev eth2 label eth2:1 } virtual_routes { # src <IPADDR> [to] <IPADDR>/<MASK> via|gw <IPADDR> dev <STRING> scope <SCOPE> src 192.168.100.1 to 192.168.109.0/24 via 192.168.200.254 dev eth1 192.168.110.0/24 via 192.168.200.254 dev eth1 192.168.111.0/24 dev eth2 192.168.112.0/24 via 192.168.100.254 } nopreempt preemtp_delay 300 debug } state state指定instance的初始(Initial)状态,在两台router都启动后,马上 会发生竞选,高priority的会竞选为Master,所以这里的state并不表 示这台就一直是Master。 interface inside_network实例绑定的网卡 dont_track_primary 忽略VRRP的interface错误(默认不设置) track_interface设置额外的监控,里面的任意一个网卡出现问题,都会进入FAULT状态 mcas t_src_ip发送多播包的地址,如果不设置,默认使用绑定的网卡的primary IP。 garp_master_delay 在切换到MASTER状态后,延迟进行gratuitous ARP请求 virtual_router_id VRID标记(0... 255) priority 100高优先级竞选为MASTER, MASTER要高于BACKUP至少50 advert_int检查间隔,默认Is virtual_ipaddress里面指定漂移地址(VIP),也就是切换到MASTER时, 这些IP会被添加,切换到BACKUP时,这些IP被删除(传给ipaddr 命令),所以每台服务器上可以不绑定任何虚拟地址,而都把他们 放virtuaLipaddress里面(可以多个),keepalived会自动使用ip addr进 行绑定(不需要以来ifcfg-eth0),ip add可以看到 virtual_routes和virtuaLipaddress—样,发生切换时添加/删除路由 lvs_sync_daemon_interface lvs syncd绑定的网卡 authentication这一段设置认证 auth_type认证方式,支持PASS和AH auth_pass认证的密码 nopreempt设置为不抢占,注意这个配置只能设置在state为BACKUP的 主机上,而且这个主机的priority必须比另外一台高 preempt_delay抢占延迟,默认5分钟 debug Debug级另lj notify_master 和sync group里面的配置一样。 ==== LVS配置 ==== LVS的配置也包括2部分:虚拟主机组(virtual server group)和虚拟主 机(virtual server) 0这些配置都会传递给ipvsadm作为参数。 虚拟主机组 这个配置段是可选的,目的是为了让一台RealServer上的某个service可 以属于多个Virtual Server,并且只做一次健康检查。 virtual_server_group <STRING> { # VIP port <IPADDR> <PORT> <IPADDR> <PORT> fwmark <INT> } 虚拟主机 virtuaLserver可以以下面3种方式中的任意一种配置: 1. virtuaLserver IP port 2. virtuaLserver fwmark int 3. virtuaLserver group string 如下例: virtual_server 192.168.1.2 80 { # 设置一个virtual server: VIP:Vport delay_loop 3 # service polling的delay时间 lb_algo rr|wrr|lc|wlc|lblc|sh|dh # LVS的调度算法 lb_kind NAT|DR|TUN # LVS集群模式 persistence_timeout 120 # 会话保持时间(秒) persistence_granularity <NETMASK> # LVS会话保持粒度,ipvsadm中 的-M参数,默认是Oxffffffff,即根据每个客户端做会话保持。 protocol TCP #使用的协议是TCP还是UDP ha_suspend # suspendhealthchecker's activity virtualhost <string> # HTTP_GET做健康检查时,检查的Web服务器的虚拟主机(即Host:头) sorry_server <IPADDR> <PORT> # 备用机,所有的real server失效后启用 #每台RealServer都需要一个下面的配置项 real_server <IPADDR> <PORT> { weight 1 #默认为1,0为失效 inhibit_on_failure #在服务器健康检查失败时,将其weight设置为0,而不是直接从IPVS里面删除。 notify_up <STRING> | <QUOTED-STRING> # 在检测到service up后执行的脚本 notify_down <STRING> | <QUOTED-STRING> # 在检测到service down后执行的脚本 # 下面配置任意一种健康检查方式:HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK HTTP_GET | SSL_GET { url { # HTTP/SSL检查的URL,这里可以指定多个URL path / digest <STRING> # SSL检查后的摘要信息(genhash工具算出) status_code 200 # HTTP检查的返回状态码 } connect_port 80 # 健康检查端口 #以此地址发送请求对服务器进行健康检查 bindto <IPADD> connect_timeout #连接超时时间 nb_get_retry 3 # 重连次数 delay_before_retry 2 # 重连间隔时间(秒) } # END OF HTTP_GET|SSL_GET # TCP方式的健康检查 TCP_CHECK { connect_port 80 bindto 192.168.1.1 connect_timeout 4 } # TCP_CHECK # SMTP方式健康检查 SMTP_CHECK #这里的配置意义和H TTP里面的类似 host { connect_ip <IP ADDRESS> connect_port <PORT> # 默认检查25端口 bindto <IP ADDRESS> } connect_timeout <INTEGER> retry <INTEGER> delay_before_retry <INTEGER> # "smtp HELO"请求命令的参数,可选的。 helo_name <STRING>|<QUOTED-STRING> } #SMTP_CHECK #MISC健康检查方式,执行一个程序 MISC_CHECK { #外部程序或脚本路径 misc_path <STRING>|<QUOTED-STRING> #脚本执行的超时时间 misc_timeout <INT> # 如果设置 了misc_dynamic的话,healthchecker程序 的退出状态码会用来动态调整服务器的权重(weigh t). #返回0:健康检查OK,权重不被修改 #返回1:健康检查失败,权重设为0 #返回2-255:健康检查OK,权重设置为:退出状态码-2, 比如返回255,那么weight=255-2=253 misc_dynamic } } # Realserver } # Virtual Server
返回至
Keepalived设计与实现
。
导航
导航
首页
最近更改
随机页面
栏目
Nginx
Kubernetes
Spring Cloud
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志