|
5.安装配置keepalived
Keepalived 是运行在 lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换 FailOver.lvs 结合 keepalived,就实现了 3 层、4 层、5/7 层交换的功能。下面进行LVS第二种用法,LVS+keepalived。其中ipvsadm的安装及验证同本文第4.2章节(这种方式不需要配置Director Server),Real Server的配置及验证同本文第4.4章节
*所有Director Server需要安装keepalived(已经安装了ipvsadm的主机)
5.1 准备工作
地址规划:与第一种方式类似。
服务器名
| IP地址
| 网关
| 虚拟设备名
| 虚拟IP
| Director Server:主
| 192.168.98.75
| 192.168.98.1
| eth0
| 192.168.98.77
| Director Server:备
| 192.168.98.118
| 192.168.98.1
| eth0
| 192.168.98.77
| Real Server 1
| 192.168.98.74
| 192.168.98.1
| lo:0
| 192.168.98.77
| Real Server 2
| 192.168.98.117
| 192.168.98.1
| lo:0
| 192.168.98.77
| Real Server n
| …
| …
| ..
| ..
| 5.2 安装keepalived
1. 解压keepalived-1.1.17.tar.gz软件包:
[iyunv@localhost ~]# tar zxvf keepalived-1.1.17.tar.gz
2. 切换目录:
[iyunv@localhost ~]# cd keepalived-1.1.17
3. 配置configure
[iyunv@localhost ~]# ./configure –prefix=/usr/local/keepalived
因为 keepalived 运行在 ipvs 之上,因此这两个软件一定要安装在一个系统里面。如果 configure 操作能正常进行,运行完毕后将有如下的汇总输出:
Keepalived configuration
------------------------
Keepalived version : 1.1.17
Compiler : gcc
Compiler flags : -g -O2
Extra Lib : -lpopt -lssl -lcrypto
Use IPVS Framework : Yes
IPVS sync daemon support : Yes
Use VRRP Framework : Yes
Use LinkWatch : No
Use Debug flags : No
| 4. 编译安装
[iyunv@localhost ~]# make
[iyunv@localhost ~]# make install
5.2.1 安装keepalived验证
Keepalived 安装完成后,会在安装目录/usr/local/keepalived 生成 bin,etc,sbin,share 这 4 个目录。其中 etc 为配置文件所在的目录,进入这个目录,看看里面都有些什么?
[iyunv@ localhost ~]# cd /usr/local/keepalived/etc/
[iyunv@ localhost etc]# ll
total 24
drwxr-xr-x 3 root root 4096 May 30 15:24 keepalived
drwxr-xr-x 3 root root 4096 May 30 15:24 rc.d
drwxr-xr-x 2 root root 4096 May 30 15:24 sysconfig
| 还有子目录,这里着重关注一下 keepalived 目录,它的下面包含一个完整的配置文件keepalived.conf(实际上是一个样例)以及一些单独的配置样例文件。
[iyunv@ localhost etc]# cd keepalived/
[iyunv@ localhost keepalived]# ll
total 16
-rw-r--r-- 1 root root 3562 May 30 15:24 keepalived.conf
drwxr-xr-x 2 root root 4096 May 30 15:24 samples
[iyunv@ localhost keepalived]# tree -l
.
|-- keepalived.conf
`-- samples
|-- client.pem
|-- dh1024.pem
|-- keepalived.conf.HTTP_GET.port
|-- keepalived.conf.SMTP_CHECK
|-- keepalived.conf.SSL_GET
|-- keepalived.conf.fwmark
|-- keepalived.conf.inhibit
|-- keepalived.conf.misc_check
|-- keepalived.conf.misc_check_arg
|-- keepalived.conf.quorum
|-- keepalived.conf.sample
|-- keepalived.conf.status_code
|-- keepalived.conf.track_interface
|-- keepalived.conf.virtual_server_group
|-- keepalived.conf.virtualhost
|-- keepalived.conf.vrrp
|-- keepalived.conf.vrrp.localcheck
|-- keepalived.conf.vrrp.lvs_syncd
|-- keepalived.conf.vrrp.routes
|-- keepalived.conf.vrrp.scripts
|-- keepalived.conf.vrrp.static_ipaddress
|-- keepalived.conf.vrrp.sync
|-- root.pem
`-- sample.misccheck.smbcheck.sh
1 directory, 25 files
| 5.3 配置keepalived
5.3.1 开启路由转发功能
首先开启路由转发功能:
[iyunv@ localhost ~]#echo "1">/proc/sys/net/ipv4/ip_forward
5.3.2 keepalived.conf配置
主服务器的配置文件:
/usr/local/keepalive/etc/keepalived/keepalived.conf
#global define
global_defs {
router_id LVS_TEST_1 #本服务器的名称,备份组内唯一
}
############################################
# vvrp_instance define #
############################################
vrrp_instance DR_CACHE { #VRRP热备实例名
state MASTER #热备状态,MASTER(主);BACKUP(备份)
interface eth0 #承载VIP地址的物理接口
lvs_sync_daemon_inteface eth0 #负载均衡器之间的监控接口(DR模式中同interface)
virtual_router_id 51 #虚拟路由器的ID号,组内保存一致
priority 180 #优先级,数值越大优先级越高,MASTER应该高于BACKUP
advert_int 5 #主备之间的通告间隔秒数(心跳频率)
authentication { #认证信息,每个热备组保持一致
auth_type PASS #认证类型,主备切换时的验证
auth_pass 123 #密码字串
}
virtual_ipaddress { #指定虚拟地址(VIP),可以有多个
192.168.98.77
}
}
#############################################
# virtual machine setting #
#############################################
# setting port 2200 forward
virtual_server 192.168.98.77 2200 { #虚拟服务器地址(VIP)、端口,中间用空格隔开
delay_loop 6 #健康检查的间隔时间(秒)
lb_algo wlc #lvs 调度算法,这里使用加权最少链接
lb_kind DR #lvs 负载均衡机制,这里使用直连路由
persistence_timeout 20 #同一IP连接20秒内被分配到同一台服务器(会话保持时间)
protocol TCP #用 TCP 协议检查 realserver 状态
real_server 192.168.98.74 2200 { #第一个real server节点的地址、端口
weight 100 #权重
TCP_CHECK { #健康检查方式
connect_timeout 3 #故障重试秒数(即连接超时)
nb_get_retry 3 #重试延迟(即重试次数)
delay_before_retry 3 #重试间隔(秒)
connect_port 2200 #检查的目标端口
}
}
real_server 192.168.98.117 2200 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 2200
}
}
}
| 备用服务器配置文件:
/usr/local/keepalive/etc/keepalived/keepalived.conf
#global define
global_defs {
router_id LVS_TEST_2
}
################################################################
# vvrp_instance define #
################################################################
vrrp_instance DR_CACHE {
state BACKUP
interface eth0
lvs_sync_daemon_inteface eth0
virtual_router_id 51
priority 150
advert_int 5
authentication {
auth_type PASS
auth_pass 123
}
virtual_ipaddress {
192.168.98.77
}
}
##############################################################
# virtual machine setting #
##############################################################
# setting port 2200 forward
virtual_server 192.168.98.77 2200 {
delay_loop 6
lb_algo wlc
lb_kind DR
persistence_timeout 20
protocol TCP
real_server 192.168.98.74 2200 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 2200
}
}
real_server 192.168.98.117 2200 {
weight 100
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 2200
}
}
}
| 主负载均衡器(MASTER) 与备份负载均衡器(BACKUP)配置文件的差异一共只有 3 处: 全局定义的 route_id、vrrp_instance的state 以及vrrp_instance 的优先级 priority。
5.3.3 将keepalived配置成系统服务
[iyunv@localhost ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
[iyunv@localhost ~]# cp /usr/local/keepalived /etc/sysconfig/keepalived /etc/sysconfig/
[iyunv@localhost ~]# mkdir /etc/keepalived/
[iyunv@localhost ~]# cp /usr/local/keepalived /etc/keepalived/keepalived.conf /etc/keepalived/
[iyunv@localhost ~]# cp /usr/local/keepalived /sbin/keepalived /usr/sbin/
| [iyunv@localhost ~]# service keepalived start | stop
启动或者停止keepalived服务。
通过以下命令将keepalived配置成随系统启动的服务(两个运行级别)
[iyunv@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc3.d/S98keepalived
[iyunv@localhost ~]# ln -s /etc/init.d/keepalived /etc/rc.d/rc5.d/S98keepalived
5.3.4 配置验证
启动服务后,使用以下命令,在主备服务器上查看ip地址情况
[iyunv@ localhost ~]# ip addr
可以看到主服务器的eth0网卡多了个ip,就是我们刚才配置的虚拟ip,而备用服务器上的还没有,因为他是备用的嘛。
主
| 备
| 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:91:43:e4 brd ff:ff:ff:ff:ff:ff
inet 192.168.98.75/24 brd 192.168.98.255 scope global eth0
inet 192.168.98.77/32 scope global eth0
| 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:50:56:91:14:81 brd ff:ff:ff:ff:ff:ff
inet 192.168.98.118/24 brd 192.168.98.255 scope global eth0
inet6 fe80::250:56ff:fe91:1481/64 scope link
| 在主服务器上执行命令
[iyunv@ localhost ~]# service keepalived stop
再次查看ip地址情况。就可以看到主服务器上的虚拟ip没了,而备用服务器上多个了虚拟ip。
然后访问192.168.98.77的2200端口(可以telnet),
然后使用以下命令查看
[iyunv@ localhost ~]# ipvsadm
查看tcp连接情况。
[iyunv@localhosst etc]# ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.98.77:2200 wlc persistent 20
-> 192.168.98.117: 2200 Route 100 0 6
-> 192.168.98.74: 2200 Route 100 0 0
| [iyunv@ localhost ~]# ipvsadm –lcn
查看测试机的请求被转发到哪个服务器。
[iyunv@localhost etc]# ipvsadm -lcn
IPVS connection entries
pro expire state source virtual destination
TCP 14:16 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200
TCP 14:16 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200
TCP 00:36 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200
TCP 14:16 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200
TCP 14:16 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200
TCP 14:16 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200
TCP 14:16 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200
| [iyunv@ localhost ~]# ipvsadm –lcn|grep 192.168.98.117
查看某真实服务器被转方法情况
[iyunv@netscan etc]# ipvsadm -lcn |grep 192.168.98.117
TCP 14:56 ESTABLISHED 192.168.10.176:53564 192.168.98.77:2200 192.168.98.117:2200
TCP 14:56 ESTABLISHED 192.168.10.176:53563 192.168.98.77:2200 192.168.98.117:2200 TCP 00:16 NONE 192.168.10.176:0 192.168.98.77:2200 192.168.98.117:2200
TCP 14:56 ESTABLISHED 192.168.10.176:53562 192.168.98.77:2200 192.168.98.117:2200
TCP 14:56 ESTABLISHED 192.168.10.176:53559 192.168.98.77:2200 192.168.98.117:2200
TCP 14:56 ESTABLISHED 192.168.10.176:53561 192.168.98.77:2200 192.168.98.117:2200
TCP 14:56 ESTABLISHED 192.168.10.176:53560 192.168.98.77:2200 192.168.98.117:2200
| 6 附录:配置说明
6.1 主机规划说明
本例规划中使用了4台主机,其实Director Server和Real Server可以是同一台主机。做法中需要注意的是,Director Server:主作为其中之一的Real Server时不必要做Real Server配置,即不需要执行lvsRS*.sh。
6.2 Real server 配置说明
1、 vip(virtual ip)。直接路由模式的 vip 必须跟服务器对外提供服务的 ip 地址在同一个网段,并且 lvs 负载均衡器和其他所有提供相同功能的服务器都使用这个 vip.
2、 vip 被绑定在环回接口 lo0:0 上,其广播地址是其本身,子网掩码是 255.255.255.255。这与标准的网络地址设置有很大的不同。采用这种可变长掩码方式把网段划分成只含一个主机地址的目的是避免 ip 地址冲突。
3、 echo “1”,echo “2” 这段的作用是抑制 arp 广播。如果不做 arp 抑制,将会有众多的机器向其他发arp包宣称自己是真的,这样就乱套了。
6.3 Keepalived.conf 配置说明
说明:一个功能比较完整的 keepalived 的配置文件,其配置文件 keepalived.conf 可以包含三个文本块:全局定义块、 VRRP 实例定义块及虚拟服务器定义块。全局定义块和虚拟服务器定义块是必须的,如果在只有一个负载均衡器的场合,就不须 VRRP 实例定义块。主服务器和备用服务器上安装ipvsadm和keepalived的方法都一样,主要的差别在于配置文件keepalived.conf上。
● 全局定义块
global_defs {
notification_email {
test@sina.com #故障接受联系人
}
notification_email_from admin@test.com #故障发送人
smtp_server 127.0.0.1 #本机发送邮件
smtp_connect_timeout 30
router_id LVS_MASTER #BACKUP上修改为LVS_BACKUP
}
| 可以添加通过邮件通知故障,本例中没有配置
1、 email 通知。作用:有故障,发邮件报警。这是可选项目,建议不用,用 nagios 全面监控代替之。
2、 花括号“{}”。用来分隔定义块,因此必须成对出现。如果写漏了,keepalived 运行时,不会得到预期的结果。由于定义块内存在嵌套关系,因此很容易遗漏结尾处的花括号,这点要特别注意。
● VRRP 定义块
1、 同步 vrrp 组 vrrp_sync_group。作用:确定失败切换(FailOver)包含的路由实例个数。即在有 2 个负载均衡器的场景,一旦某个负载均衡器失效,需要自动切换到另外一个负载均衡器的实例是哪些?
2、 实例组 group.至少包含一个 vrrp 实例。
3、 vrrp 实例 vrrp_instance.实例名出自实例组 group 所包含的那些名字。
(1) 实例状态 state.只有 MASTER 和 BACKUP 两种状态,并且需要大写这些单词。其中MASTER 为工作状态,BACKUP 为备用状态。当 MASTER 所在的服务器失效时,BACKUP 所在的系统会自动把它的状态有 BACKUP 变换成 MASTER;当失效的MASTER 所在的系统恢复时,BACKUP 从 MASTER 恢复到 BACKUP 状态。
(2) 通信接口 interface。对外提供服务的网络接口,如 eth0,eth1.当前主流的服务器都有2 个或 2 个以上的接口,在选择服务接口时,一定要核实清楚。
(3) lvs_sync_daemon_inteface。负载均衡器之间的监控接口。在 DR 模式中,lvs_sync_daemon_inteface 与服务接口 interface 使用同一个网络接口。
(4) 虚拟路由标识 virtual_router_id.这个标识是一个数字,并且同一个 vrrp 实例使用唯一的标识。即同一个 vrrp_stance,MASTER 和 BACKUP 的 virtual_router_id 是一致的,同时在整个 vrrp 内是唯一的。
(5) 优先级 priority.这是一个数字,数值愈大,优先级越高。在同一个 vrrp_instance里,MASTER 的优先级高于 BACKUP。若 MASTER 的 priority 值为 150,那么 BACKUP的 priority 只能是 140 或更小的数值。
(6) 同步通知间隔 advert_int.MASTER 与 BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
(7) 验证 authentication。包含验证类型和验证密码。类型主要有 PASS、AH 两种,通常使用的类型为 PASS,据说 AH 使用时有问题。验证密码为明文,同一 vrrp 实例MASTER 与 BACKUP 使用相同的密码才能正常通信。
4、 虚拟 ip 地址 virtual_ipaddress . 可以有多个地址,每个地址占一行,不需要指定子网掩码。注意:这个 ip 必须与我们在 lvs 客户端(real server)设定的 vip 相一致!
● 虚拟服务器 virtual_server 定义块
虚拟服务器定义是 keepalived 框架最重要的项目了,是 keepalived.conf 必不可少的部分。
1、 虚拟服务器 virtual_server. 这个 ip 来自于 vrrp 定义块的第“4”步,后面一个空格,然后加上端口号。定义一个 vip,可以实现多个 tcp 端口的负载均衡功能。
(1) delay_loop。健康检查时间间隔,单位是秒。
(2) lb_algo. 负载均衡调度算法,互联网应用常使用 wlc 或 rr。
(3) lb_kind. 负载均衡转发规则。一般包括 DR,NAT,TUN3 种,此处使用DR 的方式。
(4) persistence_timeout.会话保持时间,单位是秒。这个选项对动态网站很有用处:当用户从远程用帐号进行登陆网站时,有了这个会话保持功能,就能把用户的请求转发给同一个应用服务器。在这里,我们来做一个假设,假定现在有一个 lvs 环境,使用 DR 转发模式,真实服务器有 3 个,负载均衡器不启用会话保持功能。当用户第一次访问的时候,他的访问请求被负载均衡器转给某个真实服务器,这样他看到一个登陆页面,第一次访问完毕;接着他在登陆框填写用户名和密码,然后提交;这时候,问题就可能出现了—登陆不能成功。因为没有会话保持,负载均衡器可能会把第 2 次的请求转发到其他的服务器。
(5) 转发协议 protocol.一般有 tcp 和 udp 两种。
2、 真实服务器 real_server.也即服务器池。 Real_server 的值包括 ip 地址和端口号。
(1) 权重 weight.权重值是一个数字,数值越大,权重越高。使用不同的权重值的目的在于为不同性能的机器分配不同的负载,性能较好的机器,负载分担大些;反之,性能差的机器,则分担较少的负载,这样就可以合理的利用不同性能的机器资源。
(2) Tcp 检查 tcp_check。
参考资料:
http://www.keepalived.org/pdf/sery-lvs-cluster.pdf
http://www.cnblogs.com/mchina/archive/2012/08/27/2644391.html
http://blog.iyunv.com/tag-lvs%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE.html
http://www.keepalived.org/documentation.html |
|
|