基于Keepalived实现LVS双主高可用集群

前言

前面说过基于heartbeat的LVS高可用方案,今天带来另一种解决方案:基于Keepalived实现LVS双主高可用集群。什么是Keepalived呢,keepalived观其名可知,保持存活,在网络里面就是保持在线了, 也就是所谓的高可用或热备,用来防止单点故障的发生。本文将详细讲述Keepalived工作原理及高可用解决方案的实现。

相关介绍

Keepalived简介

Keepalived采用VRRP(virtual router redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能。VRRP是针对路由器的一种备份解决方案——由多台路由器组成一个热备组。通过共用的虚拟IP地址对外提供服务;每个热备组内同一时刻只有一台主服务器提供服务,其他服务器处于冗余状态,若当前在线的服务器失败,其他服务器会自动接替(优先级决定接替顺序)虚拟IP地址,以继续提供服务。

工作原理

Keepalived组件介绍

core:keepalived的核心,复杂主进程的启动和维护,全局配置文件的加载解析等

check:负责healthchecker(健康检查),包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析

vrrp:VRRP子进程,VRRP子进程就是来实现VRRP协议的

libip*:LVS相关


keepalived.gif

由图可知,两个子进程都被系统WatchDog看管,两个子进程各自负责自己的事,healthchecker子进程负责检查各自服务器的健康程度,例如HTTP,LVS等等,如果healthchecker子进程检查到MASTER上服务不可用了,就会通知本机上的VRRP子进程,让他删除通告,并且去掉虚拟IP,转换为BACKUP状态。

高可用解决方案

实验拓扑

基于Keepalived实现LVS双主高可用集群.jpg

配置过程

HA集群配置前提

时间同步、基于主机名互相通信、SSH互信

请确保两个节点时间同步,可用ntpdate向时间服务器同步

[root@node1 ~]# ntpdate cn.pool.ntp.org

基于主机名互相通信

[root@node1 ~]# vim /etc/hosts
  
172.16.10.123   node1.scholar.com node1
172.16.10.124   node2.scholar.com node2
  
[root@node1 ~]# vim /etc/sysconfig/network
HOSTNAME=node1.scholar.com
  
[root@node1 ~]# uname -n
node1.scholar.com
  
#两个节点都需如上操作

SSH互信

[root@node1 ~]# ssh-keygen -t rsa -P ''
[root@node1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node2
[root@node2 ~]# ssh-keygen -t rsa -P ''
[root@node2 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@node1
[root@node1 ~]# date; ssh node2 'date' #测试
Tue Jun 16 13:31:39 CST 2015
Tue Jun 16 13:31:39 CST 2015

安装所需程序

[root@node1 ~]# yum install keepalived -y

#两个节点都需安装

配置keepalived

[root@node1 ~]# vim /etc/keepalived/keepalived.conf 

vrrp_instance VI_1 {        #定义VRRP实例,实例名自定义
    state MASTER            #指定Keepalived的角色,MASTER为主服务器,BACKUP为备用服务器
    interface eth0          #指定HA监测的接口
    virtual_router_id 51    #虚拟路由标识(1-255),在一个VRRP实例中主备服务器ID必须一样
    priority 100            #优先级,数字越大越优先,主服务器优先级必须高于备服务器
    advert_int 1            #设置主备之间同步检查时间间隔,单位秒
    authentication {        #设置验证类型和密码
        auth_type PASS      #验证类型
        auth_pass ab007     #设置验证密码,同一实例中主备密码要保持一致
    }
    virtual_ipaddress {     #定义虚拟IP地址
        192.168.12.23
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 61
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.13.23
    }
}

virtual_server 192.168.12.23 80 {    #设置虚拟服务器
    delay_loop 6                     #设置健康状态检查时间
    lb_algo rr                       #设置负载调度算法
    lb_kind DR                       #设置LVS实现负载均衡的机制
    nat_mask 255.255.255.0           #设置掩码
    persistence_timeout 50           #会话保持时间
    protocol TCP                     #指定转发协议类型
    sorry_server 127.0.0.1 80        #设置应急服务器        
    real_server 172.16.10.125 80 {   #后端服务器节点
        weight 1                     #设置服务节点的权重
        HTTP_GET {                   #设置检测方式
            url {
              path /
              status_code 200        #设定返回状态码为200表示Realserver存活
            }
            connect_timeout 2        #设置响应超时时间
            nb_get_retry 3           #设置超时重试次数
            delay_before_retry 1     #设置超时重试间隔
        }
    }
  real_server 172.16.10.126 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}  

virtual_server 192.168.13.23 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    nat_mask 255.255.255.0
    persistence_timeout 50
    protocol TCP 
    sorry_server 127.0.0.1 80       
    real_server 172.16.10.125 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
    real_server 172.16.10.126 80 {
        weight 1
        HTTP_GET {
            url {
              path /
              status_code 200
            }
            connect_timeout 2
            nb_get_retry 3
            delay_before_retry 1
        }
    }
}

将配置文件同步给另一个节点

[root@node1 ~]# scp /etc/keepalived/keepalived.conf node2:/etc/keepalived/
keepalived.conf                                           100% 2196     2.1KB/s   00:00

修改另一个节点配置文件

[root@node2 ~]# vim /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass ab007
    }
    virtual_ipaddress {
        192.168.12.23
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 61
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass sr200
    }
    virtual_ipaddress {
        192.168.13.23
    }
}

#其他配置不变

Real Server配置

配置内核参数及VIP

1.jpg

准备测试页面

2.jpg

#两个RS节点都执行以上操作

测试页面

3.jpg

keepalived节点准备应急页面

4.jpg

#两节点都需执行此操作

测试

启动keepalived

5.jpg

查看两节点的ip和ipvs规则情况

6.jpg

7.jpg

#两个节点各生成了两组规则,因为VIP只有一组,所以只有一组生效

访问测试

8.jpg

9.jpg

10.jpg

11.jpg

模拟其中一个主节点故障

[root@node1 ~]# service keepalived stop

再次查看两节点的ip和ipvs规则情况

12.jpg

13.jpg

由此可见,一个主节点挂掉以后所有的VIP和ipvs规则都会转移到另一个节点,所以访问也不会受到任何影响,这里就不再测试。如果故障节点重新上线,资源还会再次回到工作节点。

下面我们模拟两个RS节点全部故障,看一下sorry_server是否可以工作

[root@scholar ~]# service httpd stop

#两个RS全部停止服务

查看ipvs规则

14.jpg

real server已全部下线,应急服务器上线

15.jpg

16.jpg

sorry_server响应成功,至此,基于Keepalived实现LVS双主高可用集群实验完成

The end

基于Keepalived实现LVS双主高可用解决方案就说到这里了,通过实验可以看出使用keepalived构建LVS群集更加简便易用,如果实验过程中遇到问题可留言交流。以上仅为个人学习整理,如有错漏,大神勿喷~~~

原创文章,作者:书生,如若转载,请注明出处:http://www.178linux.com/5396

(0)
上一篇 2015-06-16 21:31
下一篇 2015-06-17 10:05

相关推荐

  • Memcache存储大数据的问题

    Memcache存储大数据的问题   huangguisu       Memcached存储单个item最大数据是在1MB内,如果数据超过1M,存取set和get是都是返回false,而且引起性能的问题。 我们之前对排行榜的数据进行缓存,由于排行榜在我们所有sql select…

    Linux干货 2015-05-05
  • httpd服务之虚拟主机、访问控制、https配置详解

    前言 上文讲解了http协议及httpd的一些特性,是学习web服务需要掌握的一些基础知识,接下来让我们进一步了解httpd相关功能的配置,本文讲解的是虚拟主机,访问控制及https等功能的配置。 httpd之虚拟主机 虚拟主机共分为三种模式:基于IP、基于端口、基于主机名(FQDN) 实验环境介绍 开始之前,先介绍一下httpd在CentOS6.6版本及文…

    Linux干货 2015-04-14
  • 基于LNMP网站平台,测试增加memcached缓存系统后网站访问效果

    LNMP安装教程链接:22-love cat 17周博客作业第2部分-构建一个LVS-DR模型的高性能集群 memcached 安装及测试效果 一、概念     memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态…

    Linux干货 2016-08-22
  • n28 第二周作业

    n28 第二周作业

    Linux干货 2017-12-09
  • 6个变态的C语言Hello World程序

    下面的六个程序片段主要完成这些事情: 输出Hello, World 混乱C语言的源代码 下面的所有程序都可以在GCC下编译通过,只有最后一个需要动用C++的编译器g++才能编程通过。 hello1.c   #define _________ }     #define …

    Linux干货 2015-04-01
  • 士大夫

    士大夫

    2017-11-13