集群及LVS
集群:一组通过高速网络互联的计算组,并以单一系统的模式加以管理
将很多服务器集中起来一起,提供同一种服务,在客户端看来就象是只有一个服务器
可以在付出较低成本的情况下获得在性能、可靠性、灵活性方面的相对较高的收益
任务调度是集群系统中的核心技术
集群的目的:
集群分类:
LVS概述
LVS项目介绍
LVS集群组成:
前端:负载均衡层——由一台或多台负载调度器构成
中间:服务器群组层——由一组实际运行应用服务的服务器组成
底端:数据共享存储层——提供共享存储空间的存储区域
LVS术语:
Director Server:调度服务器——将负载分发到Real Server的服务器
Real SErver:真实服务器——真正提供应用服务的服务器
VIP:虚拟IP地址——公布给用户访问的虚拟IP地址
RIP:真实IP地址——集群节点上使用的IP地址
DIP:调度器连接节点服务器的IP地址
LVS工作模式:
VS/NAT:通过网络地址转换实现的虚拟服务器
大并发访问时,调度器的性能成为瓶颈
VS/DR:直接使用路由技术实现虚拟服务器
节点服务器需要配置VIP,注意MAC地址广播(生产环境中最常用)
VS/TUN:通过隧道方式实现虚拟服务器
负载均衡调度算法:LVS目前实现了10种调度算法
常用调度算法有4种:轮询、加权轮询、最少连接、加权最少连接
轮询(Round Robin):将客户端请求平均分发到Real Server
加权轮询(Weighted Round Robin):根据Real Server权重进行轮询调度
最少连接(Least Connections):选择连接最少的服务器
加权最少连接(Weighted Least Connections):根据Real Server权重值,选择连接最少的服务器
源地址散列(Source Hashing):根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器——hash运算分发
其他调度算法:基于局部性的最少链接、带复制的基于局部性最少链接、目标地址散列(Destination Hashing)、最短的期望的延迟、最少队列调度
LVS-NAT集群
LVS负载均衡技术是通过IPVS模块实现的
IPVS模块已成为Linux组成部分
[root@lvs33 ~]# grep -i "ipvs" /boot/config-2.6.32-573.el6.x86_64
# IPVS transport protocol load balancing support
# IPVS scheduler
# IPVS application helper
操作流程
Real Server:配置web服务器
Director Server:在上安装并启用ipvsadm;创建虚拟服务器;向虚拟服务器中加入节点
Client:连接虚拟服务器测试
部署lvs/nat的LB集群:
一、环境准备:
[root@lvs33 ~]# vim /etc/sysctl.conf //打开ip_forward
[root@lvs33 ~]# sed -n "7p" /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@lvs33 ~]# sysctl -a | grep ip_forward
[root@lvs33 ~]# sysctl -p
2. 有2台主机做网站服务器
[root@web44 ~]# yum -y install httpd
[root@web44 ~]# service httpd start
[root@web44 ~]# echo "CCCCCCCCCCC" > /var/www/html/test.html
[root@web44 ~]# chkconfig httpd on
[root@web44 ~]# ping -c 2 192.168.4.33
[root@web55 ~]# yum -y install httpd
[root@web55 ~]# service httpd start
[root@web55 ~]# echo "DDDDDDDDDD" > /var/www/html/test.html
[root@web55 ~]# chkconfig httpd on
[root@web55 ~]# ping -c 2 192.168.4.33
3. 1台机器做客户端
[root@client22 ~]#
[root@web44 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=192.168.4.33
[root@web44 ~]# service network restart
[root@web44 ~]# route -n
[root@web55 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
GATEWAY=192.168.4.33
[root@web55 ~]# service network restart
[root@web55 ~]# route -n
[root@client22 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=192.168.2.33
[root@client22 ~]# service network restart
[root@client22 ~]# route -n
[root@client22 ~]# ping -c 2 192.168.4.33
[root@client22 ~]# ping -c 2 192.168.4.44
[root@client22 ~]# ping -c 2 192.168.4.55
1. 安装提供linux虚拟服务的软件包
[root@lvs33 ~]# rpm -q ipvsadm || rpm -ivh /mnt/LoadBalancer/ipvsadm-1.26-4.el6.x86_64.rpm
[root@lvs33 ~]# ipvsadm -v
[root@lvs33 ~]# which ipvsadm
[root@lvs33 ~]# ipvsadm --help
[root@lvs33 ~]# man ipvsadm //查看ipvsadm用法
ipvsadm用法:
创建虚拟服务器:-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
添加、删除服务器节点:-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式
-g 使用DR模式
-i 使用TUN模式
-w 为节点服务器设置权重,默认为1
表 ipvsadm语法格式
[root@lvs33 ~]# ipvsadm -A -t 192.168.2.33:80 -s rr -p 30
[root@lvs33 ~]# ipvsadm -a -t 192.168.2.33:80 -r 192.168.4.44:80 -m
[root@lvs33 ~]# ipvsadm -a -t 192.168.2.33:80 -r 192.168.4.55:80 -m
[root@lvs33 ~]# service ipvsadm save //保存所有规则
也可用ipvsadm-save >/etc/sysconfig/ipvsadm
[root@lvs33 ~]# cat /etc/sysconfig/ipvsadm
-A -t 192.168.2.33:80 -s rr
-a -t 192.168.2.33:80 -r 192.168.4.44:80 -m -w 1
-a -t 192.168.2.33:80 -r 192.168.4.55:80 -m -w 1
[root@lvs33 ~]# chkconfig --list ipvsadm
[root@lvs33 ~]# chkconfig ipvsadm on
5. 查看配置
[root@lvs33 ~]# ipvsadm -Ln //查看LVS状态,这两个选项不能写反
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.2.33:80 rr
-> 192.168.4.44:80 Masq 1 0 0
-> 192.168.4.55:80 Masq 1 0 0
修改集群服务器设置
[root@lvs33 ~]# ipvsadm -E -t 192.168.2.33:80 -s lc //修改Director调度算法
[root@lvs33 ~]# ipvsadm -E -t 192.168.2.33:80 -s wrr //wrr加权轮询
[root@lvs33 ~]# ipvsadm -d -t 192.168.2.33:80 -r 192.168.4.44:80 //删除
[root@lvs33 ~]# ipvsadm -Ln
[root@lvs33 ~]# ipvsadm -a -t 192.168.2.33:80 -r 192.168.4.44:80 -m //添加
[root@lvs33 ~]# ipvsadm -Ln
[root@lvs33 ~]# service ipvsadm save
[root@lvs33 ~]# ipvsadm -C //清空所有规则
[root@lvs33 ~]# ipvsadm -e -t 192.168.2.33:80 -r 192.168.4.55:80 -w 2 -m
[root@lvs33 ~]# ipvsadm -Ln --stats
[root@client22 ~]# yum -y install elinks
[root@client22 ~]# elinks --dump http://192.168.2.33/test.html
[root@client22 ~]# ab -c 10 -n 1000 http://192.168.2.33/test.html //使用ab进行大并发测试
部署LVS/DR的LB集群:
广播包在相同网络内的主机都能够收到
操作流程
Real Server:配置web服务器;配置辅助IP地址、调整内核参数
Director Server:在上安装并启用ipvsadm;创建虚拟服务器;向虚拟服务器中加入节点
Client:连接虚拟服务器测试
ARP广播的问题:
当客户端发起访问VIP对应的域名的请求时,根据网络通信原理会产生ARP广播;
因为负载均衡器和真实的服务器在同一网络并且VIP设置在集群中的每个节点上;
此时集群内的真实服务器会尝试回答来自客户端的ARP广播,这就会产生问题,大家都说我是“VIP”
内核参数说明:
arp_ignore(定义回复ARP广播的方式):
0(默认值):回应所有的本地地址ARP广播,本地地址可以配置在任意网络接口
1:只回应配置在入站网卡接口上的任意IP地址ARP广播
arp_announce:
0(默认值):使用配置在任意网卡接口上的本地IP地址
2:对查询目标使用最适当的本地地址。在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址。首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址。如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送
使用ARP防火墙禁止对VIP的ARP请求
[root@client22 ~]# yum -y install arptables_if //装包未成功,另找时间尝试
[root@client22 ~]# arptables -A IN -d
[root@client22 ~]# arptables -A OUT -s
环境准备:
[root@lvs33 ~]# ifdown eth1
[root@web44 ~]# route del default gw 192.168.4.33
[root@web55 ~]# route del default gw 192.168.4.33
2、清空lvs nat配置
[root@lvs33 ~]# ipvsadm -C
[root@lvs33 ~]# service ipvsadm save
[root@lvs33 ~]# ipvsadm -Ln
[root@lvs33 ~]# cat /etc/sysconfig/ipvsadm
3、
[root@client22 ~]# ping -c 2 192.168.4.96 //验证未被使用
[root@web44 ~]# echo "ifconfig lo:1" >> /etc/rc.local
[root@web44 ~]# echo "ifconfig lo:1 192.168.4.96/32" >> /etc/rc.local
[root@web55 ~]# echo "ifconfig lo:1" >> /etc/rc.local
[root@web55 ~]# echo "ifconfig lo:1 192.168.4.96/32" >> /etc/rc.local
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
sysctl -p
[root@lvs33 ~]# echo "ifconfig eth0:1" >> /etc/rc.local
[root@lvs33 ~]# echo "ifconfig eth0:1 192.168.4.96/32" >> /etc/rc.local
[root@lvs33 ~]# ipvsadm -A -t 192.168.4.96:80 -s rr
[root@lvs33 ~]# ipvsadm -a -t 192.168.4.96:80 -r 192.168.4.44:80 -g
[root@lvs33 ~]#ipvsadm -a -t 192.168.4.96:80 -r 192.168.4.55:80 //这里-g可省略
[root@lvs33 ~]# ipvsadm -Ln
[root@lvs33 ~]# service ipvsadm save
[root@lvs33 ~]# ipvsadm -Ln
[root@lvs33 ~]# cat /etc/sysconfig/ipvsadm
[root@lvs33 ~]# ipvsadm -Ln --stats
[root@client22 ~]# yum -y install elinks
[root@client22 ~]# elinks --dump http://192.168.4.96/test.html
[root@lvs33 ~]# ipvsadm -Ln --stats
总结:
LVS/NAT地址转换模式
LVS/DR直接路由模式
分发器接收到连接请求后, 根据调度算法,分发连接请求给指定的real server,real server直接和客户端通信。
Vip地址要与real server在一个网段内
1、清理lvs配置
[root@lvs33 ~]# ipvsadm -D -t 192.168.4.33:80
[root@lvs33 ~]# systemctl stop ipvsadm.service
不管是LVS的VIP,还是内核参数的调整,在HAProxy中都不是必须的,但是也不会对HAProxy产生任何影响,所以不必清除
LAMP分离结构
1、准备三台虚拟机
vh01.tedu.cn 192.168.4.1
vh02.tedu.cn 192.168.4.2
vh03.tedu.cn 192.168.4.3
2、初始化配置
防火墙、selinux、IP地址、主机名、YUM
3、在vh01上配置数据库
[root@vh01 ~]# yum install -y mariadb-server
[root@vh01 ~]# systemctl start mariadb
[root@vh01 ~]# systemctl enable mariadb.service
[root@vh01 ~]# mysql -uroot
MariaDB [(none)]> grant all on *.* to 'admin'@'192.168.4.2' identified by 'tedu.cn';
MariaDB [(none)]> grant all on *.* to 'admin'@'192.168.4.3' identified by 'tedu.cn';
4、在两台web服务器上安装软件包并启动服务
[root@vh02 ~]# yum install -y httpd php php-mysql
[root@vh02 ~]# systemctl start httpd
[root@vh02 ~]# systemctl enable httpd.service
5、在vh02上安装Discuz
[root@vh02 ~]# unzip Discuz_X3.0_SC_UTF8.zip
[root@vh02 ~]# cp -r upload/ /var/www/html/bbs
[root@vh02 bbs]# firefox http://192.168.4.2/bbs &
改权限
将web页面中权限不满足要求的数据复制到/var/www/html/a.txt中
[root@vh02 bbs]# pwd
/var/www/html/bbs
[root@vh02 bbs]# chmod 777 $(awk '{print $1}' /var/www/html/a.txt)
6、将vh02上的bbs目录打包拷贝到vh03,解压缩
LVS nat模式
1、修改web服务器网关
# nmtui
# ifdown eth0; ifup eth0
2、配置调度器有双网卡地址
eth2: 201.1.1.4/24
3、打开路由转发功能
[root@vh04 ~]# sysctl -a | grep ip_forward 查看
[root@vh04 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@vh04 ~]# sysctl -p
4、安装
[root@vh04 ~]# yum install -y ipvsadm
5、配置
[root@vh04 ~]# ipvsadm -A -t 201.1.1.4:80 -s rr
[root@vh04 ~]# ipvsadm -a -t 201.1.1.4:80 -r 192.168.4.2 -m -w 2
[root@vh04 ~]# ipvsadm -a -t 201.1.1.4:80 -r 192.168.4.3 -m
6、验证
[root@vh04 ~]# ipvsadm -Ln
[root@room9pc16 ~]# firefox http://201.1.1.4/bbs &
每隔1秒运行一次ipvsadm -Ln
[root@vh04 bin]# watch -n 1 ipvsadm -Ln
7、保存规则
[root@vh04 bin]# /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm
8、重启服务
[root@vh04 bin]# systemctl restart ipvsadm.service
9、修改调度算法为lc
[root@vh04 bin]# ipvsadm -E -t 201.1.1.4:80 -s lc
10、每次发送10个请求,一共发送100个
[root@room9pc16 ~]# ab -n 100 -c 10 http://201.1.1.4/
LVS DR模式
1、清理vh04的配置,清除201.1.1.4ip地址,清除LVS规则
如果后台脚本还在运行,先杀掉后台进程
[root@vh04 bin]# jobs
[1]+ 运行中 bash monitor_web.sh &
[root@vh04 bin]# kill %1
清除IP地址
[root@vh04 bin]# vim /etc/sysconfig/network-scripts/ifcfg-eth2
[root@vh04 bin]# ifdown eth2
清除规则
[root@vh04 bin]# ipvsadm -D -t 201.1.1.4:80
[root@vh04 bin]# systemctl restart ipvsadm.service
2、在调度器上配置vip
[root@vh04 bin]# cp /etc/sysconfig/network-scripts/ifcfg-eth0{,:0}
[root@vh04 bin]# vim /etc/sysconfig/network-scripts/ifcfg-eth0:0
修改以下三行
NAME=eth0:0
DEVICE=eth0:0
IPADDR=192.168.4.100
[root@vh04 bin]# ifup eth0:0
3、在web服务器上配置vip
[root@vh02 ~]# cp /etc/sysconfig/network-scripts/ifcfg-lo{,:0}
[root@vh02 ~]# vim /etc/sysconfig/network-scripts/ifcfg-lo:0
DEVICE=lo:0
IPADDR=192.168.4.100
NETMASK=255.255.255.255
NETWORK=192.168.4.100
BROADCAST=192.168.4.100
ONBOOT=yes
NAME=loopback
[root@vh02 ~]# ifup lo:0
[root@vh02 ~]# scp /etc/sysconfig/network-scripts/ifcfg-lo:0 192.168.4.3:/etc/sysconfig/network-scripts/
[root@vh03 html]# ifup lo:0
4、在两台web服务器上修改内核参数
[root@vh02 ~]# sysctl -a | grep arp_ig
[root@vh02 ~]# echo 'net.ipv4.conf.all.arp_ignore = 1' >> /etc/sysctl.conf
[root@vh02 ~]# echo 'net.ipv4.conf.lo.arp_ignore = 1' >> /etc/sysctl.conf
[root@vh02 ~]# sysctl -a | grep arp_an
[root@vh02 ~]# echo "net.ipv4.conf.all.arp_announce = 2" >> /etc/sysctl.conf
[root@vh02 ~]# echo "net.ipv4.conf.lo.arp_announce = 2" >> /etc/sysctl.conf
[root@vh02 ~]# sysctl -p
5、配置LVS规则,不写或者使用-g选项,都表示DR模式
[root@vh04 bin]# ipvsadm -A -t 192.168.4.100:80 -s lc
[root@vh04 bin]# ipvsadm -a -t 192.168.4.100:80 -r 192.168.4.2
[root@vh04 bin]# ipvsadm -a -t 192.168.4.100:80 -r 192.168.4.3 -g
[root@vh04 bin]# ipvsadm -Ln