通过 vmare 实现 linux 虚拟机集群的搭建,通过 vmware 的 nat 模式与 window 主机进行通信, lvs 三种模式的原理概述。lvs 调度方法。了解用户态和内核态以及两者间的切换(即为何将 ipvs 放入内核)。搭建 DR 类型的实现。
1. 前置
- 软件列表
- vmware workstation pro
- centos6 minimal
- 预先知识
- linux 基础
- vi/vim 基本使用
- 计算机网络基础
2. linux 集群搭建
2.1. 模版 minimal 系统安装
- 新建虚拟机
- 选择自定义安装
- !!在安装客户机操作系统时,选择稍后安装操作系统
- 否则会自动安装 vmware-tool 软件
- 但因为 centos6 minimal 并没有图形界面,会卡死导致
- 选择客户机操作系统,linux-> centos 64 位(根据系统类型选择)
- 命名虚拟机。此后虚拟机都会通过该虚拟机克隆,最好命名清楚。此处命名为 centos0
- 选择安装位置,可以自定义
- 选择 NAT 模式
- 最大磁盘大小:随便
- 注意:可以分大些,最大磁盘大小只是最多能真有多少
- 不会预先分配空间
- 实际占用可能 1G 不到
- 可以适当分大些
- 之后一路确定
- 完成后,再点击 CD/DVD 选择 linux 系统映像文件
- 启动系统,进行安装
- 此处选择自定义安装
- 分区:
- /boot 200MB
- swap 2G
- / 剩下所有
- 之后根据提示完成安装即可
2.2. 模版 minimal 系统配置
2.2.1. 配置文件说明
linux 中的默认网卡配置在 /etc/sysconfig/network-scripts/ifcfg-eth0
里,ifcfg-eth0 是网卡 eth0 的配置,eth0 是默认网卡。
同时也有一个 ifcfg-lo 配置文件,是本地回环地址 127.0.0.1 对应网卡。
输入命令 ifconfig 可以发现 linux 存在两个网卡,分别是 ech0 和 lo。但 lo 并未分配 mac 地址,因为只是本地回环
可以通过创建
ifcfg-网卡名
来新增网卡配置
然后就是 /etc/udev/rules.d/70-persistent-net.rules
文件,内容:
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.
# PCI device 0x8086:0x100f (e1000)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:0c:2b:31", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
该文件是通过读取硬件信息自动生成(因此之后会将该文件删除后在进行克隆,由 vmare 分配的 mac,在系统启动时会重新生成)的,
可以在 vmware 中查看虚拟机设置中的 网络适配器–>高级 查看 vmware 分配的 mac 地址。
同时注释中也提到只可以修改NAME=key
,来为网卡接口配置。
- 网卡配置信息和 mac 地址的对应关系可以在
/etc/sysconfig/network-scripts/ifcfg-eth0
中进行配置,也就是添加HWADDR
一项。 - 也可以在
/etc/udev/rules.d/70-persistent-net.rules
中。也就是修改NAME
一项
图示:
此处选择后者进行 mac 地址的配置。因为之后通过拷贝创建其他系统时,所有配置文件都会被复制,
为了防止 mac 重复,
这里会删除ifcfg-eth0
中的 mac 地址,通过第二种方式来配置网卡接口对应 mac。
同时删除/etc/udev/rules.d/70-persistent-net.rules 文件
- 如果虚拟机保留 /etc/udev/rules.d/70-persistent-net.rules 这个文件,在通过该虚拟机克隆的时候:
- 1,文件被带到新的虚拟机中
- 2,mac 地址会产生重复,同时重复的那条也没有硬件对应。同时会新增一条 mac 地址
可以之后拿子虚拟机试试。(vmware 虚拟机–>网络适配器–>高级 中中可以更改 mac 地址)
- 3,ech0 不可用
- 因此要在克隆前删除该文件(模版机重启后也会重新生成该文件)
- 然后在子机器重新启动时自动生成该文件
2.2.2. 配置流程
- 步骤:
- 配置 ip 地址
vi /etc/sysconfig/network-scripts/ifcfg-eth0
,通过 vi 进行编辑- 注释或删除 mac 地址
- ONBOOT 设置为 yes,即开机激活网卡
- 修改 BOOTPROTO 为 static,关闭 dhcp,使用手工配置
通过自行指定 ip 而不使用 DHCP 是为了搭建集群后更容易访问。否则每次都要通过 ifconfig 查看分配的 ip
- 注释或删除 UUID (可选)
- 查看虚拟网络适配器中 nat 模式中的子网 ip
- 添加分配 ip(根据子网 ip),掩码(255.255.255.0)信息
- 添加网关(子网 ip 最后一段改为.2)
- 添加 dns 解析地址
- 示例:
DEVICE=eth0 # 网卡接口名称 # HWADDR=00:0C:29:8C:B7:11 # mac地址 TYPE=Ethernet # 网卡类型 # UUID=76056e74-5a1d-4c53-bde8-38b40e21303e ONBOOT=yes #系统启动时是否激活 yes|no BOOTPROTO=static # 启用地址协议 –static:静态协议 –bootp:协议 –dhcp:协议 -none:不指定协议[最好指定] NM_CONTROLLED=yes IPADDR=192.168.187.101 # 分配的ip地址 网络号为192.168.187.0,可以取192.168.187.1,192.168.187.2意外的其他ip(原因在nat模式讲解处) NETMASK=255.255.255.0 # 子网掩码地址 GATEWAY=192.168.187.2 # 网卡网关地址,之后对详细说明 DNS1=114.114.114.114 # DNS1地址
- 重新加载配置文件
service network restart
- ifconfig 检查,ping 检查,没问题的话进行下一步
- 关闭防火墙
- service iptables stop 关闭防火墙
- chkconfig 可以查看开启运行和关闭服务清单(3 代表命令行模式)
- chkconfig iptables off 禁用防火墙
- 关闭安全检查
- vi /etc/selinux/config
- SELINUX=disabled
- 作用;
- 比如虚拟机内部时间错误的话,内核级别会把虚拟机置成只读
- 还有各种各种功能限制
- vi /etc/selinux/config
- 删除
70-persistent-net.rules
:rm -f /etc/udev/rules.d/70-persistent-net.rules
poweroff
关机- 为模版虚拟机拍摄快照
- 配置 ip 地址
2.3. 克隆以及配置
2.3.1. 克隆
- 选择模板机快照
- 点击克隆
- 从现有快照克隆
- 创建链接快照
- 重命名为 centos01,选择虚拟机位置
- 克隆完成
- 再重复三次
注意:在 vmare 中查看 mac 地址的话,mac 地址在重启时才会更新
2.3.2. 克隆机配置
- 四个虚拟机修改 ip
vi /etc/sysconfig/network-scripts/ifcfg-eth0
最后只要不是 1 和 2 就行,此处从 100 开始
- 修改 ip 地址为 xxx.xxx.xxx.101
- service network restart
- 修改 ip 地址为 xxx.xxx.xxx.102
- service network restart
- 修改 ip 地址为 xxx.xxx.xxx.103
- service network restart
- 修改 ip 地址为 xxx.xxx.xxx.104
- service network restart
- 修改 ip 地址为 xxx.xxx.xxx.101
- 四个虚拟机修改主机名
vi /etc/sysconfig/network
如果进入公司的话,这部分交给运维做较好,主机名不要随便修改。
- 修改 hostname 为 node0001
- 重启
- 修改 hostname 为 node0002
- 重启
- 修改 hostname 为 node0003
- 重启
- 修改 hostname 为 node0004
- 重启
- 修改 hostname 为 node0001
修改 hosts 是为了更方便访问
-
四个虚拟机修改 hosts
vi /etc/hosts
# 添加一下四条 不一定是187,要根据自己vmware中的配置 192.168.187.101 node0001 192.168.187.102 node0002 192.168.187.103 node0003 192.168.187.104 node0004
-
window 修改 host
# 添加一下四条 不一定是187,要根据自己vmware中的配置 192.168.187.101 node0001 192.168.187.102 node0002 192.168.187.103 node0003 192.168.187.104 node0004
-
四个虚拟机拍摄快照
以后搞崩了系统可以还原
3. vmare-nat 模式原理
4. lvs
4.1. 定义及术语
简介:LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器,是一个由章文嵩博士发起的自由软件项目,官方站点是:http://www.linuxvirtualserver.org。现在LVS已经是Linux标准内核的一部分。
特点: lvs 解析到第四层传输层,只关心 port,状态。
交换机解析到第二层链路层,只关心 mac 地址。路由器解析到第三层网络层,只关心 ip 和路由表。
nginx 需要解析到第七层应用层。nginx 也可以做负载均衡服务器,但因为内解析更多,速度相对于 lvs 更慢
目标:通过 LVS 提供的负载均衡技术和 Linux 操作系统实现一个高性能,高可用的服务器群集,它具有良好的可靠性、可扩展性和可操作性。从而以低廉的成本实现最优的服务性能
术语:
- DS:Director Server。指的是前端负载均衡器节点。
- RS:Real Server。后端真实的工作服务器。
- VIP:Virtual Service IP,向外部直接面向用户请求,作为用户请求的目标的 IP 地址。
- DIP:Director Server IP,主要用于和内部主机通讯的 IP 地址。
- RIP:Real Server IP,后端服务器的 IP 地址。
- CIP:Client IP,访问客户端的 IP 地址
架构:
CIP 发送数据包到负载均衡服务器(CIP–>VIP),负载均衡服务器根据指定的调度算法,将数据包转发到 RIP(DIP–>RIP)
数据包只通过负载均衡服务器进行转发,类似路由,不会进行三次握手和四次挥手
在实际应用中,所有 RS 中的服务器互为镜像
4.2. 种类
4.2.1. D_NAT 地址转换
请求数据包流程:
(CIP–>VIP 是指 ip 数据报中的源 ip 和目的 ip)
响应数据包流程:
为何响应数据包也需要经过 lvs?
客户端发送的数据包为 CIP–>VIP,所以会接收的数据包为 VIP–>CIP。而 RS 发送的数据包为 RIP–>CIP,不修改源 ip 的话无法被客户端接收
4.2.2. DR 直接路由
使用最多
出现缘由: 网络 io 具有非对称性,比如下载文件时,一个 http 访问可能响应上 G 的文件,因此以往经常会通过限制上传速度而满足下载速度。但企业服务器对上传速度有较高要求,若依旧使用 D_NAt 模式,CIP–VIP 间的硬件设施会限制上传速度
模式优化:
三个 VIP 是一个地址,只不过内部 VIP 地址仅仅为了 RIP 在接收数据包后不丢弃。这个网络中只有一个 VIP
流程;
4.2.3. TUN 隧道
如果是 vpn,client 就是用户使用的手机或电脑,负载均衡服务器就是中国香港的服务器, RS 就是外网服务器。
5. lvs-DR 的具体实现
5.1. 原理
具体拓扑图:
- 红线:客户访问负载均衡服务器
- 蓝线:负载均衡服务器转发数据包到真是后端服务器
- 黄线:后端服务器返回响应数据包
5.2. 实现流程
5.2.1. 管理工具:
lvs 已经嵌入到 linux 内核中,为 ipvs 模块,为了对该模块进行管理,安装 ipvsadm 工具 yum install ipvsadm
5.2.2. 内部 vip 设置:
- /proc/sys/net/ipv4/ip_forword
- 0:默认值,在收到数据包的地址如果不是本机地址,默认会丢弃。(计算机作为边缘部分,本身不需要转发数据包)
- 1:计算机会进行转发(也就是路由器功能,此处为了转发给后端服务器,所以要进行开启)
- arp_ignore: 定义接收到 ARP 请求时的响应级别;
/proc/sys/net/ipv4/conf/all
/proc/sys/net/ipv4/conf/eth0 两个目录都要
默认 0 级别,会暴露内部 vip- 0:只要本地配置的有相应地址,就给予响应;
-
1:仅在请求的目标(MAC)地址配置请求 到达的接口上的时候,才给予响应;
一个网卡可以绑定多个地址,而为了配置内部 vip,要将 vip 配置在一块外部不可能访问到的网卡上。 ifconfig 查询网络配置可以发现,除了 eth0 网卡外,还有本地回环地址对应网卡 lo。因此可以把内部 vip 配置在 lo 网卡上。
- arp_announce:定义将自己地址向外通告时的通告级别;
/proc/sys/net/ipv4/conf/all
/proc/sys/net/ipv4/conf/eth0 两个目录都要
默认会自动往外通告,更新 arp 表,- 0:将本地任何接口上的任何地址向外通告;
比如 eth0 绑定两个 ip,ip1 向 ip1 对应网络中广播本机所有 ip,ip2 向 ip2 对应网络中广播本机所有 ip
这样会也会把 eth0 把内部 vip 广播出去 - 1:试图仅向目标网络通告与其网络匹配的地址;
-
2:仅向与本地接口上地址匹配的网络进行通告;
比如eth0绑定两个ip,ip1只能向ip1对应网络中广播,ip2只能向ip2对应网络中广播
- 0:将本地任何接口上的任何地址向外通告;
5.2.3. 调度算法
- 静态:
- rr:轮循
- wrr:
- dh:
- sh:
- 动态调度方法:
- lc: 最少连接
- wlc: 加权最少连接
- sed: 最短期望延迟
- nq: never queue
- LBLC: 基于本地的最少连接
- DH:
- LBLCR: 基于本地的带复制功能的最少连接
- 默认方法:wlc
每次转发请求lvs都会进行记录,用于调度算法
5.2.4. 实际流程
- 负载均衡服务器配置(此处选用192.168.187.101)
- 设置VIP
ifconfig eth0:8 192.168.187.100/24
- 开启数据包转发
echo 1 > /proc/sys/net/ipv4/ip_forward
因为是系统内核配置,只能通过重定向方式修改,且立即生效
- 设置VIP
- 两个后端服务器配置(192.168.187.102 , 192.168.187.103)
- 配置arp转发设置:
echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
- 设置内部VIP
ifconfig eth0:8 192.168.187.100 netmask 255.255.255.255
掩码为四个255原因: 最长匹配原则,所以环回接口配置 vip 有四个 255。192.168.187.100 会发送到本地环回接口 同时 192.168.187.xxx 的不会走本地环回接口(因为四个 255,ip 就是网络号)
- 配置arp转发设置:
- 两台后端服务器设置测试环境
- yum install httpd -y
vi /var/www/html/index.html
- 添加内容:
from 192.168.187.XXX
- 添加内容:
- service httpd start
直接访问后端服务器ip可以访问
访问VIP不可以访问(还没配置lvs)
- lvs配置
- yum install ipvsadm -y
- ipvsadm -A -t 192.168.187.100:80 -s rr
lvs 服务器可以监控不同的端口号,即不同集群,所以要先设置VIP,再为VIP设置RIP
添加VIP,使用轮询方式调度(为了更容易体现出调度过程) - ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.102 -g
为指定VIP添加后端服务器
- ipvsadm -a -t 192.168.187.100:80 -r 192.168.187.103 -g
为指定VIP添加后端服务器
- ipvsadm -ln
显示lvs状态(vip以及对应rip,以及调度情况)
- 浏览器刷新: 访问vip
可以发现网页内容再两个后端服务器间切换
- ipvsadm –lnc
查看分发记录
- netstat -natp
查看握手记录
会发现负载均衡服务器并没有参与握手(因为只是处理和转发数据包)
而后端服务器只和window(192.168.187.1)握手了
5.2.5. 命令列表:
- 管理集群服务
- 添加:
-A -t|u|f service-address [-s scheduler]
- -t: TCP协议的集群
- -u: UDP协议的集群
- service-address: IP:PORT
- f: FWM: 防火墙标记
- service-address: Mark Number
- 修改:-E
- 删除:
-D -t|u|f service-address
- 添加:
- 管理集群服务中的RS
- 添加:
-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
-t|u|f service-address
:事先定义好的某集群服务- -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
[-g|i|m]: LVS类型
- -g: DR
- -i: TUN
- -m: NAT
[-w weight]: 定义服务器权重
- 修改:-e
- 删除:
-d -t|u|f service-address -r server-address
例: ipvsadm -d -t 172.16.100.1:80 -r 192.168.10.8 –g ipvsadm -d -t 172.16.100.1:80 -r 192.168.10.9 -g
- 查看
-L|l
- -n: 数字格式显示主机地址和端口
- –stats:统计数据
- –rate: 速率
- –timeout: 显示tcp、tcpfin和udp的会话超时时长
- -c 显示当前的ipvs连接状况
- 添加:
- 删除所有集群服务
- -C:清空ipvs规则
- 保存规则
- -S
ipvsadm -S > /path/to/somefile
- -S
- 载入此前的规则:
- -R
ipvsadm -R < /path/form/somefile
- -R