linux 高可用----keepalived+lvs

什么是高可用?

HA(high availability)即高可用性;就是在高可用集群中发生单点故障时,能够自动转移资源并切换服务,以保证服务一直在线的机制。

LVS

LVS:(linux virtual server)即linux虚拟服务器;开源项目,主要达到负载均衡的作用。

LVS组成

LVS 由2部分程序组成,包括 ipvs 和 ipvsadm

  1. ipvs(ip virtual server):一段代码工作在内核空间,叫ipvs,是真正生效实现调度的代码。
  2. ipvsadm:另外一段是工作在用户空间,叫ipvsadm,负责为ipvs内核框架编写规则,定义谁是集群服务,而谁是后端真实的服务器(Real Server)

ipvsadm包安装

╭─root@localhost.localdomain ~  
╰─➤  yum install ipvsadm -y

负载均衡比较

LVS:

  1. 抗负载能力强。抗负载能力强、性能高,能达到F5硬件的60%;对内存和cpu资源消耗比较低
  2. 工作在网络4层,通过vrrp协议转发(仅作分发之用),具体的流量由linux内核处理,因此没有流量的产生。
  3. 稳定性、可靠性好,自身有完美的热备方案;(如:LVS+Keepalived)
  4. 应用范围比较广,可以对所有应用做负载均衡;
  5. 不支持正则处理,不能做动静分离。
  6. 支持负载均衡算法:rr(轮循)、wrr(带权轮循)、lc(最小连接)、wlc(权重最小连接)
  7. 配置 复杂,对网络依赖比较大,稳定性很高。

Ngnix:

  1. 工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构;
  2. Nginx对网络的依赖比较小,理论上能ping通就就能进行负载功能;
  3. Nginx安装和配置比较简单,测试起来比较方便;
  4. 也可以承担高的负载压力且稳定,一般能支撑超过1万次的并发;
  5. 对后端服务器的健康检查,只支持通过端口来检测,不支持通过url来检测。
  6. Nginx对请求的异步处理可以帮助节点服务器减轻负载;
  7. Nginx仅能支持http、https和Email协议,这样就在适用范围较小。
  8. 不支持Session的直接保持,但能通过ip_hash来解决。、对Big request header的支持不是很好,
  9. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、Ip-hash(Ip哈希)
  10. Nginx还能做Web服务器即Cache功能。

HAProxy:

  1. 支持两种代理模式:TCP(四层)和HTTP(七层),支持虚拟主机;
  2. 能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作
  3. 支持url检测后端的服务器出问题的检测会有很好的帮助。
  4. 更多的负载均衡策略比如:动态加权轮循(Dynamic Round Robin),加权源地址哈希(Weighted Source Hash),加权URL哈希和加权参数哈希(Weighted Parameter Hash)已经实现
  5. 单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度。
  6. HAProxy可以对Mysql进行负载均衡,对后端的DB节点进行检测和负载均衡。
  7. 支持负载均衡算法:Round-robin(轮循)、Weight-round-robin(带权轮循)、source(原地址保持)、RI(请求URL)、rdp-cookie(根据cookie)
  8. 不能做Web服务器即Cache

LVS三种工作模式

  1. NAT模式
  2. 路由模式
  3. 隧道模式

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.17
    
    real_server:192.168.254.18
    real_server:192.168.254.19
    
    #vip为虚拟服务ip
    vip:192.168.254.250    
....................................................................................................................    

调度器:
direct_server:
    ipvsadm -C    #清除配置信息
    
    
    #添加对外提供的服务ip
    ipvsadm -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.250
    ifconfig 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: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


    echo "0">/proc/sys/net/ipv4/conf/lo/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/lo/arp_announce
    echo "0">/proc/sys/net/ipv4/conf/all/arp_ignore
    echo "0">/proc/sys/net/ipv4/conf/all/arp_announce
    
    
    arp_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结构体系

1675881-20190702151441904-467199170.png

安装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 keepalived

global_defs {
   notification_email {
    }
}

vrrp_script chk_mysql {                  #check_mysql是为执行脚本计划起的名字
    script "/root/sh/check_mysql.sh"     #指定要执行脚本的路径
    interval 2                           #脚本执行间隔,每2s检测一次
}



vrrp_instance HA_1 {
    state BACKUP
    interface ens33
    virtual_router_id 151
    priority 100
    advert_int 1
    nopreempt
    authentication {
        auth_type PASS
        auth_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 ];then
    service keepalived stop
..................................................

拓展2:基于web网站的负载均衡高可用如下配置

keepalived:
    yum install keepalived
    vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived
#全局配置
global_defs {
   notification_email {
        #收件人地址
   }
        #邮件服务器
}
VRRP配置DS1
vrrp_instance VI_1 {
    state MASTER                    #角色类型MASTER|BACKUP
    interface 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 1
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }   
    }   
}

1675881-20190710151309560-1574333289.jpg

转载于:https://www.cnblogs.com/du-z/p/11120825.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值