什么是高可用?
HA(high availability)即高可用性;就是在高可用集群中发生单点故障时,能够自动转移资源并切换服务,以保证服务一直在线的机制。
LVS
LVS:(linux virtual server)即linux虚拟服务器;开源项目,主要达到负载均衡的作用。
LVS组成
LVS 由2部分程序组成,包括 ipvs 和 ipvsadm
- ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
- ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)
ipvsadm包安装
╭─root@localhost.localdomain ~
╰─➤ yum install ipvsadm -y
负载均衡比较
LVS:
- 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
- 工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
- 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
- 应用范围比较广,可以对所有应用做负载均衡;
- 不支持正则处理,不能做动静分离。
- 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
- 配置 复杂,对网络依赖比较大,稳定性很高。
Ngnix:
- 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
- Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
- Nginx安装和配置比较简单,测试起来比较方便;
- 也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
- 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
- Nginx对请求的异步处理可以帮助节点服务器减轻负载;
- Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
- 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
- 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
- Nginx还能做Web服务器即Cache功能。
HAProxy:
- 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
- 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
- 支持url检测后端的服务器出问题的检测会有很好的帮助。
- 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
- 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
- HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
- 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
- 不能做Web服务器即Cache
LVS三种工作模式
- NAT模式
- 路由模式
- 隧道模式
NAT模式
调度器环境:
##连接外部的网卡:
192.168.31.100
255.255.255.0
192.168.31.1
##连接real_server的网卡:
172.16.100.1
255.255.255.0
real_server1环境:
172.16.100.2
255.255.255.0
172.16.100.1 #网关指向调度器
real_server2环境:
172.16.100.3
255.255.255.0
172.16.100.1 #网关指向调度器
调度器配置:
╭─root@localhost.localdomain ~
╰─➤ cat /proc/sys/net/ipv4/ip_forward
0
╭─root@localhost.localdomain ~
╰─➤ echo 1 > /proc/sys/net/ipv4/ip_forward或者vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
#调度器配置命令
ipvsadm -A -t 192.168.31.100:80 -s rr
ipvsadm -a -t 192.168.31.100:80 -r 192.168.250.2 -m
ipvsadm -a -t 192.168.31.100:80 -r 192.168.250.3 -m
查看配置LVS内容:
╭─root@localhost.localdomain ~
╰─➤ ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.137.3:80 rr-> 172.16.100.10:80 Masq 1 0 2 -> 172.16.100.20:80 Masq 1 0 2
特点:
- 调度器会成为性能上的瓶颈
- 可以不同网段
路由模式
DR模式环境:direct_server:192.168.254.17real_server:192.168.254.18real_server:192.168.254.19#vip为虚拟服务ipvip:192.168.254.250
.................................................................................................................... 调度器:
direct_server:ipvsadm -C #清除配置信息#添加对外提供的服务ipipvsadm -A -t 192.168.254.250:80 -s rr #-A为ADD -t为tcp -s rr为设置算法为轮叫算法#添加2台real_server主机ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.18:80 -g #-a为add -t为tcp -r为realserver -g为DR路由模式ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -g #-a为add -t为tcp -r为realserver -g为DR路由模式#配置网卡的子网口为vip,ip地址为192.168.254.250ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up#添加路由(访问192.168.254.250都走ens33:0这个网卡)route add -host 192.168.254.250 dev ens33:0
........................................................................................................................
real_server端:real_server:#在回环地址的子网口上配置服务ip(vip)ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up #添加静态路由指定lo:0端口route add -host 192.168.254.250 dev lo:0echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2">/proc/sys/net/ipv4/conf/lo/arp_announceecho "1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2">/proc/sys/net/ipv4/conf/all/arp_announceecho "0">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0">/proc/sys/net/ipv4/conf/lo/arp_announceecho "0">/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0">/proc/sys/net/ipv4/conf/all/arp_announcearp_ignore:定义接收到ARP请求时的响应级别 0:默认,只用本地配置的有响应地址都给予响应 1:仅仅在目标IP是本地地址,并且是配置在请求进来的接口上的时候才给予响应(仅在请求的目标地址配置请求到达的接口上的时候,才给予响应)arp_announce:定义将自己的地址向外通告时的级别 0:默认,表示使用配置在任何接口的任何地址向外通告 1:尽量仅向目标网络通告与其网络匹配的地址 2:仅向与本地接口上地址匹配的网络进行通告
拓展:python 远程布置LVS路由模式代码:
import paramiko
vip = '192.168.254.250'
ds = '192.168.254.13'
rs1 = '192.168.254.11'
rs2 = '192.168.254.12'
ds_cmd = '''
ipvsadm -C;
ipvsadm -A -t {vip}:80 -s wrr;
ipvsadm -a -t {vip}:80 -r {rs1}:80 -w 1 -g;
ipvsadm -a -t {vip}:80 -r {rs2}:80 -w 2 -g;
ifconfig ens33:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {vip} dev ens33:0;
'''.format(vip=vip, rs1=rs1, rs2=rs2)rs1_cmd = '''
ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {vip} dev lo:0;
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;
service httpd restart
'''.format(vip=vip)
rs2_cmd = '''
ifconfig lo:0 {vip} broadcast {vip} netmask 255.255.255.255 up;
route add -host {vip} dev lo:0;
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;
service httpd restart
'''.format(vip=vip)ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())def direct_server():ssh.connect('{ds}'.format(ds=ds), 22, 'root', 'root',timeout=3)stdin, stdout, stderr = ssh.exec_command(ds_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('dicret_server配置完成!!!')def real_server1():ssh.connect('{rs1}'.format(rs1=rs1), 22, 'root', 'root', timeout=3)stdin, stdout, stderr = ssh.exec_command(rs1_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('real_server1配置完成!!!')def real_server2():ssh.connect('{rs2}'.format(rs2=rs2), 22, 'root', 'root', timeout=3)stdin, stdout, stderr = ssh.exec_command(rs2_cmd)print(stderr.read().decode('utf-8'))print(stdout.read().decode('utf-8'))print('real_server2配置完成!!!')def main():direct_server()real_server1()real_server2()ssh.close()if __name__ == '__main__':main()
keepalived
vrrp协议
VRRP协议是一种主备模式的协议,通过VRRP可以在网络发生故障时透明地进行设备切换不影响主机间的数据通信,这其中涉及两个概念:物理路由器和虚拟路由器
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由器,这个虚拟路由器通过虚拟IP(一个或多个)对外提供服务,
在虚拟路由器内部,是多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由器被称之为主路由器(处于master状态角色)。它拥有对外提供的虚拟ip,提供各种网络功能,比如arp请、icmp、数据转发等,
其他物理路由器不拥有对外提供服务的虚拟ip,也不提供对外网络功能,仅仅接收master的vrrp状态通告信息,这些路由器被统称为备份路由器(处于backup角色)。
在一个虚拟路由器中,只有处于master角色的路由器会一直发送vrrp数据包,处于backup角色的路由器只接受master发过来的报文信息,用来监控master运行状态,因此,不会发生master抢占的现象,除非它的优先级更高,
当master不可用时,backup也就无法收到master发过来的报文信息,于是就认定master出现故障,接着多台backup就会进行选举,优先级最高的backup将成为新的master,这种选举并进行角色的过程非常快,因此也就保证了服务的持续可用性
keepalived结构体系
安装keepalived
╭─root@localhost.localdomain ~
╰─➤ yum install keepalived -y
keepalived主配置文件
╭─root@localhost.localdomain ~
╰─➤ vim /etc/keepalived/keepalived.conf
主配置文件分三部分:
- 全局配置
- VRRP配置
- LVS配置
拓展1:基于mysql或者mariadb数据库的高可用如下配置
! Configuration File for keepalivedglobal_defs {notification_email {}
}vrrp_script chk_mysql { #check_mysql是为执行脚本计划起的名字script "/root/sh/check_mysql.sh" #指定要执行脚本的路径interval 2 #脚本执行间隔,每2s检测一次
}vrrp_instance HA_1 {state BACKUPinterface ens33virtual_router_id 151priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.254.250/24}track_script { #跟踪脚本计划( chk_mysql)chk_mysql}
}
脚本文件内容:
╭─root@localhost.localdomain ~/sh
╰─➤ vim check_mysql.sh
...................................................
#!/bin/bash
service mariadb status
if [ $? -nq 0 ];thenservice keepalived stop
..................................................
拓展2:基于web网站的负载均衡高可用如下配置
keepalived:yum install keepalivedvim /etc/keepalived/keepalived.conf! Configuration File for keepalived
#全局配置
global_defs {notification_email {#收件人地址}#邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {state MASTER #角色类型MASTER|BACKUPinterface ens33 #网卡名称virtual_router_id 51 #虚拟路由id(需要与BACKUP一致)priority 100 #优先级advert_int 1 #没1秒检查一次#nopreempt #非抢占模式authentication {auth_type PASS #认证类型 主备之间必须一样auth_pass 1111 #认证密码 主备之间必须一样}virtual_ipaddress {192.168.254.250/24 #虚拟ip(vip)}
}#LVS配置
virtual_server 192.168.254.250 80 { delay_loop 3 #健康检查时间间隔lb_algo rr #负载均衡调度算法 lb_kind DR #负载均衡转发规则 protocol TCP #协议real_server 192.168.254.18 80 { #要监控的real_server的ip和端口号weight 1 #权重TCP_CHECK { #基于tcp协议的检查connect_timeout 3 #连接时间超时retry 3 #重连次数delay_before_retry 3 #重连间隔时间}}real_server 192.168.254.19 80 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3} }
}