请教lvs +lvs keepalived 区别可以只用两台服务器吗

高可用集群技术之Keepalived实现LVS高可用并负载均衡Web服务_服务器应用_Linux公社-Linux系统门户网站
你好,游客
高可用集群技术之Keepalived实现LVS高可用并负载均衡Web服务
来源:Linux社区&
作者:gzsamlee
Keepalived概述:Keepalived的作用是检测服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器.
keepalived实现lvs高可用并负载均衡web服务:准备工作:2台keepalived节点为:
2台realserver服务为:
1、配置RSserver过程如下(\):(1)部署web服务(使用nginx配置)# yum -y install nginx-1.10.0-1.el6.ngx.x86_64.rpm
(2)禁用防火墙及主机名修改# service iptables stop # chkconfig iptables off
(3)配置路由转发及转发模块配置# echo 2 & /proc/sys/net/ipv4/conf/all/arp_announce& # echo 2 & /proc/sys/net/ipv4/conf/eth0/arp_announce # echo 1 & /proc/sys/net/ipv4/conf/eth0/arp_ignore& # echo 1 & /proc/sys/net/ipv4/conf/all/arp_ignore & --添加路由条目 # ifconfig lo:0 172.16.100.99 netmask 255.255.255.255 broadcast 172.16.100.99 up # route add -host 172.16.100.99 dev lo:0
2、配置keepalived服务器(1)安装ipvsadm负载均衡管理器
# yum -y install ipvsadm
(2)安装keepalived# yum -y install keepalived # chkconfig keepalived on
(3)配置keepalived默认初始状态如下:(主节点:master状态)# vim /etc/keepalived/keepalived.conf ! Configuration File for keepalived global_defs { &
notification_email { & &
root@localhost &
notification_email_from root@localhost& &
smtp_server 127.0.0.1& &
smtp_connect_timeout 30 &
router_id LVS_DEVEL& & & & & &
#物理路由id,一般指定为本机的hostname } vrrp_instance VI_1 {& & & & & & & & #vrrp实例配置段 & & state MASTER& & & & & & & & & & #指定keepalived服务运行状态 & & interface eth0& & & & & & & & & #指定keepalived的心跳口 & & virtual_router_id 51& & & & & & #指定虚拟路由id(1~255),同一vrrp实例的主备keepalived必须配置为一样 & & priority 101& & & & & & & & & & ##指定起始优先级,优先级高的会成为master & & advert_int 1& & & & & & & & & & #vrrp通告的发送间隔 & & authentication {& & & & & & & & #配置通过密码认证 & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & 172.16.100.99 dev eth0 label eth0:0& & #定义VIP & & } }
(4)配置keepalived默认初始状态如下:(备节点:backuo状态)# vim /etc/keepalived/keepalived.conf& ! Configuration File for keepalived & global_defs { &
notification_email { & &
root@localhost &
notification_email_from root@localhost& &
smtp_server 127.0.0.1& &
smtp_connect_timeout 30 &
router_id LVS_DEVEL } & vrrp_instance VI_1 { & & state BACKUP& & & interface eth0 & & virtual_router_id 51 & & priority 100 & & advert_int 1 & & authentication { & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & 172.16.100.99 dev eth0 label eth0:0 & & } }
(5)调用周期性检测down文件是否存在来控制keepalived服务的主备切换在keepalived.conf添加如下内容:全局配置的段下添加如下: vrrp_script chk_downfile {& & & &
#服务状态检测脚本配置段 & & script "[[ -f /etc/keepalived/down ]] && exit 1 || exit 0"& & & &
#通过周期性检测down文件是否存在来控制keepalived服务的主备切换 & & interval 1& &
#指定检测间隔为1秒 & & weight -2& &
#指定检测失败时,优先级减2;检测的成功或失败是由script后面指定的命令或脚本执行返回的状态码决定的,0表示成功,非0表示失败 } & 在vrrp_instance VI_1 ##vrrp实例配置段添加如下: track_script { & & chk_downfile& & & & & #通过指定上面定义监控脚本来监控服务状态,以完成主备切换 }
重启keepalived服务创建down文件测试:# service keepalived restart # touch /etc/keepalived/down & ---在/etc/keepalived/下建立down文件可实现主备模式切换
(6)调用外部脚本检测web(nginx)健康状态建立/etc/keepalived/chkngx.sh脚本#/bin/bash #/etc/keepalived/chkngx.sh # if pkill -0 nginx&/dev/ then& & & & [ `curl -sL -w %{http_code} http://localhost -o /dev/null` -eq 200 ] && exit 0 else& & & & service nginx start fiexit $?
授予脚本执行权限:# chmod +x /etc/keepalived/chkngx.sh
配置keepalived.conf调用外部脚本全局配置的段下添加如下: vrrp_script chkngx { & & script "/etc/keepalived/chkngx.sh"& & #指定用于检测nginx服务的执行脚本路径 & & interval 1& & & & #监测间隔 & & weight -2& & & &
#失败时,优先级减2 & & fall 3& & & & & # 指定nginx检测脚本连续执行失败次数为3,才进行Failover & & rise 3& & & & & # 指定nginx检测脚本连续执行成功次数为3,才进行Failback } & 在vrrp_instance VI_1 ##vrrp实例配置段添加如下: track_script { & & chkngx& & & & & #通过指定上面定义监控脚本来监控服务状态,监控nginx监控状态 }
(7)使用通知脚本实现如何在vrrp事务发生时,发送警告邮件给指定的管理员? 比如:主从节点故障时建立脚本监控脚本如下:# vim /etc/keepalived/notify.sh& #!/bin/bash # & declare -a vips=(172.16.100.98 172.16.100.99) contact='root@localhost'Usage() { & & & & echo "Usage:`basename $0`{master|backup|fault}"} & Notify() { & & if [ "$2" = "VI_1" ]; then& & & & vip=${vips[0]} & & echo $vip & & elif [ "$2" = "VI_2" ]; then& & & & vip=${vips[1]} & & echo $vip & & fi& & suject="`hostname`'s state chaged to $1"& & mailbody="`date& +%F--%H:%M:%S`: `hostname`'s state chage to $1,vip floating..."& & echo $mailbody | mail -s& "$subject" $contact& & & echo $mailbody && /tmp/keepalived.log } & case $1 in& & master) & & Notify master & & & & exit 0 & & ;; & & backup) & & Notify backup & & & & exit 0 & & ;; & & fault) & & Notify fault & & & & exit 0 & & ;; & & *) & & & & Usage& & & & & exit 1 & & ;; esac
授予脚本执行权限:# chmod +x /etc/keepalived/notify.sh
配置keepalived.conf调用外部脚本在vrrp_instance VI_1 ##vrrp实例配置段最后添加如下: notify_master "/etc/keepalived/notify.sh master"& & & & #状态变为master时,触发的通知脚本 notify_backup "/etc/keepalived/notify.sh backup"& & & & #状态变为backup时,触发的通知脚本 notify_fault "/etc/keepalived/notify.sh fault"& & & & & #状态变为fault时,触发的通知脚本 notify "/etc/keepalived/notify.sh"& & #当发生所有的状态改变时,会先触发对应的状态通知脚本后,再触发该脚本
(8)使用脚本根据down文件检测实现主从状态转换# vim /etc/keepalived/convert_state.sh #!/bin/bash # & usage() { & & echo "./`basename $0` {master|backup}"& & exit 1 } & if [ $# -eq 0 ]; then & & usage fi & if [[ "$1" = "master" ]]; then & & [ -f /etc/keepalived/down ] && rm -f /etc/keepalived/down elif [[ "$1" = "backup" ]]; then & & [ ! -f /etc/keepalived/down ] && touch /etc/keepalived/down else& & usage fi sleep 1 & # chmod +x /etc/keepalived/convert_state.sh
执行脚本convert_state进行备节点转换:# /etc/keepalived/convert_state.sh backup # ls /etc/keepalived/ | grep down down
执行脚本convert_state进行主节点转换:# /etc/keepalived/convert_state.sh master
(9)LVS+keepalived配置ipvs规则实现负载均衡高可用配置如下:virtual_server 172.16.100.99 80 { & & delay_loop 6 & & lb_algo rr & & lb_kind DR & & nat_mask 255.255.0.0 & & # persistence_timeout 50 & & protocol TCP & & sorry_server 127.0.0.1 80& & & & #如果所有节点都down机,将转向本地web服务 & & & real_server 172.16.100.8 80 { & & & & weight 1 & & & & HTTP_GET {& & & & & & & & & & #web健康状态检测 & & & & & & url { & & & & & & & path / & & & & & & & status_code 200& & & & & & & } & & & & & & connect_timeout 3 & & & & & & nb_get_retry 3 & & & & & & delay_before_retry 3 & & & & } & & } & & real_server 172.16.100.9 80 { & & & & weight 1 & & & & HTTP_GET {& & & & & & & & & & #web健康状态检测 & & & & & & url { & & & & & & & path / & & & & & & & status_code 200& & & & & & & } & & & & & & connect_timeout 3 & & & & & & nb_get_retry 3 & & & & & & delay_before_retry 3 & & & & } & & } }
最后查询ipvs规则,如下所示:# ipvsadm -L -n --stats IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port& & & & & & &
InPkts& OutPkts& InBytes OutBytes & -& RemoteAddress:Port TCP& 172.16.100.99:80& & & & & & & & & & 3& & &
22& & & & 0& &
4657& & & & 0 & -& 172.16.100.8:80& & & & & & & & & &
0& & & & 0& & & & 0& & & & 0& & & & 0 & -& 172.16.100.9:80& & & & & & & & & &
0& & & & 0& & & & 0& & & & 0& & & & 0
以上为keepalived+lvs+web服务实现所有内容。
keepalived双主模型配置案例如下:master1为:vrrp_instance VI_1 { & & state MASTER & & interface eth0 & & virtual_router_id 51 & & priority 101 & & advert_int 1 & & authentication { & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & 172.16.100.99 dev eth0 label eth0:0 & & } & & track_script { & & chk_downfile & & } & & track_script { & & chkngx & & } & & notify_master "/etc/keepalived/notify.sh master"& & notify_backup "/etc/keepalived/notify.sh backup"& & notify_fault "/etc/keepalived/notify.sh fault"& & notify "/etc/keepalived/notify.sh"} vrrp_instance VI_2 { & & state BACKUP & & interface eth0 & & virtual_router_id 52 & & priority 100 & & advert_int 1 & & authentication { & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & & & 172.16.100.98 dev eth0 label eth0:1 & & } & & track_script { & & & & chk_downfile & & } & & track_script { & & & & chkngx & & } & & & & notify_master "/etc/keepalived/notify.sh master"& & & & notify_backup "/etc/keepalived/notify.sh backup"& & & & notify_fault "/etc/keepalived/notify.sh fault"& & & & notify "/etc/keepalived/notify.sh"}
master2为:vrrp_instance VI_1 { & & state BACKUP & & interface eth0 & & virtual_router_id 51 & & priority 100 & & advert_int 1 & & authentication { & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & 172.16.100.99 dev eth0 label eth0:0 & & } & & track_script { & & chk_downfile & & chkngx & & } & & track_script { & & chkngx & & } & & notify_master "/etc/keepalived/notify.sh master"& & notify_backup "/etc/keepalived/notify.sh backup"& & notify_fault "/etc/keepalived/notify.sh fault"& & notify "/etc/keepalived/notify.sh"} vrrp_instance VI_2 { & & state MASTER & & interface eth0 & & virtual_router_id 52 & & priority 101 & & advert_int 1 & & authentication { & & & & auth_type PASS & & & & auth_pass keepalivedpass & & } & & virtual_ipaddress { & & & & 172.16.100.98 dev eth0 label eth0:1 & & } & & track_script { & & & & chk_downfile & & } & & track_script { & & & & chkngx & & } & & & & notify_master "/etc/keepalived/notify.sh master"& & & & notify_backup "/etc/keepalived/notify.sh backup"& & & & notify_fault "/etc/keepalived/notify.sh fault"& & & & notify "/etc/keepalived/notify.sh"}
学习LVS+Keepalived必须阅读的三个文档。
1、& 《Keepalived权威指南》下载见
2、& 《LVS手册》
3、& 《Red_Hat_Enterprise_Linux-5-Virtual_Server_Administration-zh-CN》
本文永久更新链接地址:
相关资讯 & & &
& (03月27日)
& (03月09日)
& (昨 15:19)
& (03月24日)
& (03月08日)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款文章数:76
评论数:16
访问量:70230
注册日期:
阅读量:5863
阅读量:12276
阅读量:420981
阅读量:1109247
51CTO推荐博文
这是生产环境中一个项目,该公司的网站经常受到同行的ddos攻击,故需要搭建一个环境让攻击者攻击时候转到公司的假网站上。我的任务就是搭建抗攻击的假网站。
我的设计这样的lvs(+keepalived组成高可用)+LNMP+组成公司的假网站。总过8台机器6台web服务器2台lvs
为了保密,ip和真正地web都不。。。web只用两台代替。
1,配置准备
centos下的yum环境,keepalived-1.1.17.tar.gz,ipvsadm-1.24.tar.gz(这两个包可用在网上下载,也可以在下面的链接上下
2,安装配置
配置时候要确保下面的连接正常ln -sv /usr/src/kernels/2.6.32-220.el6.i686/ linux,因为keepalived-1.1.17.tar.gz,ipvsadm-1.24.tar.gz这两个包的编译都依赖开发的内核。如果出现以下情况:
[root@localhost src]# lltotal 8drwxr-xr-x 7 root root 4096 Mar& 1 03:01 redhat[root@localhost src]# 因为在装系统的时候没有装kernels的开发包这时候需要自己装yum install kernel*
安装ipvsadm-1.24.tar.gz
tar xf ipvsadm-1.24.tar.gzcd ipvsadm-1.24make && make install
安装keepalived-1.1.17.tar.gz
tar xf keepalived-1.1.17.tar.gz
cd keepalived-1.1.17
&./configure
确保./configure的结果是下面样子
Keepalived configuration------------------------Keepalived version&&&&&& : 1.1.17Compiler&&&&&&&&&&&&&&&& : gccCompiler flags&&&&&&&&&& : -g -O2Extra Lib&&&&&&&&&&&&&&& : -lpopt -lssl -lcrypto Use IPVS Framework&&&&&& : YesIPVS sync daemon support : YesUse VRRP Framework&&&&&& : YesUse LinkWatch&&&&&&&&&&& : NoUse Debug flags&&&&&&&&& : No
make && make install
cp /usr/local/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/mkdir /etc/keepalivedcp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/cp /usr/local/sbin/keepalived /usr/sbin/
3,配置keepalived的主备配置文件
vim /etc/keepalived/keepalived.conf
#######MASTER#####################! Configuration File for keepalived
global_defs {
&& notification_email {
&& notification_email_from
&& smtp_server 127.0.0.1
&& router_id LVS_DEVEL
vrrp_instance VI_1 {
&&& state MASTER
&&& interface eth0
&&& virtual_router_id 51
&&& priority 100
&&& advert_int 1
&&& authentication {
&&&&&&& auth_type PASS
&&&&&&& auth_pass 1111
&&& virtual_ipaddress {
&&&&&&& 192.168.1.200
virtual_server 192.168.1.200 80 {
&&& delay_loop 6
&&& lb_algo rr
&&& lb_kind DR
&&& persistence_timeout 50
&&& protocol TCP
&&& real_server 192.168.1.117 80 {
&&&&&&& weight 3
&&&&&&& TCP_CHECK {
&&&&&&& connect_timeout 10
&&&&&&& nb_get_retry 3
&&&&&&& delay_before_retry 3
&&&&&&& connect_port 80
&&& real_server 192.168.1.118 80 {
&&&&&&& weight 3
&&&&&&& TCP_CHECK {
&&&&&&& connect_timeout 10
&&&&&&& nb_get_retry 3
&&&&&&& delay_before_retry 3
&&&&&&& connect_port 80
#################BACKUP#########################! Configuration File for keepalived
global_defs {
&& notification_email {
&& notification_email_from
&& smtp_server 127.0.0.1
&& router_id LVS_DEVEL
vrrp_instance VI_1 {
&&& state BACKUP
&&& interface eth0
&&& virtual_router_id 51
&&& priority 80
&&& advert_int 1
&&& authentication {
&&&&&&& auth_type PASS
&&&&&&& auth_pass 1111
&&& virtual_ipaddress {
&&&&&&& 192.168.1.200
virtual_server 192.168.1.200 80 {
&&& delay_loop 6
&&& lb_algo rr
&&& lb_kind DR
&&& persistence_timeout 50
&&& protocol TCP
&&& real_server 192.168.1.117 80 {
&&&&&&& weight 3
&&&&&&& TCP_CHECK {
&&&&&&& connect_timeout 10
&&&&&&& nb_get_retry 3
&&&&&&& delay_before_retry 3
&&&&&&& connect_port 80
&&& real_server 192.168.1.118 80 {
&&&&&&& weight 3
&&&&&&& TCP_CHECK {
&&&&&&& connect_timeout 10
&&&&&&& nb_get_retry 3
&&&&&&& delay_before_retry 3
&&&&&&& connect_port 80
}如果在执行service keepalived start,启动不起来需要看日志# tail /var/log/messages Mar 30 12:05:15 localhost Keepalived_vrrp: bogus VRRP packet received on eth0 !!!Mar 30 12:05:15 localhost Keepalived_vrrp: VRRP_Instance(VI_1) Dropping received VRRP packet...Mar 30 12:05:16 localhost Keepalived_vrrp: ip address associated with VRID not present in received packet : -Mar 30 12:05:16 localhost Keepalived_vrrp: one or more VIP associated with VRID mismatch actual MASTER advert#######如果是以上日志就是因为你所在的环境还有其他人在做keepalived,需要修改虚拟路由标识,因为默认是51.#######如果还启动不了,那么你要是用的虚拟机做的实验的话,看看你虚拟机的时间date,这一点对虚拟机很重要的哟。
附加keepalived配置文件的解读
#####配置文件解读#####! Configuration File for keepalived
global_defs {&& notification_email {&&&&&&&&&&&&&& ###定义接收信息的邮件地址&&&& &&&& &&&& && }&& notification_email_from && smtp_server 192.168.200.1&&&&&&&& ####定义用于监控的smtp地址&& smtp_connect_timeout 30&& router_id LVS_DEVEL&&&&&&&&&&&&&&& ###定义lvs负载均衡标示}
vrrp_instance VI_1 {&&&&&&&&&&&&&&&&& ###定义一个vrrp组&&& state MASTER&&&###本机在该组中的所属的角色,只有MASTER和BACKUP两种状态,并且需要大写这些单词。&&& interface eth0&&&###对外提供服务的网络接口&&& virtual_router_id 51&&###虚拟路由标识&&& priority 100&&&###本机的在vrrp组的优先级&&& advert_int 1&&&###主备同步检查时间间隔&&& authentication {&&&###主备之间通信验证设置&&&&&&& auth_type PASS&&&&&&& auth_pass 1111&&& }&&& virtual_ipaddress {&&###虚拟ip地址,也就是vip地址。&&&&&&& 192.168.200.16&&& }}
virtual_server 192.168.200.100 443 {&###虚拟服务器定义,注意是ip+端口号&&& delay_loop 6&&&###健康检查时间间隔,单位是秒。&&& lb_algo rr&&&###负载均衡调度算法,互联网应用常使用wlc。&&& lb_kind NAT&&&###负载均衡转发规则,一般包括DR、NAT、TUN3种。常用DR模型。&&& nat_mask 255.255.255.0&&###DR模式这项没有&&& persistence_timeout 50&&###会话保持时间,单位是秒。&&& protocol TCP&&&###转发协议
&&& real_server 192.168.201.100 443 { ###定义realserver,real_server的值包括ip地址和端口号&&&&&&& weight 1&&&&###该realserver的权重&&&&&&& SSL_GET {&&&&&&&&&&& url {&&&&&&&&&&&&& path /&&&&&&&&&&&&& digest ff20ad4ef3e12ecd3a9cc&&&&&&&&&&& }&&&&&&&&&&& url {&&&&&&&&&&&&& path /mrtg/&&&&&&&&&&&&& digest 9b3a0c85a887a256d6939da88aabd8cd&&&&&&&&&&& }&&&&&&&&&&& connect_timeout 3&&&&&&&&&&& nb_get_retry 3&&&&&&&&&&& delay_before_retry 3&&&&&&& }&&& }}
&本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)1674人阅读
linux(189)
我们有一个简单便宜的 LVS-DR 的设置。二台机器(服务器),二台都运行着数据库的服务。外面请求过来的这些流量导向本地机器的服务器或其他服务器。因为纯 4 层调度,这是我最喜欢的方式。因为节约,我这次想直接要这二台服务器上运行 LVS 的服务。不在通过其它的机器。
所以使用 keepalived 来配置,做个主从,也同时在这个机器上。是个很完美的方案。
但是,我让同事帮着配置,一直不能正常的工作。下面是简单的架构图,和配置输出:
balances on VIP:port
&&&&&&&&&&&&&&&&&&&&CIP
&&&&&&&&&&&&&CIP&&&
&&&&&&&&&&&&&&v&&&&
| CIP-&MAC of eth0 on backup& normal packet
&&&&&&&&&&&&&VIP&&&
| MAC of eth0 on active&-CIP& spurious packet
&&&&&&&&&&&&&&|—————-—————
&&&&&&&&&&&&&&|&&&&&&&&&&&
&&&&&&&&&&&eth0
VIP&&& eth0 VIP
&&&&&&&&&&&_______&&&&&&
&&&&&&&&&&|&&&&&&
|&&&& |&&&&&& |
|&&&&&& |&&&& |&&&&&& | backup
&&&&&&&&&&|_______|&&&&
ipvsadm -L -n
Virtual Server version 1.2.1 (size=4096)
LocalAddress:Port Scheduler Flags
RemoteAddress:Port&&&&&&&&&& Forward Weight ActiveConn InActConn
192.168.1.233:3306&&&&&&&&&& Local&& 1&&&&& 0&&&&&&&&& 0
192.168.1.213:3306&&&&&&&&&& Route&& 1&&&&& 0&&&&&&&&& 0
二台机器上的配置都是这样(^-^上面其实有小修改),。在这种架构中,我只要停止我的备份的 keepalived ,就能正常的工作,不然一定有其中一台数据库连接到最后就中断停止在那个地方不动了。通过抓包,大量包被不断的转发来转发去。
我们来详细分析一下。
客户端发送连接的请求到 VIP 的指定的端口
当前的 director 会选择二个 realserver 来转发请求,会传送数据给 localnode 的本机网卡或者备份的机器上指定的那个 MAC 的 eth0 (同时他也做为 realserver) 。 正常的 LVS ,这些数据包会被监听这个 VIP 的程序接收。
如果数据包是发送给备份的 director 服务器的 eth0 接口。它会不能正常的被监听指定端口的程序所接收,因为数据包会首先先经过 ip_vs()。
这时,有 50% 的机会,这个包被转发给监听VIP指定端口的程序所接收,这时会生成标准的回应数据包给客户端。 因为能正常的回应客户端,这时 LVS 的功能是正常的,我们想所有的包都直接给监听程序来处理。并不想直接通过 ip_vs() 来转发。
这时还有 50% 的数据包会直接再次转给主 LVS 的 eth0/VIP。
我们不想数据包从备份的 LVS 再次转回去给主 LVS 这样会形成死循环。
所以我们要让 eth0 上发到给 VIP 的包, 只要不是其它 LVS 发的,才使用 ip_vs() 来处理。
简单来讲:当客户端发送数据包给 VIP 。比如我们的 Director1 (Master 主)这个接口正在工作,这时 LVS 能接收到这个包,然后根据 keepalived 的配置进行 load balance 。这时 Director1 会使用 LVS-DR 的功能给包路由给自己或者 Director2 (Backup)。
这时有个问题。在这个例子中因为我们使用了 keepalived 。这时 Director2 这台是一台 VIP 的备份服务器。这时 keepalived 默认会立即启动使用 ipvsadm 的规则来配置这台服务器怎么样做备份的处理。来使得更快的故障转移。所以这时这些规则在这台备份的 Director2 主机都会存在。
这就有问题了。当 Director1 (Master 主),比如使用 rr 。会转发大约 50% 的包从 Director1 到 Director2 (Backup)的 3306 的端口。这时 Director2 因为这些 LVS-DR 的配置规则会接着给这些包,再做一次 load balance 。又发回去给 Director1。这时会产生一个死的循环。
随着时间的推移,不但不能正常的处理连接,您的服务器也会崩溃,在他们中间或后端不断的反复连接。
解决方案: 给进入 eth0 的包打上 mark 的标记,当数据包是发给 VIP:80 并且 MAC 不是其它 LVS 服务器的话。 才做个 mark ,这样才会对指定的 fwmark 进行 loadbalance 放入到 LVS 中处理。只要数据包是从任意其它的 MAC 地址(非 LVS 的转发)会被发往 VIP:port, 会不再进行 loadbalanced 而是直接转给后面监听的 demon 程序进行应用的处理。实际就是我们使用 iptables 来对进入的流量设置 MARK。然后配置
keepalived 只处理有 MARK 过的流量。不在使用以前绑定 VIP 和端口。
iptables 的配置如下:
同时服务于 LVS-DR,又要做为数据库的后端。所以我们要注意,只接收一个 director 的数据包。
这时我们在 Director1 中设置($MAC_Director2 是指我在 Director1 上所能见到从 Director2 发过来包的 MAC 地址) :
-t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac ! --mac-source $MAC_Director2 -j MARK --set-mark 0x3
$VIP 为VIP地址
$VPORT 为服务端口
$MAC_Director2 是备机的MAC (keepalived 之间互相监听的那块网卡)
并在备份的 keepalived 的服务器 Director2 中设置:
-t mangle -I PREROUTING -d $VIP -p tcp -m tcp --dport $VPORT -m mac ! --mac-source $MAC_Director1 -j MARK --set-mark 0x4
$VIP 为VIP地址
$VPORT 为服务端口
$MAC_Director1 是主 的MAC (keepalived 之间互相监听的那块网卡)
查看添加的规则是否生效:
iptables -t mangle --list
使添加的规则永久生效
# 保存iptables规则
service iptables save
# 重启iptables服务
service iptables restart
查看当前规则:
cat /etc/sysconfig/iptables
接着在 keepalived 中分别配置这二个。
Director1:
virtual_server fwmark 3 {
Director2:
virtual_server fwmark 4 {
其实这个的完整配置类似如下:
keepalived
根据 MARK 来配置的方法
配置fwmark转发
virtual_server
fwmark 3& {& # 另一台备库是fwmark 4
&&&&delay_loop
&&&&lb_algo
&&&&lb_kind
&&&&protocol
&&&&real_server
192.168.1.213 3306 {
&&&&weight
&&&&MISC_CHECK
&&&&&&&&misc_path
&/etc/keepalived/check_slave.pl 192.168.1.213&
&&&&&&&&misc_dynamic
&&&&real_server
192.168.1.233 3306 {
&&&&weight
&&&&MISC_CHECK
&&&&&&&&misc_path
&/etc/keepalived/check_slave.pl 192.168.1.233&
&&&&&&&&misc_dynamic
通过以上设置后,在网站运行过程中还发现了另一个问题,就是RealServer发起对虚拟IP的请求时就会出问题。当RealServer对VIP的请求被分发给自己时,访问正常,当RealServer对VIP的请求被分发给备LVS上的RealServer时,就没有响应。具体的现象如下图:
source IP 和 virtual IP都是VIP,当VIP 和destination IP 在同一台服务器上时访问正常,当VIP 和destination IP 不在同一台服务器上时访问不正常。我想这应该是两台RealServer同时响应为VIP时,造成响应混乱,从而请求失败。我也偿试过通过对RealServer防火墙的设置,在上文中的规则中再加一条,就是目标地址是VIP地址,并且MAC地址不等于当前RealServer自己的MAC地址时,才加fwmark 标记。但是测试未成功,不知道是什么原因。另一个解决方案是:通过在Hosts文件中,把RealServer对解析到VIP的域名直接绑定到自己的IP,或是另一台RealServer的IP,即自己访问的域名不解析到VIP,这样设置后一切正常。
上面的这个问题,后来也在独立的RealServer(即纯粹的RealServer,不安装LVS)上测试了,还存在一样的问题。由此断定,在RealServer中,对VIP的访问是不正常的,除非访问VIP时被LVS分发到发出请求的RealServer自己。
参考资料:
怎么样让 LVS 和 realserver 工作在同一台机器上:http://www.//lvs-realserver-one-machine.html
LVS+Keepalived实现MySQL写高可用和读负载均衡:http://blog.chinaunix.net/uid--id-3781194.html
在同一台服务器上部署LVS和WEB:/a/fuzaijunheng/.html
LVS-HOWTO:/LVS/LVS-HOWTO/HOWTO/index.html
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:133657次
积分:2476
积分:2476
排名:第13712名
原创:67篇
转载:334篇
(3)(7)(6)(1)(2)(7)(2)(6)(2)(1)(4)(4)(11)(9)(12)(1)(15)(44)(7)(19)(22)(5)(7)(12)(7)(18)(48)(19)(55)(15)(13)(14)(1)}

我要回帖

更多关于 lvs keepalived mysql 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信