[toc]html
在本实验环境中咱们没有办法为你们提供多台服务器来模拟集群环境,由此咱们 docker 工具来建立多个 container 来模拟集群所须要的多台服务器。前端
docker 能够简单的理解为很是轻量级的虚拟机工具,而 container 则理解为建立的虚拟机。nginx
集群系统中,服务器资源能够简单分为两种角色:web
整个集群系统结构:算法
咱们将经过这样的一些步骤来完成这次的实验:docker
LVS 成功测试:咱们可以经过 VIP 访问咱们的 Nginx 站点,通过屡次的刷新咱们可以访问另外一个站点的内容(以显示的内容以做区分,由于负载并不高,因此须要不少次刷新,点击地址栏,按住 F5 不放)ubuntu
首先为了可以使用 IPVS 内核模块,咱们将在宿主机中安装 ipvsadm,并尝试可否使用:vim
# 更新源 sudo apt-get update # 安装 ipvsadm 工具 sudo apt-get install ipvsadm # 尝试使用 ipvsadm sudo ipvsadm -L
使用 docker 建立所需 container,使用如下命令建立:后端
docker run --privileged --name=RealServer1 -tdi ubuntu docker run --privileged --name=RealServer2 -tdi ubuntu
命令讲解:浏览器
docker run:建立 docker 容器
name 参数:给容器命名,方便区分
tid 参数:分配 tty,可以与之交互
ubuntu:指定容器镜像,这里使用 ubuntu 镜像
建立命令执行完成后,目前有两个 container:
RealServer1:IP 地址为 192.168.0.2。下文简称 RIP1 RealServer2:IP 地址为 192.168.0.3。下文简称 RIP2
能够经过 ifconfig 命令查看各自的 IP 地址,此处的地址是由于按顺序,且按默认配置建立所致使
RealServer 部署 Nginx 来提供 Web 服务,RealServer1 和 RealServer2 操做步骤相同,此处以 RealServer1 为示例:
首先登陆 RealServer1:
# 经过 attach 命令登陆 RealServer1 docker attach RealServer1
安装相关工具
apt-get update apt-get install vim -y apt-get install nginx -y service nginx start
按 i 键插入,按 esc 再输入 :wq 保存退出。
注意若完成了 RealServer1 的配置以后,若是咱们不想打开新的终端,能够经过 ctrl+p+q 的组合快捷键脱离当前机器的登陆,切勿使用 exit 的方式退出 container,这样的方式关闭服务器的。 脱离以后便会返回到 shiyanlou 的 zsh 交互,能够经过 docker attach RealServer2 的命令来登陆另外一台机器,而后作相似的操做(同上的软件安装操做以及 nginx 启动操做) 接下来就修改 nginx 页面,以下所示:
#在 RealServer2 container 环境 vi /usr/share/nginx/html/index.html
完成两台服务器的配置以后,咱们经过 service nginx start 启动服务器中 nginx 服务。
至此咱们完成两台 Web 服务器的配置,咱们能够打开宿主机 firefox 浏览器,地址栏分别输入两个 IP 地址,来检验咱们的配置成功:
sudo service nginx stop
LoadBalancer 的对外 IP 地址为 VIP,即 VIP 地址为 120.26.15.9 (注意,你的 VIP 地址可能和个人不同,根据本身实际状况来)。对内 IP 称为 RIP,此时 RIP 为 192.168.0.1。
echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward
查看当前机器内核路由转发开启状况:
cat /proc/sys/net/ipv4/ip_forward
获得的值为 1,说明此机器已开启内核路由转发。进行下一步。
sudo ipvsadm -A -t 120.26.15.9:80 -s rr #定义集群服务 sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.2 -m #添加 RealServer1 sudo ipvsadm -a -t 120.26.15.9:80 -r 192.168.0.3 -m #添加 RealServer2 sudo ipvsadm -l #查看 ipvs 定义的规则
上面命中 ipvsadm 参数讲解:
# 添加集群服务 -A:添加一个新的集群服务 -t: 使用 TCP 协议 -s: 指定负载均衡调度算法 rr:轮询算法(LVS 实现了 8 种调度算法) 120.26.15.9:80 定义集群服务的 IP 地址(VIP) 和端口 # 添加 Real Server 规则 -a:添加一个新的 RealServer 规则 -t:tcp 协议 -r:指定 RealServer IP 地址 -m:定义为 NAT 上面命令添加了两个服务器 RealServer1 和 RealServer2
分别登入两台宿主机,讲nginx服务分别打开
打开浏览器,输入 VIP 地址:120.26.15.9:
由于访问压力比较小,调度算法不会请求切换服务器,能够按住 F5 快速屡次刷新查看页面变化效果 以上便实现了 LVS 的 NAT 负载均衡系统。
与 NAT 方式相同,咱们将经过 docker 来模拟咱们的集群环境。
集群系统中,服务器资源能够简单分为两种角色:
整个集群系统结构:
如果咱们沿用 NAT 的实验环境,咱们须要作环境的清理:
1.首先清除 ipvsadm 的规则:
sudo ipvsadm -C
2.删除以前所建立的 container,虽然都是提供 Web 服务,可是在 DR 模式中须要修改内核参数与建立网卡别名,须要超级权限,因此不能沿用以前的 container:
# 关闭全部的 container docker stop `docker ps -aq` # 删除全部的 container docker rm `docker ps -aq`
3.安装 ipvsadm 工具
由于在 NAT 实验中咱们已安装因此可跳过该步骤,如果新启动的环境请参考 NAT 中的步骤,此处提示务必在宿主机环境中执行 ipvsadm -L 的验证步骤,如果不执行该步骤,在 LoadBalancer 的 container 中咱们将没法加载 IPVS 的内核模块。
docker run --privileged --name=LoadBalancer -tid ubuntu docker run --privileged --name=RealServer1 -tid ubuntu docker run --privileged --name=RealServer2 -tid ubuntu
首先登陆 RealServer1:
# 经过 attach 命令登陆 RealServer1 docker attach RealServer1
安装相关工具
apt-get update apt-get install vim -y apt-get install nginx -y vi /usr/share/nginx/html/index.html service nginx start
1.修改内核参数
以 RealServer1 为例,登陆 container:
执行下列命令:
# 设置只回答目标IP地址是来访网络接口本地地址的ARP查询请求 echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore # 为了保险本身能够查看一下是否成功修改 cat /proc/sys/net/ipv4/conf/lo/arp_ignore # 设置对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通讯的本地地址.首要是选择全部的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 若是没有合适的地址被发现,将选择当前的发送网络接口或其余的有可能接受到该ARP回应的网络接口来进行发送. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce # 使得上面的配置当即生效 sysctl -p
ARP 的内核参数: arp_ignore 部分参数:定义了本机响应 ARP 请求的级别
0表示目标 IP 是本机的,则响应 ARP 请求。默认为 0
1若是接收 ARP 请求的网卡 IP 和目标 IP 相同,则响应 ARP 请求
arp_announce 参数:定义了发送 ARP 请求时,源 IP 应该填什么。
0 表示使用任一网络接口上配置的本地 IP 地址,一般就是待发送的 IP 数据包的源 IP 地址 。默认为 0
1 尽可能避免使用不属于该网络接口(即发送数据包的网络接口)子网的本地地址做为 ARP 请求的源 IP 地址。大体的意思是若是主机包含多个子网,而 IP 数据包的源 IP 地址属于其中一个子网,虽然该 IP 地址不属于本网口的子网,可是也能够做为ARP 请求数据包的发送方 IP。
2 表示忽略 IP 数据包的源 IP 地址,老是选择网络接口所配置的最合适的 IP 地址做为 ARP 请求数据包的源 IP 地址(通常适用于一个网口配置了多个 IP 地址)
只有目的 IP 是本机器中的一员时才会作相应的处理,因此须要添加网卡别名:
# 配置虚拟IP ifconfig lo:0 192.168.0.10 broadcast 192.168.0.10 netmask 255.255.255.255 up # 添加路由,由于本就是相同的网段因此能够不添加该路由 route add -host 192.168.0.10 dev lo:0 service networking restart
ifconfig eth0:0 192.168.0.10 netmask 255.255.255.0 up
查看网卡信息:ifconfig
在 LoadBalancer 中添加 IPVS 规则:
ipvsadm -A -t 192.168.0.10:80 -s rr # 定义集群服务 ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.3 -g # 添加 RealServer1 ipvsadm -a -t 192.168.0.10:80 -r 192.168.0.4 -g # 添加 RealServer2 ipvsadm -l # 查看 ipvs 定义的规则
ipvsadm 命令参数讲解:
# 添加集群服务 -A:添加一个新的集群服务 -t: 使用 TCP 协议 -s: 指定负载均衡调度算法 rr:轮询算法(LVS 实现了 8 种调度算法) 192.168.0.10:80 定义集群服务的 IP 地址(VIP) 和端口 # 添加 Real Server 规则 -a:添加一个新的 RealServer 规则 -t:tcp 协议 -r:指定 RealServer IP 地址 -g:定义为 DR 模式 上面命令添加了两个集群服务器 RealServer1 和 RealServer2
LVS 成功测试:咱们可以经过 VIP 访问咱们的 Nginx 站点,通过屡次的刷新咱们可以访问另外一个站点的内容(以显示的内容以做区分,由于负载并不高,因此须要不少次刷新,点击地址栏,按住 F5 不放)
查看 ipvsadm 中的统计数据。