主从热备+负载均衡(LVS + keepalived)

作者:youzhibing2904

链接:https://www.cnblogs.com/youzhibing/p/5021224.html

码云(gitee):https://gitee.com/youzhibing

环境准备

本机 + virtualBox + 4台centOs虚拟机,如下图

image

virtualBox安装以及CentOS安装这里就不再演示,大家自行搭建;本机在本次试验中扮演的角色就是客户端,起到一个发送请求的作用,两台CentOS做负载均衡服务器(一台为主机,一台为备机),另外两台作为真实的Web服务器(安装有tomcat)。

本次实验基于DR负载均衡模式(直接路由,旭龙兄的博客有讲解),设置一个VIP(Virtual IP)为192.168.1.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.1.114(master),备机为 192.168.1.112(brucelee)。Web服务器A为192.168.1.111(youzhibing),Web服务器B为192.168.1.115(youzhibing03),四台机器命名除了master外都不太规范,但不影响实验。四台CentOS的防火墙都需要关闭。利用Xshell链接CentOS,如下图

image

配置两台web服务器

和本地部署web项目一样,将myWeb部署到tomcat中,开启tomcat,宿主机访问(virtualBox安装linux,并搭建tomcat请点这),如下图

image
image

将这两台web服务器都配置成lvs的real server,编辑realserver脚本文件,进入指定文件夹:cd /etc/init.d/,编辑脚本文件:vim realserver,如下图

image

/etc/init.d/realserver 内容如下

#vi /usr/local/sbin/realserver.sh
#!/bin/bash
# description: Config realserver lo and apply noarp
#Written by :NetSeek http://www.linuxtone.org

SNS_VIP=192.168.1.200

. /etc/rc.d/init.d/functions

case "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0               
      echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1              
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;
*)
       echo "Usage: $0 {start|stop}"
       exit 1
esac

exit 0

保存脚本文件后更改该文件权限:chmod 755 realserver,开启realserver服务:service realserver start;

注意:配置real server是web服务器都需要配置的,有多少台就配置多少台!

配置负载服务器(master)

安装Keepalived

yum install -y keepalived

在CentOS下,通过yum install命令可以很方便地安装软件包,但是前提是你的虚拟机要联网,若没有联网则先从有网的地方下载压缩包,然后拷贝或者上传到linux系统,再进行安装;

配置keepalived

①进入keepalived.conf所在目录:cd /etc/keepalived

②首先清除掉keepalived原有配置:> keepalived.conf

③重新编辑keepalived配置文件:vi keepalived.conf

内容如下:

global_defs {
    notification_email {
        997914490@qq.com
    }
    notification_email_from sns-lvs@gmail.com
    smtp_server 192.168.1.114
    smtp_connection_timeout 30
    router_id LVS_MASTER         # 设置lvs的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
    state MASTER            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
    virtual_router_id 66        # 虚拟路由编号,主从要一直
    priority 100            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定义虚拟ip(VIP),可多设,每行一个
    }
}
# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 设置健康检查时间,单位为秒
    lb_algo wrr            # 设置负载调度的算法为wrr
    lb_kind DR            # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒内的请求都发到同个real server
    protocol TCP
    real_server 192.168.1.111 8080 { # 指定real server1的ip地址
        weight 3        # 配置节点权值,数值越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.115 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}    

配置负载服务器(slave)

和主负载服务器一样,先安装keepalived,然后编辑keepalived.conf,内容如下,与主负载服务器有些许差别

global_defs {
    notification_email {
        997914490@qq.com
    }
    notification_email_from sns-lvs@gmail.com
    smtp_server 192.168.1.112
    smtp_connection_timeout 30
    router_id LVS_BACKUP         # 设置lvs的id,在一个网络应该是唯一的
}
vrrp_instance VI_1 {
    state BACKUP            # 指定keepalived的角色,MASTER为主,BACKUP为备
    interface eth0            # 当前进行vrrp通讯的网络接口卡(当前进行vrrp通讯的网络接口卡)
    virtual_router_id 66        # 虚拟路由编号,主从要一致
    priority 99            # 优先级,数值越大,获取处理请求的优先级越高
    advert_int 1            # 检查间隔,默认为1s(vrrp组播周期秒数)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.1.200        # 定义虚拟ip(VIP),可多设,每行一个
    }
}
# 定义对外提供的LVS的VIP以及port
virtual_server 192.168.1.200 8080 {
    delay_loop 6             # 设置健康检查时间,单位为秒
    lb_algo wrr            # 设置负载调度的算法为wrr
    lb_kind DR            # 设置lvs实现负载的机制,有NAT、TUN、DR三个模式
    nat_mask 255.255.255.0
    persistence_timeout 0        # 同一IP 0秒内的请求都发到同个real server
    protocol TCP
    real_server 192.168.1.111 8080 { # 指定real server1的ip地址
        weight 3        # 配置节点权值,数值越大权重越高
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
    real_server 192.168.1.115 8080 {
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}   

启动keepalive服务,主从都要启动!

service keepalived start 

如果所有的"代码主题"都不符合你的要求,你可以参考"一键排版"下的"代码块样式"自定义

效果展示

负载均衡演示

image
image

这里出现了问题,发现同一个浏览器一段时间内刷新,得到的结果是同一个,也就是说同一个ip某一段时间内的请求交给了同一台real server处理,用centos上的浏览器测试也是一段时间内的请求得到的是同一个结果,但是与宿主机却有所不同,比如宿主机得到的是相同的192.168.1.115,而centos上得到的却是192.168.1.111,,可明明我配置了persistence_timeout 0,找了不少资料,还是没能解决!希望知道的朋友可以不吝赐教,在评论区进行留言,谢谢了!

a.web服务器出现故障

192.168.1.115发生故障,关闭115也就是youzhibing03的tomcat服务

image

那么宿主机与虚拟机上的结果都只有一个,都得到如下结果

image

b.web服务器修复,重新启动115的tomcat服务

image

宿主机得到如下结果

image

可虚拟机上显示的却还是192.168.111的结果

主从热备演示

a、关闭主负载服务器的keepalived服务

image

刷新页面,依然能得到如下结果

image

那么也就说明从负载服务器(brucelee)接管了,我们来看下日志

image
image

发现从负载服务器确实接管了主负载服务器的任务

b.当之前的主负载服务器(master)修复后,日志文件如下

image
image

主负载服务器恢复后,从负载服务器让出位置,回到最初的主从状态了!

总结

总的来说,最终的效果还是符合标题的,虽然在负载均衡那一块有些许疑问,好像没有达到负载均衡的目的,但是也确实只是好像,因为总体而言还是有负载均衡效果的,比如宿主机的得到的是115的结果,而虚拟机上的得到的是111的结果;

目前流行的LVS解决方案中,在Web服务器端也有采用了Nginx+Tomcat这样的搭配类型,静态文件和动态文件分开进行处理,也不失为一种有效的尝试。在以后的日子里,我会陆续进行实践,并分享给大家!

后话

这篇博客其实周六就写好了,但是一直纠结负载均衡那个位置,迟迟没有发表出来,也是希望对自己和对大家负责吧;但是有好心不一定就有好的结果,查阅了不少资料,也进行了不少修改,可负载均衡的效果一直没有改变(不是没有哦!),离我预期的有些出入,虽然有出入,但我认为负载均衡的效果是存在的,只是与单个浏览器刷新而得到两个效果之间轮流切换有一些不同罢了!

另外提一点,如果大家想亲手实践下的话,我建议大家的硬件不要太低了,我的i7处理器 + 4G内存,运行主机 +4台虚拟机有点卡,建议大家内存上大点,最好8G以上;

最后强调一点:实践是检验真理的唯一标准! 有些许的冲动就赶快去实践!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容