一些LVS实验配置、工具和方案
2015-07-20 10:51
405 查看
最近做了一些LVS配置和方案的验证实验,将过程中用到的一些配置、工具和具体的解决方案记录一下。使用DR模式。验证一种不中断业务的RealServer升级或者重启方案。
网络规划:
一、配置
DirectServer:
RealServer:
上述配置是标准的DR模式的配置。
二、工具
RealServer上面提供可以监听固定端口,并接受客户端从TCP连接发送过来的数据的TCPServer服务,将接收到的数据打印到屏幕,并回复当前节点信息给客户端,让客户端能够区分具体的服务是由哪个RealServer提供的。
服务的代码如下:
将上面的服务端代码导出为jar包:server.jar,部署到两台RealServer上面:
启动信息如下:
客户端工具:
客户端工具直接使用开源的sockettest工具:http://sourceforge.net/projects/sockettest/
三、验证RealServer的一种安全退出机制
当IPVS正在接受业务时,IPVS将请求按照指定的规则分发给两个节点。当需要重启某一个业务节点时,会存在两个问题:1、正在只执行的业务会被中断,如:TCP上面正在做数据交互会中断;2、如何确保不再有新的业务下发到需要重启的节点上面,如果采用LVS服务器将业务节点踢出,那么也会中断已经接入的请求。
其中问题1,一般来说需要服务本身去做判断,判断业务全部完成后,再做下电重启等处理。
对于问题2,需要寻求一种安全的移除业务节点的方案。既不能影响已经接入点业务请求,又不能让新的业务再下发到该节点上面。考虑使用带权重的轮询方式,将某个业务节点的权重设置为0,这样该节点就不会再有业务。但是节点并没有从lvs的配置中删除掉。因此已有的业务不会受影响。
结合客户端工具,和服务端的长连接支持方式,最终很轻松即可验证上述方案,验证步骤:
1、配置好DirectServer,两条分发记录到ceph1和ceph2节点;
2、配置RealServer,启动TCPServer服务;
3、在Windows上面使用sockettest工具分别与LVS的VIP建立长连接;
4、在LVS上面修改配置:
5、观察之前已经跟114节点建立的连接是否断开,是否还能继续发送和接受数据。验证结果为:连接不会断开,该连接还能继续处理数据。
6、DirectServer接受到的新的请求,是否还是会转给114节点。验证结果为:0权重生效,所有的业务都只发送到另外一个业务节点上面。
7、到此整个验证结束。
对于RealServer维护期间,需要精细化的维护业务不受损,可以使用如上方案来实现。
转载:点击打开链接
网络规划:
节点 | IP地址 |
ceph1(RealServer1) | 172.16.0.114 |
ceph2(RealServer2) | 172.16.0.115 |
ceph4(DirectServer) | 172.16.0.113 |
客户端:Win8.1 | 172.16.0.100 |
DirectServer:
vip=172.16.0.113
r1ip=172.16.0.114
r2ip=172.16.0.115
port=$1
if[-z"$port"]
then
port=2100
fi
ipvsadm-C
ipvsadm-A-t${vip}:${port}-swrr
ipvsadm-a-t${vip}:${port}-r${r1ip}:${port}-g
ipvsadm-a-t${vip}:${port}-r${r2ip}:${port}-g
RealServer:
#!/bin/sh
VIP=172.16.0.113
BROADCAST=172.16.0.255#vip'sbroadcast
Usage()
{
echo"Usage:`basename$0`(start|stop)"
exit1
}
if[$#-ne1];then
Usage
fi
case$1in
start)
echo"reparingforRealServer"
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
/sbin/ifconfiglo:0$VIPnetmask255.255.255.255broadcast$BROADCASTup
/sbin/routeadd-host$VIPdevlo:0
;;
stop)
/sbin/ifconfiglo:0down
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"stopRealServer"
;;
*)
Usage
esac
上述配置是标准的DR模式的配置。
二、工具
RealServer上面提供可以监听固定端口,并接受客户端从TCP连接发送过来的数据的TCPServer服务,将接收到的数据打印到屏幕,并回复当前节点信息给客户端,让客户端能够区分具体的服务是由哪个RealServer提供的。
服务的代码如下:
packagecom;
importjava.net.ServerSocket;
importjava.net.Socket;
importjava.io.IOException;
publicclassServer
{
publicstaticvoidmain(String[]args)throwsIOException
{
if(args.length<1)
{
System.out.println("argumentserror!\nusage:java-jartcpser.jarserverport");
System.exit(0);
}
intserverport=Integer.parseInt(args[0]);
System.out.println("==============TCPSERVER==============");
ServerSocketserver=null;
try
{
server=newServerSocket(serverport);
System.out.println("ListeningPortis"+server.getLocalPort()+"...");
while(true)
{
SocketconnectedCli=server.accept();
System.out.println("anewclient:"+connectedCli.getInetAddress()+":"+connectedCli.getPort());
newDataProcesser(connectedCli).start();
}
}
catch(Exceptione)
{
e.printStackTrace();
}
finally
{
if(server!=null)
{
server.close();
}
}
}
}
packagecom;
importjava.io.BufferedReader;
importjava.io.BufferedWriter;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.net.InetAddress;
importjava.net.Socket;
publicclassDataProcesserextendsThread
{
privateSocketcli;
publicDataProcesser(Socketclientsocket)
{
cli=clientsocket;
}
@Override
publicvoidrun()
{
BufferedReaderreader=null;
BufferedWriterwriter=null;
try
{
reader=newBufferedReader(newInputStreamReader(cli.getInputStream()));
writer=newBufferedWriter(newOutputStreamWriter(cli.getOutputStream()));
while(true)
{
StringreceivedString=reader.readLine();
if(receivedString!=null)
{
System.out.println(cli.getInetAddress()+":"+cli.getPort()+""+receivedString);
Stringhostname=InetAddress.getLocalHost().getHostName();
writer.write("it'sfromthehost:"+hostname);
writer.write("\n");
writer.flush();
}
if("shutdown".equals(receivedString))
{
break;
}
}
}
catch(Exceptione)
{
e.printStackTrace();
}
finally
{
if(reader!=null)
{
try
{
reader.close();
}
catch(Exceptione2)
{
e2.printStackTrace();
}
}
if(cli!=null)
{
try
{
cli.close();
}
catch(Exceptione2)
{
e2.printStackTrace();
}
}
}
}
}
将上面的服务端代码导出为jar包:server.jar,部署到两台RealServer上面:
启动信息如下:
root@ceph1:~#java-jarserver.jar2100
==============TCPSERVER==============
ListeningPortis2100...
anewclient:/172.16.0.100:49314
anewclient:/172.16.0.100:49316
客户端工具:
客户端工具直接使用开源的sockettest工具:
三、验证RealServer的一种安全退出机制
当IPVS正在接受业务时,IPVS将请求按照指定的规则分发给两个节点。当需要重启某一个业务节点时,会存在两个问题:1、正在只执行的业务会被中断,如:TCP上面正在做数据交互会中断;2、如何确保不再有新的业务下发到需要重启的节点上面,如果采用LVS服务器将业务节点踢出,那么也会中断已经接入的请求。
其中问题1,一般来说需要服务本身去做判断,判断业务全部完成后,再做下电重启等处理。
对于问题2,需要寻求一种安全的移除业务节点的方案。既不能影响已经接入点业务请求,又不能让新的业务再下发到该节点上面。考虑使用带权重的轮询方式,将某个业务节点的权重设置为0,这样该节点就不会再有业务。但是节点并没有从lvs的配置中删除掉。因此已有的业务不会受影响。
结合客户端工具,和服务端的长连接支持方式,最终很轻松即可验证上述方案,验证步骤:
1、配置好DirectServer,两条分发记录到ceph1和ceph2节点;
2、配置RealServer,启动TCPServer服务;
3、在Windows上面使用sockettest工具分别与LVS的VIP建立长连接;
4、在LVS上面修改配置:
ipvsadm-e-t172.16.0.113:2100-r172.16.0.114:2100-w0
5、观察之前已经跟114节点建立的连接是否断开,是否还能继续发送和接受数据。验证结果为:连接不会断开,该连接还能继续处理数据。
6、DirectServer接受到的新的请求,是否还是会转给114节点。验证结果为:0权重生效,所有的业务都只发送到另外一个业务节点上面。
7、到此整个验证结束。
对于RealServer维护期间,需要精细化的维护业务不受损,可以使用如上方案来实现。
转载:
相关文章推荐
- linux终端或者虚拟机SecureCRT窗口拖动之后,会自动收到一个Ctrl+C的命令
- Hadoop HDFS笔记
- android 布局文件 ScrollView 中的 listView item 显示不全解决方案
- poj 3342 树形dp
- html 学习总览
- 《你最美》换发型应用项目源码
- linux mint安装搜狗输入法
- poj3093
- Android SwipeRefreshLayout:谷歌官方SDK包中的下拉刷新
- 【Java基础第一弹】Java序列化基础篇
- poj3093 分类: poj 2015-07-20 10:50 18人阅读 评论(0) 收藏
- (大数据工程师学习路径)第三步 Git Community Book----Git基本用法(上)
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- 辨析 singleton 和 prototype
- 在Extjs中动态增加控件
- spring aop事务配置,事务回滚
- OC的单例模式的实现
- Spring bean加载顺序 depends-on
- 内建变量
- 设计模式_中介者模式