母盘:
改时区,最小化安装,自动分区,关闭Enable kdump
关闭selinux,开机时按 E
输入selinux=0
[root@server1 ~]# hostnamectl set-hostname server1
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# cat rhel7.repo
[rhel7.6]
name=rhel7.6
baseurl=http://172.25.2.250/rhel7.6
gpgcheck=0
[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# vim ifcfg-eth0
[root@server1 network-scripts]# cat ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.2.1
PREFIX=24
GATEWAY=172.25.2.250
DNS1=114.114.114.114
[root@server1 ~]# systemctl restart network
[root@server1 ~]# systemctl disable NetworkManager
[root@server1 ~]# systemctl disable --now NetworkManager
[root@server1 ~]# yum install -y vim bash-* lftp
[root@server1 ~]# vim /etc/hosts
[root@server1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.2.1 server1
172.25.2.2 server2
172.25.2.3 server3
172.25.2.4 server4
172.25.2.5 server5
172.25.2.6 server6
172.25.2.250 foundation2.ilt.example.com
[root@server1 ~]# ls
[root@server1 ~]# rm -rf anaconda-ks.cfg
[root@server1 ~]# vim /etc/sysconfig/selinux
SELINUX=disabled
[root@server1 ~]# systemctl disable firewalld
[root@server1 ~]# poweroff
[root@foundation2 images]# ls
demo1 demo3 demo5 server1 server3 server5 vm2
demo2 demo4 rhel7.6.qcow2 server2 server4 vm1
当没有 virt-sysprep时,
yum install libguestfs-tools -y
[root@foundation2 images]# virt-sysprep -d rhel7.6(虚拟机母盘名字)
[root@foundation2 images]# virt-sparsify --compress rhel7.6.qcow2 rhel7.6-demo.qcow2
[root@foundation2 images]# du -h *
[root@foundation2 images]# rm -rf rhel7.6.qcow2
[root@foundation2 images]# qemu-img create -f qcow2 -b rhel7.6-demo.qcow2 vm1
[root@foundation2 images]# qemu-img create -f qcow2 -b rhel7.6-demo.qcow2 vm2
[root@server2 ~]# hostnamectl set-hostname server2
[root@server2 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@server2 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=172.25.2.2
PREFIX=24
GATEWAY=172.25.2.250
DNS1=114.114.114.114
[root@server2 ~]# systemctl restart network
LVS中文站点:http://zh.linuxvirtualserver.org/
LVS官网:http://www.linuxvirtualserver.org/
LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。
该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器,比如,轮询算法可以将外部的请求平均分发给后端的所有服务器,终端用户访问LVS调度器虽然会被转发到后端真实的服务器,但如果真实服务器连接的是相同的存储,提供的服务也是相同的服务,最终用户不管是访问哪台真实服务器,得到的服务内容都是一样的,整个集群对用户而言都是透明的。最后根据LVS工作模式的不同,真实服务器会选择不同的方式将用户需要的数据发送到终端用户。
LVS工作模式分为NAT模式、TUN模式、以及DR模式。
1_Load Balancer:负载均衡层
LVS的核心部分,负责将客户的请求按照一定的算法分发到下一层不同的服务器进行处理,自己本身不做具体业务的处理。另外该层还可用监控下一层的状态,如果下一层的某台服务器不能正常工作了,它会自动把其剔除,恢复后又可用加上。该层由一台或者几台Director Server组成。
2_Server Array:服务器群组层
该层负责具体业务。可有WEB Server、mail Server、FTP Server、DNS Server等组成。注意,其实上层的Director Server也可以当Real server用的。
3_Shared Storage:数据共享存储层
NAT(Network Address
Translation)即网络地址转换,其作用是通过数据报头的修改,使得位于企业内部的私有IP地址可以访问外网,以及外部用用户可以访问位于公司内部的私有IP主机。VS/NAT工作模式拓扑结构如图2所示,LVS负载调度器可以使用两块网卡配置不同的IP地址,eth0设置为私钥IP与内部网络通过交换设备相互连接,eth1设备为外网IP与外部网络联通。
第一步,用户通过互联网DNS服务器解析到公司负载均衡设备上面的外网地址,相对于真实服务器而言,LVS外网IP又称VIP(Virtual
IP Address),用户通过访问VIP,即可连接后端的真实服务器(Real
Server),而这一切对用户而言都是透明的,用户以为自己访问的就是真实服务器,但他并不知道自己访问的VIP仅仅是一个调度器,也不清楚后端的真实服务器到底在哪里、有多少真实服务器。
第二步,用户将请求发送至124.126.147.168,此时LVS将根据预设的算法选择后端的一台真实服务器(192.168.0.1~192.168.0.3),将数据请求包转发给真实服务器,并且在转发之前LVS会修改数据包中的目标地址以及目标端口,目标地址与目标端口将被修改为选出的真实服务器IP地址以及相应的端口。
第三步,真实的服务器将响应数据包返回给LVS调度器,调度器在得到响应的数据包后会将源地址和源端口修改为VIP及调度器相应的端口,修改完成后,由调度器将响应数据包发送回终端用户,另外,由于LVS调度器有一个连接Hash表,该表中会记录连接请求及转发信息,当同一个连接的下一个数据包发送给调度器时,从该Hash表中可以直接找到之前的连接记录,并根据记录信息选出相同的真实服务器及端口信息。
不足:
不足:
不足:
静态调度:
1.轮询调度Round Robin 简称’RR’
轮询调度(Round Robin 简称’RR’)算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。
2.加权轮询调度WRR
加权轮询(Weight Round Robin 简称’WRR’)算法主要是对轮询算法的一种优化与补充,LVS会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A的权值为1,服务器B的权值为2,则调度器调度到服务器B的请求会是服务器A的两倍。权值越高的服务器,处理的请求越多。
3目标地址散列调度DH
目标地址散列调度(Destination Hashing 简称’DH’)算法先根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。
4.源地址散列调度SH
动态调度
源地址散列调度(Source Hashing 简称’SH’)算法先根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且并未超载,将请求发送到该服务器,否则返回空。它采用的散列函数与目标地址散列调度算法的相同,它的算法流程与目标地址散列调度算法的基本相似。
5.最小连接调度 LC
最小连接调度(Least Connections 简称’LC’)算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。
(集群系统的真实服务器具有相近的系统性能,采用最小连接调度算法可以比较好地均衡负载。)
6.加权最小连接调度 WLC
加权最少连接(Weight Least Connections 简称’WLC’)算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。
7.基于局部的最少连接LBLC
基于局部的最少连接调度(Locality-Based Least Connections 简称’LBLC’)算法是针对请求报文的目标IP地址的 负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群客户请求报文的目标IP地址是变化的。这里假设任何后端服务器都可以处理任一请求,算法的设计目标是在服务器的负载基本平衡情况下,将相同目标IP地址的请求调度到同一台服务器,来提高各台服务器的访问局部性和Cache命中率,从而提升整个集群系统的处理能力。LBLC调度算法先根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则使用’最少连接’的原则选出一个可用的服务器,将请求发送到服务器。
8.带复制的基于局部性的最少连接LBLCR
带复制的基于局部性的最少连接(Locality-Based Least Connections with Replication 简称’LBLCR’)算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统,它与LBLC算法不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。按’最小连接’原则从该服务器组中选出一一台服务器,若服务器没有超载,将请求发送到该服务器;若服务器超载,则按’最小连接’原则从整个集群中选出一台服务器,将该服务器加入到这个服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。
9.最短的期望的延迟SED
最短的期望的延迟调度(Shortest Expected Delay 简称’SED’)算法基于WLC算法。举个例子吧,ABC三台服务器的权重分别为1、2、3 。那么如果使用WLC算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用SED算法后会进行一个运算
A:(1+1)/1=2 B:(1+2)/2=3/2 C:(1+3)/3=4/3 就把请求交给得出运算结果最小的服务器。
10.最少队列调度NQ
最少队列调度(Never Queue 简称’NQ’)算法,无需队列。如果有realserver的连接数等于0就直接分配过去,不需要在进行SED运算。
从2.4版本开始,linux内核默认支持LVS。要使用LVS的能力,只需安装一个LVS的管理工具:ipvsadm。
LVS的结构主要分为两部分:
ipvsadm -ln:查看添加的规则
Forward :转发方式
Weight:权重
ActiveConn:活动连接数
InActConn:非活动连接数
ipvsadm -ln -c:查看当前的IPVS连接
pro:协议
expire:还有多长时间过期
state:TCP状态
source:源地址:随机端口
virtual:虚拟集群服务
destination:被lvs-server调度到的RealServer
ipvsadm -ln --stats:查看自规则生效以来的ipvs统计信息
Conns:已经转发过的连接数
InPkts:流入包个数
OutPkts:流出包个数
InBytes:进入流量(字节)
OutBytes:流出流量(字节)
ipvsadm -ln --rate:查看速率信息
CPS:每秒的连接数
InPPS:每秒流入包个数
OutPPS:每秒流出包个数
InBPS:每秒进入流量(字节)
OutBPS:每秒流出流量(字节)
Director Server: 负载均衡服务器
hostname:server1
IPADDR:10.4.17.201
GATEWAY:10.4.17.166
VIP:10.4.17.100
Real Server: 真实服务器
server2:10.4.17.202
server3:10.4.17.203
hostname:server1
IPADDR:10.4.17.201
GATEWAY:10.4.17.166
VIP:10.4.17.100
yum install -y ipvsadm
ip addr add 10.4.17.100/24 dev eth0
ipvsadm -A -t 10.4.17.100:80 -s rr :添加集群(指定rr调度算法)
ipvsadm -a -t 10.4.17.100:80 -r 10.4.17.202:80 -g :添加RS到集群(tcp服务)
ipvsadm -a -t 10.4.17.100:80 -r 10.4.17.203:80 -g
server2和server3中:
yum install httpd -y
systemctl enable --now httpd
ip addr add 10.4.17.100/24 dev eth0
echo server2 > /var/www/html/index.html
echo server3 > /var/www/html/index.html
yum install -y arptables_jf:安装arptables
arptables -A INPUT -d 10.4.17.100 -j DROP :drop通过10.4.17.100输入的动作
arptables -A OUTPUT -s 10.4.17.100 -j mangle --mangle-ip-s 10.4.17.202 :输出源地址转换为10.4.17.100 转换为10.4.17.202
(删除arptables规则用arptables -F)
操作系统访问控制:.
iptables -> tcpwarp -> xinetd -> service -> filesystem(rwx/selinux)
问题模拟:
systemctl stop httpd.service
#!/bin/bash
VIP=10.4.17.100
PORT=80
RS=(10.4.17.202 10.4.17.203)
LOG=check_lvs.log
addrs() {
ipvsadm -a -t $VIP:$PORT -r $1:$PORT -g
echo "add $1 to ipvs" >> $LOG
}
delrs() {
ipvsadm -d -t $VIP:$PORT -r $1
echo "del $1 to ipvs" >> $LOG
}
checkrs() {
for i in ${RS[*]}
do
num=`curl -I -s -o /dev/null -w %{http_code} http://$i`
if [ $num -eq 200 -a $(ipvsadm -ln|grep $i|wc -l) -eq 0 ];then
addrs $i
elif [ $num -ne 200 -a $(ipvsadm -ln|grep $i|wc -l) -ne 0 ];then
delrs $i
fi
done
}
while true
do
checkrs
sleep 5
done
chmod 777 check_lvs.sh
sh check_lvs.sh &
keepalived是linux下一个轻量级的高可用解决方案,它与HACMP实现功能类似,都可以实现服务或者网络的高可用,但是又有差别:
keepalived的体系结构从整体上分为两层,分别是用户空间层和内核空间层。
健康监测
实现高可用,节点冗余
keepalived运行时,会启动3个进程,分别为:core(核心进程),check和vrrp
主DS:server1
备DS:server4
server1配置:
yum install -y keepalived
ssh-keygen
ssh-copy-id server4
ip addr del 172.25.2.100/24 dev eth0
ipvsadm -C
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email { #邮件报警
root@localhost
}
notification_email_from keepalived@localhost #指定发件人
smtp_server 127.0.0.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #负载均衡标识,在局域网内应该是唯一的
vrrp_skip_check_adv_addr
#vrrp_strict
vrrp_garp_interval 0 #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0
vrrp_gna_interval 0
}
vrrp_instance VI_1 {
state MASTER #指定该keepalived节点的初始状态
interface eth0 #vrrp实例绑定的接口,用于发送VRRP包
virtual_router_id 51 #指定VRRP实例ID,唯一(范围是0-255)
priority 100 #指定优先级
advert_int 1 #指定发送VRRP通告的间隔。单位是秒
authentication {
auth_type PASS #指定认证方式。PASS简单密码认证(推荐),AH:IPSEC认证(不推荐
auth_pass 1111 #指定认证所使用的密码。最多8位
}
virtual_ipaddress { #指定VIP地址
172.25.2.100
}
}
virtual_server 172.25.2.100 80 {
delay_loop 6 #健康检查的时间间隔
lb_algo rr #LVS调度算法RR
lb_kind DR #LVS模式DR
#persistence_timeout 50
protocol TCP #4层协议(TCP|UDP|SCTP)
real_server 172.25.2.2 80 {
weight 1 #给服务器指定权重。默认是1
TCP_CHECK {#real_server中的健康检查
connect_timeout 3 #连接超时时间
nb_get_retry 3 #尝试次数
delay_before_retry 3 #尝试之前延迟时间
}
}
real_server 172.25.2.3 80 {
weight 1
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
scp /etc/keepalived/keepalived.conf server4:/etc/keepalived/
server4配置:
yum install -y ipvsadm
yum install -y keepalived
vim /etc/keepalived/keepalived.conf
state BACKUP
priority 50
开启服务后,主lvs自动增加ipvsadm规则并自动绑定VIP到指定接口:curl命令测试后,arp得到的物理地址也与主lvs主机物理地址相对应