Docker笔记三:基于LVS DR模式构建WEB服务集群
LVS 支持NAT、TUN、DR、FullNAT四种模式,DR模式只支持IP转发,不支持端口转发,因此VS端口必须与RS端口保持一致。要使用FullNAT版,需安装alibaba/LVS: https://github.com/alibaba/LVS 。
安装ipvsadm
1. 先在宿主机上安装并以root来启动ipvsadm,每次要在容器中运行ipvs都需要先在宿主机上启动ipvsadm。如果直接进行2步操作将报出如下错误:
Can't initialize ipvs: Protocol not available
Are you sure that IP Virtual Server is built in the kernel or as module?
2. 实例化一个ipvs容器:
- dockerfile:这里特别说明下,凡是在CMD和ENTRYPOINT中声明的可执行程序都应该以非daemon的形式去运行永不自动退出,否则会导致容器在程序执行结束后也退出运行,默认CMD是/bin/bash。下文中定义的两个脚本若放在rc.local中,容器启动时不会自动执行,也不能放在CMD和ENTRYPOINT中去声明自动执行,看来只有用crontab来启用任务计划了,或手动执行一次。
FROM ubuntu
MAINTAINER cenze <272666745@qq.com> RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ADD conf/sources.list /etc/apt/
ADD conf/rc.ipvs /etc/ RUN apt-get update \
&& apt-get install -y gcc make vim ipvsadm iproute2 keepalived #本机的80端口已经留给其他容器使用了,所以绑定在了89端口上
EXPOSE 89 - 宿主机上 build 镜像和 run 容器:
sudo docker build -t cenze/ipvs -f Dockerfile-IPVS .
sudo docker run -it -p 89:89 --name ipvs --privileged=true cenze/ipvs - 容器ipvs中完成均衡策略配置:由于容器启动时不会自动去执行/etc/rc.local,所以需手动执行下。所有需要手动执行的命令都可写进rc.ipvs(需要可执行权限)文档:
#!/bin/bash VIP=172.17.100.100
VPORT=89
RPORT=89
RS=("172.17.0.8" "172.17.0.6")
RSW=("1" "1")
TYPE=g addrs() {
ipvsadm -a -t $VIP:$VPORT -r $1:$RPORT -$TYPE -w $2
[ $? -eq 0 ] && return 0 || return 1
}
#echo 1 > /proc/sys/net/ipv4/ip_forward
ip addr add $VIP broadcast $VIP label eth0:0 dev eth0
ipvsadm -A -t $VIP:$VPORT -s wlc COUNT=0
for I in ${RS[*]}; do
addrs $I ${RSW[$COUNT]}
let COUNT++
doneDirector需要开启IP转发功能,如果默认未开启,则echo 1 > /proc/sys/net/ipv4/ip_forward。然后一次手动执行完,执行完后不能退出容器,窗口不能关闭;否则ipvsadm也将退出,上述配置信息将失效:
root@7a375abcd343:/# /etc/rc.ipvs
配置RS-172.17.0.6和RS-172.17.0.8
1. 与ipvs容器一样,需要手动执行一些配置命令,将其写进/etc/rc.rs(需要可执行权限):
#!/bin/bash ip addr add 172.17.100.100 broadcast 172.17.100.100 label lo:0 dev lo
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
172.17.100.100被称为VIP,需要在Director(ipvs容器)和Real Server(RS-172.17.0.6和RS-172.17.0.8都要新建一张地址为172.17.100.100的虚拟网卡出来)上同时部署。上述关于arp的设置不明白的,可去看这篇文章 Linux内核参数之arp_ignore和arp_announce。一次手动执行完:
root@203ffab2138f:/usr/local/pkgs/nginx-1.10.# /etc/rc.rs
2. 为RS-172.17.0.8和RS-172.17.0.6添加不同的index.html:
<html>
<head>
<title>Welcome to RS-172.17.0.8(6)!</title>
</head>
<body>
<h1>Welcome to RS-172.17.0.8(6)!</h1>
</body>
</html>
3. WEB服务器的监听端口改为89。
测试集群负载均衡效果
从多个浏览器访问172.17.100.100:89:
1)不能从同一个浏览器开启多个标签去测试,否则将得到同一台WEB服务器的响应,刷新也没用,这可能与持久连接有关。
2)不能通过localhost:89去访问,否则将无法与WEB服务器群建立起连接。
3)不使用浏览器,而使用curl来发送多个请求也是可行的。
1. Chrome访问172.17.100.100:89:
Welcome to 172.17.0.8!
2. FireFox访问172.17.100.100:89:
Welcome to 172.17.0.6!
LVS的十种调度算法
四种静态算法,不考虑后端服务器实际负载情况:
1、RR
依次论询,不考虑RS的性能。
2、WRR
加权轮询,加入了weight(权重),RS权重越大性能越好。
3、DH
目标hash,对同一个资源的请求发往同一台服务器,常用于缓存服务器的场景。
4、SH
源地址hash。
六种动态算法,考虑后端服务器当前负载后再进行分配:
1、LC
Least Connection,拥有最少连接的RS响应客户端请求。计算Overhead = active * 256 + inactive,如果相同则依次往下选择RS,不考虑RS性能。
2、WLC
RS加权的LC,考虑了RS的性能。如果Overhead = (active * 256 + inactive) / weight相同,则由上而下选择RS。
3、SED
最短期望延迟,就是对WLC的情况的补充,Overhead = (active + 1) * 256 / weight,+1就是为了让其能够比较出大小。
4、NQ
Never Queue 基本和SED相同,避免了SED当中的性能差的服务器长时间被空闲的弊端,第一个请求给性能好的服务器,第二个请求给空闲的服务器不论性能的好坏,以后还是会把请求给性能好的服务器。
5、LBLC
动态DH和LC的组合,适用于Cache群,对于从来没有过的新请求会给当前连接数少的那台服务器。
6、LBLCR
带有复制功能的LBLC,第一次访问RS1的5个请求第二次又来了,Director会将它们都交给RS1吗?此时RS2可是非常闲的,所以最好可以将这5个请求分别交给RS1和RS2,但需要把客户端第一次请求的资源复制下来。
Docker笔记三:基于LVS DR模式构建WEB服务集群的更多相关文章
- LVS DR模式 负载均衡服务搭建
LVS 负载均衡 最近在研究服务器负载均衡,阅读了网上的一些资料,发现主要的软件负载均衡方案有nginx(针对HTTP服务的负载均衡),LVS(针对IP层,MAC层的负载均衡).LVS模式工作在网络层 ...
- Keepalived+LVS(dr)高可用负载均衡集群的实现
一 环境介绍 1.操作系统CentOS Linux release 7.2.1511 (Core) 2.服务keepalived+lvs双主高可用负载均衡集群及LAMP应用keepalived-1.2 ...
- LVS + Keepalived + Nginx基于DR模式构建高可用方案
在大型网站中一般服务端会做集群,同时利用负载均衡器做负载均衡.这样有利于将大量的请求分散到各个服务器上,提升网站的响应速度.当然为了解决单点故障的问题,还会做热备份方案.这里演示利用LVS做负载均衡器 ...
- Docker笔记--镜像&基于GO项目创建Docker镜像
Docker笔记--镜像&基于GO项目创建Docker镜像 核心概念 Doker镜像--包含一个基本的操作系统运行环境和应用程序,镜像是创建Docker容器的基础. Docker容器--如果把 ...
- Keepalived+LVS DR模式高可用架构实践
Keepalived最初是为LVS设计,专门监控各服务器节点的状态(LVS不带健康检查功能,所以使用keepalived进行健康检查),后来加入了VRRP(虚拟路由热备协议(Virtual Route ...
- LVS DR模式实验
LVS DR模式实验 三台虚拟机,两个台节点机(Apache),一台DR实验调度机 一:关闭相关安全机制 systemctl stop firewalld iptables -F setenforce ...
- lvs dr 模式请求过程
一. lvs dr 模式请求过程 1.整个请求过程如下: client在发起请求之前,会发一个arp广播的包,在网络中找"谁是vip",由于所有的服务器,lvs和rs都有vip,为 ...
- 一个公网地址部署LVS/DR模式
http://blog.chinaunix.net/uid-7411781-id-3436142.html 一个公网地址部署LVS/DR模式 网上看了很多关于LVS的文章,在选取2种模式LVS/D ...
- LVS DR模式搭建、keepalived+lvs
1.LVS DR模式搭建 条件: 即三台机器,在同一内网. 编辑脚本文件:/usr/local/sbin/lvs_dr.sh #! /bin/bashecho 1 > /proc/sys/net ...
随机推荐
- 对Numpy广播操作的理解
1.首先检查两个矩阵维数是否相同,若不同,对维数少的补一.注意这里的维数不是指n行d列中的n和d的值,对于这种情况维数就是2.若一个两维的矩阵(n,d)和一个一维的数组(m,)相乘,补一操作就是将那个 ...
- [板子]segTree
segTree 参考:http://www.cnblogs.com/TenosDoIt/p/3453089.html#c 初学者建议先参考上面“一步一步理解线段树”学习理论. 在这里Code分别为区间 ...
- linux学习(八)chmod、chown、umask、lsattr、chattr
一.权限位 权限位分为两个部分,第一个部分是谁的权限,第二部分是权限是多少.其中第一个部分一般分为:用户,用户组,其他用户.第二部分分为r:读权限,w:写权限,x:执行权限.可读,可写,可执行的权限, ...
- 如何用php写app接口[原创]
人生就如一列永不停止的列车,no one knows when or where to stop.总有那些美好,值得永远怀念.也总有那些希望,值得你无怨无悔的付出,追逐.去年年底带着女儿一起坐火车会湖 ...
- thinkphp后台ajaxReturn提示下载的问题
thinkphp新版设置了ajaxreturn方法如果是JSON格式会自动设置头信息为JSON格式,这样做在谷歌下可以正常解析,但是在IE和OPERA浏览器下就会提示下载,从而导致程序出错,修改方法如 ...
- 一起写框架-Ioc内核容器的实现-基础API的定义(三)
Ioc内核要解决的问题 1.被调用方,在程序启动时就要创建好对象,放在一个容器里面. 2.调用方使用一个接口或类的引用(不用使用new),就可以创建获得对象. 解决这个两个问题的思路 1.定义一个对象 ...
- 在WebForm中实现购物车思路
关于网站购物车的实现的思考 写在前面的话:刚来公司的的时候,老大安排了一个任务,企业站,但是需要实现购物车的功能,以前没做过,所有就向周围的人请教了一下如何实现购物车,自己也在网上搜了一下,有了些 ...
- 谈谈我的移动端rem适配方案
最近有点怀疑人生,毕竟一个人写前端,有时候会怀疑自己理解的一些东西包括用法有没有符合标准.趁着这阵子闲下来,翻了翻别人的rem适配博客,发现有点绕口,怪自己是个强迫症,啥都要自己去试试结果并从中理解, ...
- Katana-CookieAuthenticationMiddleware-源码浅析
准备工作 第一步,建立一个模板项目 本文从CookieAuthenticationMiddleware入手分析,首先我们来看看哪里用到了这个中间件,打开VisualStudio,创建一个Mvc项目,然 ...
- 深入学习JS执行--创建执行上下文(变量对象,作用域链,this)
一.介绍 本篇继上一篇深入理解js执行--单线程的JS,这次我们来深入了解js执行过程中的执行上下文. 本篇涉及到的名词:预执行,执行上下文,变量对象,活动对象,作用域链,this等 二.预执行 在上 ...