zoukankan      html  css  js  c++  java
  • LVS+Keepalived

    LVS+Keepalived

    一,**简介**

    1,**负载均衡的类型**

    l 负载均衡可以采用硬件设备(例如常常听见的 F5),也可以采用软件负载

    l 商用硬件负载设备成本通常较高(一台几十万甚至上百万),所以一般 情况下会采用软件负载

    l 软件负载解决的两个核心问题是:选谁、转发,其中最著名的是 lvs

    2,**LVS介绍**

    2.1 LVS是什么?

    l 英文全称是 Linux Virtual Server,即 Linux 虚拟服务器

    l 由 章 文 嵩 博 士 发 起 的 自 由 软 件 项 目 , 它 的 官 方 站 点 是 www.linuxvirtualserver.org

    l Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分

    l 可以将请求分发给后端真实服务器处理

    l 有许多比较著名网站和组织都在使用 LVS 架设的集群系统,例如:Linux 的门 户网站(www.linux.com)、向 RealPlayer 提供音频视频服务而闻 名的 Real 公 司(www.real.com )、全球最大的开源网站 (sourceforge.net)等

    l 提供了多种调度算法

    1) 轮询调度(Round-Robin Scheduling)RR算法

    2) 加权轮询调度(Weighted Round-Robin Scheduling)WRR算法

    3) 最小连接调度(Least-Connection Scheduling)LC算法

    4) 加权最小连接调度(Weighted Least-Connection Scheduling)WLC算法

    5) 基于局部性的最少链接(Locality-Based Least Connections Scheduling)LBLC算法

    6) 带 复 制 的 基 于 局 部 性 最 少 链 接 ( Locality-Based Least Connections with Replication Scheduling)LBLCR算法

    7) 目标地址散列调度(Destination Hashing Scheduling)DH算法

    8) 源地址散列调度(Source Hashing Scheduling)SH算法

    9) 最短预期延时调度(Shortest Expected Delay Scheduling)SED算法

    10) 不 排 队 调 度 ( Never Queue Scheduling )NQ算法

    l 有三种转发规则

    1) NAT:简单理解,就是数据进出都通过 LVS,性能不是很好。

    2) TUNL:简单理解:隧道

    3) DR:最高效的负载均衡规则

    2.2 lvs的体系结构

    l 最前端的负载均衡层,用 Load Balancer 表示

    l 中间的服务器集群层,用 Server Array 表示

    l 最底端的数据共享存储层,用 Shared Storage 表示

    l 在用户看来,所有的内部应用都是透明的,用户只是在使用一个虚拟服 务器提供的高性能服务

     

    2.3 lvs的优点

    l 抗负载能力强,因为 lvs 工作方式的逻辑是非常之简单,而且工作在网络 4 层仅做请求分发之用,没有流量,所以在效率上基本不需要太过考虑。

    l 有完整的双机热备方案,当节点出现故障时,lvs 会自动判别,所以系统整体是非常稳定的。

    l 使用集群技术和Linux操作系统实现一个高性能、高可用的服务器.

    l 很好的可伸缩性(Scalability)

    l 很好的可靠性(Reliability)

    l 很好的可管理性(Manageability)

    l 基本上能支持所有应用,因为 lvs 工作在 4 层,所以它可以对几乎所有应用做负载均衡,包括 http、数据库、聊天室等等。

    2.4 lvs的负载均衡机制

    l lvs 是四层负载均衡,也就是说建立在 OSI 模型的第四层——传输层之 上

    l 传输层上有 TCP/UDP,lvs 支持 TCP/UDP 的负载均衡

    l 因为 LVS 是四层负载均衡,因此它相对于其它高层负载均衡的解决办法, 比如 DNS 域名轮流解析、应用层负载的调度、客户端的调度等,它的效 率是非常高的

    l lvs 的转发可以通过修改 IP 地址实现(NAT 模式)

    l lvs 的转发还可以通过修改直接路由实现(DR 模式)

    2.5 lvs于nginx对比

    l 负载度 lvs 优于 nginx

    l 稳定度 lvs 优于 nginx

    l 服务器性能要求 lvs 优于 nginx

    l 网络层数的效率 lvs 优于 nginx ² 网络七层:应用层、会话层、表示层、传输层、网络层、链路层、 物理层

    l 功能多少 nginx 优于 lvs

    3,**Keepalived介绍**

    3.1 什么是keepalived

    keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说

    第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉

    3.2 简介

    Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工

    出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时

    用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将

    务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人

    做的只是修复故障的服务器

    3.3 工作原理

    Layer3,4,5工作在IP/TCP协议栈的IP层,TCP层,及应用层,原理分别如下:

    l Layer3:Keepalived使用Layer3的方式工作式时,Keepalived会定期向服务器群中的服务器发送一个ICMP的数据包(既我们平时用的Ping程序),如果发现某台服务的IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除,这种情况的典型例子是某台服务器被非法关机。Layer3的方式是以服务器的IP地址是否有效作为服务器工作正常与否的标准。

    l Layer4:如果您理解了Layer3的方式,Layer4就容易了。Layer4主要以TCP端口的状态来决定服务器工作正常与否。如web server的服务端口一般是80,如果Keepalived检测到80端口没有启动,则Keepalived将把这台服务器从服务器群中剔除。

    l Layer5:Layer5对指定的URL执行HTTP GET。然后使用MD5算法对HTTP GET结果进行求和。如果这个总数与预期值不符,那么测试是错误的,服务器将从服务器池中移除。该模块对同一服务实施多URL获取检查。如果您使用承载多个应用程序服务器的服务器,则此功能很有用。此功能使您能够检查应用程序服务器是否正常工作。MD5摘要是使用genhash实用程序(包含在keepalived软件包中)生成的。

    l SSL_GET与HTTP_GET相同,但使用SSL连接到远程Web服务器。

    l MISC_CHECK:此检查允许用户定义的脚本作为运行状况检查程序运行。结果必须是0或1.该脚本在导演盒上运行,这是测试内部应用程序的理想方式。可以使用完整路径(即/path_to_script/script.sh)调用可以不带参数运行的脚本。那些需要参数的需要用双引号括起来(即“/path_to_script/script.sh arg 1 … arg n”)

    3.4 作用

    主要用作RealServer的健康状态检查以及LoadBalance主机和BackUP主机之间 failover的实现

    3.5 为什么使用keepalived

    当我们的服务器意外挂了之后,我们要怎么做?

    当然是找一台新的机器,替代现有的机器,然后做新的环境部署,端口映射, 域名解析等等一系列的工作,再将服务重新启动;但是如果这一系列的操作都 是手动完成的,那么等你把这些工作搞好,可能服务已经停止个把小时了,这 会儿估计运营早就提着菜刀架在你脖子上了;

    但是如果使用了KeepAlived之后,然后提前将备用机准备好,当主的机器挂掉 之后,自动将VIP给你切换到备用机,并且以邮件的形式告诉你说主服务已经 挂了,你得赶紧恢复起来;这时候你就可以慢慢的去找主服务的问题,这时候 并不会影响到你的正常业务运行。

    二,**安装**

    1 环境规划

    两台webserver

    Centos7.6 lvs keepalived 主 192.168.25.31 master

    Centos7.6 lvs keepalived 备 192.168.25.32 slave

    VIP地址 192.168.25.50

    2 配置

    2.1 修改两台主机名

    25.31:master

    25.32:slave

    2.2 配置

    两台都需要的配置

    (1) 在线安装httpd
     [root@master ~]# yum -y install httpd
    (2) 设置开机自启动
     [root@master ~]# systemctl enable httpd.service
     
     [root@master ~]# systemctl list-unit-files |grep httpd
     
     httpd.service                                 enabled
    (3) 开启http服务
     [root@master ~]# systemctl start httpd.service
    (4) 通过浏览器访问http服务,默认端口是80

    (5) 创建html文件,写入内容,区分两个节点

    Master:

     [root@master ~]# vim /var/www/html/index.html
     
     [root@master ~]# cat /var/www/html/index.html

    node01 service

     

    Slave:

     [root@slave ~]# vim /var/www/html/index.html
     
     [root@slave ~]# cat /var/www/html/index.html
     
     node02 service
    (6) 创建脚本并写入如下内容,然后赋予权限并启动

    在centos7里面需要先执行安装net_tools不然执行脚本时会报错

     [root@slave ~]# yum -y install net-tools
     
     [root@master ~]# vim /etc/init.d/realserver
     
     #!bin/bash
     
     SNS_VIP=192.168.25.100 #定义一个VIP变量,必须跟真实服务在一个网段
     
     source /etc/rc.d/init.d/functions
     
     case "$1" in
     
     start)
     
     echo "start lvs of realserver"
     
     /sbin/ifconfig lo:0 $SNS_VIP broadcast $SNS_VIP netmask 255.255.255.255 up #增加一个本地路由 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
     
     ;;
     
     stop)
     
     /sbin/ifconfig lo:0 down
     
     echo "close LVS Directorserver"
     
     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" >/prco/sys/net/ipv4/conf/all/arp_anounce
     
     ;;
     
     *)
     
     echo "Usage: $0 {start|stop}"
     
     exit 1
     
     esac
     
     [root@master ~]# chmod 777 /etc/init.d/realserver
     
     [root@master init.d]# service realserver start
     
     Starting realserver (via systemctl):                       [ 确定 ]
     
     [root@master ~]# ifconfig

    (7) 第二台http也同样做上面的步骤,增加路由,SNS_VIP要跟第一台一样

    Master:

     [root@master init.d]# scp realserver root@192.168.25.32:/etc/init.d/

    Slave:

     [root@slave init.d]# chmod 777 realserver 
     
     [root@slave init.d]# service realserver start
     
     Reloading systemd:                           [ 确定 ]
     
     Starting realserver (via systemctl):               [ 确定 ]
     
     [root@slave init.d]# ifconfig

    (8) 查看系统内核版本,2.4以后就有lvs,不用安装

    Master:

    [root@master ~]# uname -a
    
    Linux master 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    

    Slave:

    [root@slave ~]# uname -a
    
    Linux slave 3.10.0-957.27.2.el7.x86_64 #1 SMP Mon Jul 29 17:46:05 UTC 	2019 x86_64 x86_64 x86_64 GNU/Linux
    
    (9) 在两台机器上安装keepalived,做心跳检查用的
    [root@master ~]# yum -y install keepalived
    
    (10) 备份keepalived配置文件,然后进行更改
    [root@master ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    
    [root@master ~]# vim /etc/keepalived/keepalived.conf
    
    global_defs {                       
    
    #   notification_email {             
    
    #   }
    
    #   smtp_connect_timeout 30
    
    ​        router_id LVS_DEVEL             
    
    }
    
    vrrp_instance VI_1 {            
    
    ​        state MASTER   				 #指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器    
    
    ​        interface ens160   			 #指定HA监测网络的接口
    
    ​        virtual_router_id 51  			 #虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的
    
    ​        priority 100         			 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级
    
    ​        advert_int 1         			 #设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是       
    
    ​	authentication {      		  	 #设置验证类型和密码
    
    ​                auth_type PASS  		 #设置验证类型,主要有PASS和AH两种
    
    ​                auth_pass 1111  		 #设置验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信
    
    ​        }
    
    ​        virtual_ipaddress {         
    
    ​                192.168.25.100 			 #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
    
    ​        }
    
    }
    
    virtual_server 192.168.25.100 80 {  		 #设置虚拟服务器,需要指定虚拟IP地址和服务端口,IP与端口之间用空格隔开
    
    ​        delay_loop 6           			 #设置运行情况检查时间,单位是秒
    
    ​        lb_algo wrr            			 #设置负载调度算法,这里设置为wrr,即加权轮询调度
    
    ​        lb_kind DR        			 #设置LVS实现负载均衡的机制,有NAT、TUN、DR三个模式可选这里使用LVSDR模式                 
    
    ​        nat_mask 255.255.255.0   
    
    ​        persistence_timeout 0    		 #会话保持时间,单位是秒。这个选项对动态网页是非常有用的,为集群系统中的session共享提供了一个很好的解决方案。
    
    ​                                		 #有了这个会话保持功能,用户的请求会被一直分发到某个服务节点,直到超过这个会话的保持时间。
    
    ​                              			 #需要注意的是,这个会话保持时间是最大无响应超时时间,也就是说,用户在操作动态页面时,如果50秒内没有执行任何操作
    
    ​                              			 #那么接下来的操作会被分发到另外的节点,但是如果用户一直在操作动态页面,则不受50秒的时间限制
    
     
    
    ​        protocol TCP       			 #指定转发协议类型,有TCP和UDP两种                    
    
    ​        real_server 192.168.25.31 80 {   	 #配置服务节点1,需要指定real server的真实IP地址和端口,IP与端口之间用空格隔开
    
    ​                weight 1       			 #配置服务节点的权值,权值大小用数字表示,数字越大,权值越高,设置权值大小可以为不同性能的服务器
    
    ​			     		    	 #分配不同的负载,可以为性能高的服务器设置较高的权值,而为性能较低的服务器设置相对较低的权值,这样才能合理地利用和分配系统资源
    
    ​                TCP_CHECK {                      #realserver的状态检测设置部分,单位是秒
    
    ​                        connect_timeout 10       #表示10秒无响应超时
    
    ​                        nb_get_retry 3           #表示重试次数
    
    ​                        delay_before_retry 3     #表示重试间隔
    
    ​                        connect_port 80
    
    ​                }
    
    ​        }
    
    ​        real_server 192.168.25.32 80 {
    
    ​                weight 2
    
    ​                TCP_CHECK {
    
    ​                        connect_timeout 10
    
    ​                        nb_get_retry 3
    
    ​                        delay_before_retry 3
    
    ​                        connect_port 80
    
    ​                }
    
    ​        }
    
    }
    

     

    (11) 启动keepalived
    [root@master ~]# systemctl start keepalived.service
    
    (12) Slave修改配置文件
    [root@slave ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
    
    [root@slave ~]# vim /etc/keepalived/keepalived.conf
    
    (在slave上只需要修改state MASTER  为state backup和优先级低于master就行)
    
    global_defs {                       
    
    #   notification_email {             
    
    #   }
    
    #   smtp_connect_timeout 30
    
    ​        router_id LVS_DEVEL             
    
    }
    
    vrrp_instance VI_1 {            
    
    ​        state BACKUP   				
    
    ​        interface ens160   			
    
    ​        virtual_router_id 51  			
    
    ​        priority 90         			 
    
    ​        advert_int 1         			 
    
    ​	authentication {      		 
    
    ​                auth_type PASS  		 
    
    ​                auth_pass 1111  		 
    
    ​        }
    
    ​        virtual_ipaddress {         
    
    ​                192.168.25.100 			 
    
    ​        }
    
    }
    
    virtual_server 192.168.25.100 80 {  		
    
    ​        delay_loop 6           			
    
    ​        lb_algo wrr            			 
    
    ​        lb_kind DR        			 
    
    ​        nat_mask 255.255.255.0   
    
    ​        persistence_timeout 0    		 
    
    ​                                		 
    
    ​                              			 
    
    ​                              			 
    
     
    
    ​        protocol TCP       			 
    
    ​        real_server 192.168.25.31 80 {   	 
    
    ​                weight 1       			 
    
    ​			     		    	 
    
    ​                TCP_CHECK {                      
    
    ​                        connect_timeout 10       
    
    ​                        nb_get_retry 3         
    
    ​                        delay_before_retry 3  
    
    ​                        connect_port 80
    
    ​                }
    
    ​        }
    
    ​        real_server 192.168.25.32 80 {
    
    ​                weight 2
    
    ​                TCP_CHECK {
    
    ​                        connect_timeout 10
    
    ​                        nb_get_retry 3
    
    ​                        delay_before_retry 3
    
    ​                        connect_port 80
    
    ​                }
    
    ​        }
    
    }
    

     

    (13) 启动keepalived
    [root@slave ~]# systemctl start keepalived.service
    

    三,**测试**

    1. 访问虚拟IP192.168.25.100 ,查看当前服务器提供的服务

    2. 把master的http服务停掉再次访问虚拟ip,故障移除,认为down掉了就会自动切换到备上

    [root@master ~]# systemctl stop httpd.service

    3. 启动主lvs,自动切换到优先级较高的主上

    [root@master ~]# systemctl start httpd.service

    4. 测试后,证明主备自动切换,lvs高可用

     

     

  • 相关阅读:
    httpclient妙用一 httpclient作为客户端调用soap webservice(转)
    WebService学习总结(转)
    C++的override和final
    C++类const和static成员初始化
    C++数据存储方式
    C++类成员存储大小
    内联函数
    C++接口的概念
    C++深拷贝和浅拷贝
    C++构造函数以及何时被调用
  • 原文地址:https://www.cnblogs.com/clllum/p/11792041.html
Copyright © 2011-2022 走看看