LVS DR模式搭建,keepalived + lvs
18.11 LVS DR模式搭建
在实际生产环境中DR模式是用得最多的,NAT模式都用得比较少,因为NAT有一个瓶颈,服务器少还行,一旦服务器多的话,就不行了。所以DR模式才是重点,这一章节介绍如何搭建DR模式。
准备工作:
准备三台机器,一台作为分发器(dir),其他两台作为Real Server。三台机器都可以使用同一网段的IP,与NAT模式不同的是,三台机器都需要绑定一个vip,并且分发器不需要有一个单独的外网网卡。
我这里已经准备好三台机器的IP了,分别是:
- 分发器(dir):192.168.77.130
- Real Server 01:192.168.77.128
- Real Server 02:192.168.77.134
准备好IP之后,在分发器上编写脚本:
vim /usr/local/sbin/lvs_dr.sh
编写内容如下:
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward //打开路由转发
ipv=/usr/sbin/ipvsadm
vip=192.168.77.200
rs1=192.168.77.128
rs2=192.168.77.134
ifdown eno16777728
ifup eno16777728
#注意这里的网卡名字,这是绑定vip的
ifconfig eno16777728:2 $vip broadcast $vip netmask 255.255.255.255 up
# 添加网关
route add -host $vip dev eno16777728:2
$ipv -C # 清空规则
$ipv -A -t $vip:80 -s rr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1 # 定义dr模式的规则
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
修改完毕:
然后执行一下这个脚本,看看有没有错误:
sh /usr/local/sbin/lvs_dr.sh
如图则没问题。
配置Real Server:
除了dir分发器之外的另外的两台Real Server也要写一个脚本:
vim /usr/local/sbin/lvs_rs.sh
脚本的内容如下:
#/bin/bash
vip=192.168.77.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
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
编辑完毕:
保存退出后执行这个脚本看看是否正常:
sh /usr/local/sbin/lvs_rs.sh
我这里出现了一个错误,无法载入本地网卡的配置文件:
解决办法,往ifcfg-lo配置文件里加上以下这一句(一会还会介绍另一种解决办法):
TYPE=LOOPBACK
重启网卡后再执行这个shell脚本:
如图,没有打印错误信息了。
接着再到另一台Real Server上编辑这个脚本:
vim /usr/local/sbin/lvs_rs.sh
内容是一致的:
保存退出后,执行这个脚本看看有没有问题,如果和上面那个问题一样显示无法载入文件的话,就把NetworkManager套件给关闭了,然后再执行就不会有问题了:
systemctl stop NetworkManager
systemctl disable NetworkManager
然后使用route -n命令查看一下网关:
如图,可以看到这个vip配置成功了,如果没有这个vip的话,可能是脚本出了问题,然后在另一台Real Server执行此命令查看:
如图,两台Real Server都需要绑定这个vip,如果没有这个vip的话,就是配置失败了。
然后再到分发器(dir)上执行ip addr 查看一下是否有绑定vip:
如图,有绑定vip,这样就是配置成功了,如果没有的话也是脚本有问题,需要检查一下是否修改的时候弄错了。
以上步骤都成功后,我们的DR模式就搭建完成了,接下来就是测试了:
- 关闭所有机器的防火墙(可以把这些命令写成一个脚本执行):
systemctl stop firewalld
systemctl disable firewalld
systemctl start iptables
systemctl enable iptables
iptables -F service iptables save
2. 启动所有机器的Nginx,并且确保80端口有被监听:
service nginx start
3. 打开windows上的浏览器,访问192.168.77.200这个vip:
如图,可以看到分别访问了两台Real Server的默认页,因为分发器会将客户的访问请求,根据调度算法来分发到这个两台Real Server上,如此能够进行分配访问请求的话,就代表我们的DR模式搭建成功,并且能够进行访问了。
18.12 keepalived lvs
以上我们搭建好了LVS的DR模式,接下来我们使用Keepalived结合LVS,让Keepalived实现负载均衡的功能。
为什么要结合Keepalived:
原因一:分发器(dir)在LVS中是一个重要的角色,因为所有的用户请求都是被分发器所分配到每台Real Server上,所以说分发器也可以看作是一个入口,所有的请求都从这个入口进来。如果分发器宕机,那么所有的Real Server都接收不到用户的请求,相当于全部都瘫掉了。因此我们需要这个分发器能够是高可用的,而Keepalived则可以实现高可用,而且Keepalived本身还有负载均衡的作用。
原因二:如果没有Keepalived的话,其中一台Real Server宕机了,分发器依然还是会将请求分发过去,这样就会导致用户的请求无法被处理,并且在浏览器中也会显示连接失败,所以需要Keepalived来确保用户的请求不会被分发到一台已经宕机的Real Server上。
既然说明了为什么需要Keepalived,那么接下来就实际演示一下如何让Keepalived与LVS结合,完整架构需要两台服务器分别安装keepalived软件,的是实现高可用,但keepalived本身也有负载均衡的功能,所以本次实验可以只安装一台keepalived,因为我这之前已经安装过了,所以就不演示安装的过程了,如果不知道怎么安装的话,可以参考我另一篇使用keepalived搭建高可用的文章:
http://zero01.blog.51cto.com/12831981/1981374
1.编辑keepalived的配置文件
vim /etc/keepalived/keepalived.conf
2.文件内容从以下网址获得:
https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D21Z/lvs_keepalived.conf
3.修改ip和网卡名称:
保存退出后,因为搭建DR模式的时候脚本写入了一些规则,所以得先执行ipvsadm -C命令,把之前的ipvsadm规则清空掉。
4.启动keepalived:
测试:
启动keepalived后,使用ipvsadm -ln命令,查看一下分发规则:
然后把其中一台Real Serve的Nginx给关了:
回到分发器上查看一下分发规则:
如图,可以看到keepalived自动把停掉Nginx服务的Real Serve给踢出分发规则了。这一步可能需要多执行几次ipvsadm -ln命令,因为我们在配置文件里设置的是10秒检测一次。
接着再把刚刚听停掉的那台Real Serve的Nginx启动起来:
这时候再次回到分发器上查看规则:
如图,可以看到keepalived检测到Real Serve的Nginx启动起来了,就自动添加了分发规则。
在浏览器上也能够正常访问:
- HDUOJ--------A simple stone game(尼姆博弈扩展)(2008北京现场赛A题)
- HDUOJ----2485 Destroying the bus stations(2008北京现场赛A题)
- Go语言实践:从新手入门到上线真实的小型服务所遇到的那些坑
- Node.js真的无所不能?那些不适用的应用领域分析
- hdu-----2491Priest John's Busiest Day(2008 北京现场赛G)
- nyoj------79拦截导弹
- HDUOJ-------2719The Seven Percent Solution
- Golang记录、计算函数执行耗时、运行时间的一个简单方法
- uva----11729 Commando war (突击战争)
- uva-----11292 The Dragon of Loowater
- golang简单位运算示例
- 学编程,学单词.....在学习中积累自己的单词(不断更新__ing)
- 初学java之事件响应(结合接口来设置在同一个界面上!)
- 初学java之触发响应事件举例子
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R海拾遗-stringr
- stringr2
- Kubernetes 无状态应用的一般特征
- 一段简单的代码,能让所有GIF图实现时光倒流
- 你喜欢的女主播颜值多少分,今天带你测试虎牙直播女主播的颜值
- (译)kubectl 的奇技淫巧
- Python实现主播人气排行榜,带你发现人气王
- (译)Kubernetes:移除 CPU 限制,服务运行更快
- python_不误正业之贪吃蛇
- 如何让你在众多二手车中挑中满意的?python帮你实现(附源码)
- python苦短_SVM测试
- 招聘信息太多,哪家职位才是适合你的?Python采集招聘信息
- 福利来啦,送给大家一个小游戏的源码,不要错过哟(复制粘贴运行即可玩)
- 今天抠图,Python实现一键换底片!想换什么换什么(附源码)
- 你想不到的沙雕,8行代码Python实现GIF图倒放,每天的快乐源泉