Linux keepalived高可用集群

                   Linux keepalived高可用集群


keepalived简介:

   keepalived是为了高可用ipvs集群而设计的,主要用作realserver的健康状态检测,如果有一台web服务器死机,或工作出现故障,keepalived将检测到,并将有故障的服务器从系统中移除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后keepalived自动将服务器加入到服务器集群中,这些工作全部自动完成,不需要人工干预,需要人工做的只是修复故障的服务器。

集群类型:LBHAHP

SPoF: Single Point of Failure

系统可用性的公式:A=MTBF/MTBF+MTTR

HA Cluster实现方案:

vrrp协议的实现

        vrrp:虚拟冗余路由协议;

keepalived

ais:完备HA集群;

heartbeat

corosync  

 

keepalived保持连接:

    vrrp协议:Virtual Redundant Routing Protocol 虚拟冗余路由协议

术语:

虚拟路由器:Virtual Router

虚拟路由器标识:VRID(0-255)

物理路由器:

master:主设备

backup:备用设备

priority:优先级

VIPVirtual IP

VMACVirutal MAC (00-00-5e-00-01-VRID)

通告:心跳,优先级等;周期性;

抢占式,非抢占式;

 

安全工作:

   认证:

无认证

简单字符认证

MD5

 

工作模式:

/备:单虚拟路径器;

/主:主/备(虚拟路径器1),备/主(虚拟路径器2

keepalived:为了在Linux系统中实现vrrp协议

vrrp协议的软件实现,原生设计的目的为了高可用ipvs服务:

vrrp协议完成地址流动;

vip地址所在的节点生成ipvs规则(在配置文件中预先定义);

ipvs集群的各RS做健康状态检测;

基于脚本调用接口通过执行脚本完成脚本中定义的功能,进而影响集群事务;

 组件:

核心组件:

 vrrp stack

 ipvs wrapper

 checkers

控制组件:配置文件分析器

IO复用器

内存管理组件

 

HA Cluster的配置前提:

(1) 各节点时间必须同步;

    ntp, chrony

(2) 确保iptablesselinux不会成为阻碍;

(3) 各节点之间可通过主机名互相通信(对KA并非必须);

建议使用/etc/hosts文件实现;

(4) 各节点之间的root用户可以基于密钥认证的ssh服务完成互相通信;(并非必须)

 

keepalived安装配置:

CentOS 6.4之后的版本keepalived已经收录到base仓库中了。

    程序环境:

配置文件:/etc/keepalived/keepalived.conf

  主程序:/usr/sbin/keepalived

  Unit Filekeepalived.service

配置文件组件部分:

TOP HIERACHY

GLOBAL CONFIGURATION

Global definitions

Static routes/addresses

VRRPD CONFIGURATION

VRRP synchronization group(s)

VRRP instance(s)

LVS CONFIGURATION

Virtual server group(s)

Virtual server(s)

单主配置示例:

! Configuration File for keepalived

 

     global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

vrrp_mcast_group4 224.0.100.19

}

 

vrrp_instance VI_1 {

state BACKUP

interface eno16777736

virtual_router_id 14

priority 98

advert_int 1

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

10.1.0.91/16 dev eno16777736

}

}  

配置语法:

配置虚拟路由器:

vrrp_instance <STRING> {

….

}

专用参数:

 state MASTER|BACKUP:当前节点在此虚拟路由器上的初始状态;只能有一个是MASTER,余下的都应该为BACKUP

 interface IFACE_NAME:绑定为当前虚拟路由器使用的物理接口;

 virtual_router_id VRID:当前虚拟路由器的惟一标识,范围是0-255

 priority 100:当前主机在此虚拟路径器中的优先级;范围1-254

     advert_int 1vrrp通告的时间间隔;

 authentication {

auth_type AH|PASS

auth_pass <PASSWORD>

}

virtual_ipaddress {

<IPADDR>/<MASK> brd <IPADDR> dev <STRING> scope <SCOPE> label <LABEL>

192.168.200.17/24 dev eth1

192.168.200.18/24 dev eth2 label eth2:1

}

 track_interface {

eth0

eth1

}

配置要监控的网络接口,一旦接口出现故障,则转为FAULT状态;

nopreempt:定义工作模式为非抢占模式;

preempt_delay 300:抢占式模式下,节点上线后触发新选举操作的延迟时长;

定义keepalived主备切换邮件通知脚本:

notify_master <STRING>|<QUOTED-STRING>:当前节点成为主节点时触发的脚本;

notify_backup <STRING>|<QUOTED-STRING>:当前节点转为备节点时触发的脚本;

notify_fault <STRING>|<QUOTED-STRING>:当前节点转为“失败”状态时触发的脚本;

notify <STRING>|<QUOTED-STRING>:通用格式的通知触发机制,一个脚本可完成以上三种状态的转换时的通知;

 

 

keepalived单、主配置实例:

blob.png

blob.png

blob.png

定义keepalived主备切换邮件通知脚本:

blob.png

blob.png

双主模型示例:  

! Configuration File for keepalived

 

global_defs {

notification_email {

root@localhost

}

notification_email_from keepalived@localhost

smtp_server 127.0.0.1

smtp_connect_timeout 30

router_id node1

    vrrp_mcast_group4 224.0.100.19

}

 

    vrrp_instance VI_1 {

state MASTER

interface eno16777736

virtual_router_id 14

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 571f97b2

}

virtual_ipaddress {

10.1.0.91/16 dev eno16777736

}

}

 

vrrp_instance VI_2 {

  state BACKUP

  interface eno16777736

  virtual_router_id 15

  priority 98

  advert_int 1

  authentication {

  auth_type PASS

  auth_pass 578f07b2

}

  virtual_ipaddress {

  10.1.0.92/16 dev eno16777736

}

}

 

 双主模型配置实例:

blob.png

blob.png

blob.png

定义keepalived主备切换邮件通知脚本:

blob.png

blob.png

虚拟服务器:

配置参数:

virtual_server IP port |

    virtual_server fwmark int

  {

real_server {

}

 }

常用参数:

 delay_loop <INT>:服务轮询的时间间隔;

 lb_algo rr|wrr|lc|wlc|lblc|sh|dh:定义调度方法;

 lb_kind NAT|DR|TUN:集群的类型;

 persistence_timeout <INT>:持久连接时长;

 protocol TCP:服务协议,仅支持TCP

 sorry_server <IPADDR> <PORT>:备用服务器地址;

 real_server <IPADDR> <PORT>

{

 weight <INT>

 notify_up <STRING>|<QUOTED-STRING>

 notify_down <STRING>|<QUOTED-STRING>

     HTTP_GET|SSL_GET|TCP_CHECK|SMTP_CHECK|MISC_CHECK { … }:定义当前主机的健康状态检测方法;

}

HTTP_GET|SSL_GET {

url {

path <URL_PATH>:定义要监控的URL

status_code <INT>:判断上述检测机制为健康状态的响应码;

digest <STRING>:判断上述检测机制为健康状态的响应的内容的校验码;

}

nb_get_retry <INT>:重试次数;

delay_before_retry <INT>:重试之前的延迟时长;

connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求

connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求

bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;

bind_port <PORT>:发出健康状态检测请求时使用的源端口;

connect_timeout <INTEGER>:连接请求的超时时长;

}

 TCP_CHECK {

connect_ip <IP ADDRESS>:向当前RS的哪个IP地址发起健康状态检测请求

connect_port <PORT>:向当前RS的哪个PORT发起健康状态检测请求

bindto <IP ADDRESS>:发出健康状态检测请求时使用的源地址;

bind_port <PORT>:发出健康状态检测请求时使用的源端口;

connect_timeout <INTEGER>:连接请求的超时时长;

}

 

实验测试:

   部署一个lvs-dr类型的keepalived HA单主高可用集群:

   环境介绍:

   测试客户机:

      client客户机IP192.168.3.4

   搭建单主高可用集群:

      keepalived HA高可用集群(1IP192.168.3.7

      keepalived HA高可用集群(2IP192.168.3.5

      keepalived HA 高可用集群的vip192.168.3.6

      keepalived各节点上提供sorry_server web服务;网页为:website maintenance

   后台网站服务器:

      realserver1IP地址:192.168.3.2

        配置httpd服务:网页为 keepalived server 1

        lo别名网卡上配置vip地址:192.168.3.6;关闭arp_ignorearp_announce;

       realserver2IP地址:192.168.3.8

        配置httpd服务:网页为 keepalived server 2

        lo别名网卡上配置vip地址:192.168.3.6;关闭arp_ignorearp_announce;

 

   1)在real server 1 realserver2上分别执行此脚本,配置lo别名网卡上的viparp_ignorearp_announce的参数。

blob.png

  2)在 keepalived HA高可用集群(1IP192.168.3.7 配置如下内容:

blob.png

blob.png

blob.png

blob.png

  3)在 keepalived HA高可用集群(2IP192.168.3.5 配置如下内容:

blob.png

blob.png

blob.png

blob.png

4)在客户机上测试keepalived的轮循调度:

blob.png

5)故意关闭一台realserver web进行测试:

blob.png

6)故意关闭后台所有realserver服务,测试sorry_server web

blob.png

keepalived调用外部的辅助脚本进行资源监控,并根据监控的结果状态能实现优先动态调整;

分两步:(1) 先定义一个脚本;(2) 调用此脚本;

 

调用外部脚本对keepalived进行健康状态检测机制

定义在vrrp_instance实例之外:

vrrp_script <SCRIPT_NAME> {   //定义脚本

script ""

interval #

weight -#

}

定义在vrrp_instance实例之内:  

track_script {                //调用脚本

SCRIPT_NAME_1

SCRIPT_NAME_2

    

 }

实验测试:

   部署一个nginxkeepalived HA单主高可用集群:

   环境介绍:

   测试客户机:

      client客户机IP192.168.3.4

   搭建单主高可用集群:

      keepalived HA高可用集群(1IP192.168.3.7

      keepalived HA高可用集群(2IP192.168.3.5

      keepalived两个节点上分别配置nginx反向代理服务;

   后台网站服务器:

      realserver1IP地址:192.168.3.2

        配置httpd服务:网页为 nginx HA  server 1

      realserver2IP地址:192.168.3.8

        配置httpd服务:网页为 nginx HA  server 2

 

  1)配置nginx keepalived HA高可用集群(1IP192.168.3.7

blob.png

blob.png

blob.png

 配置keepalived1)上的nginx反向代理服务:

nginx主配置文件http配置段中定义上游服务器组upstream

blob.png

blob.png

nginx默认配置文件中定义反向代理的upstream组名称:

blob.png

blob.png

  2)配置nginx keepalived HA高可用集群(2IP192.168.3.7

 nginx keepalived HA高可用集群(2)的配置过程与 nginx keepalived HA高可用集群(1)类似,唯一的区别就是在/etc/keepalived/keepalived.conf配置文件中,如下图:

blob.png

blob.png

3)测试HA nginx cluster

blob.png

4)调用外部脚本 chk_dow ,使其vip地址转移到另一个keepalived节点上:

/etc/keepalived/目录下创建一个文件down

blob.png

在去keepalived2)节点查看IP a l

blob.png

5)再次测试HA nginx cluster

blob.png

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

(0)
zhengyibozhengyibo
上一篇 2016-11-18
下一篇 2016-11-18

相关推荐

  • 从LongAdder看更高效的无锁实现

    接触到AtomicLong的原因是在看guava的LoadingCache相关代码时,关于LoadingCache,其实思路也非常简单清晰:用模板模式解决了缓存不命中时获取数据的逻辑,这个思路我早前也正好在项目中使用到。 言归正传,为什么说LongAdder引起了我的注意,原因有二: 作者是Doug lea ,地位实在举足轻重。 他说这个比AtomicLon…

    Linux干货 2016-06-01
  • Python基础—内置数据类型

    一、简介              如果你用过C或者C++,你该知道你的许多工作集中在实现数据结构上面。你需要管理内存分配,部署内存结构等等。这些东西比较乏味,通常会让你无法集中在真正想实现的目标上面。    …

    Linux干货 2015-11-10
  • Linux基于OpenSSL实现私有CA构建

    前言 随着互联网的迅猛发展,网络通信已经成为传递信息的主要途径。而通信时的数据传输大部分却是明文传输的,在网络这个不安全的环境下,如果没有一套数据加密机制,就会导致敏感信息和重要数据泄露,引起不可估量的损失。而OpenSSL正好弥补了这一缺憾,那什么是OpenSSL呢?OpenSSL是一套强大的具有加密功能的组件,它包含libcrypto(公共加密库)、li…

    Linux干货 2015-04-13
  • 创建目录树

    创建目录树 [wing@bogon ~]$ mkdir -pv /tmp/mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,\ sysconfig/network-scripts},\ lib/modules,lib64,proc,sbin,sys,tmp,usr/local{bin,sbin},\ var/{lock,…

    Linux干货 2017-07-24
  • Shell 变量类型及用法

    一、      什么是变量          变量源于数学,在计算机语言中能储存计算机结果或能表示值的抽象概念,变量可以由变量名访问,在指令语言中,变量通常是可变的。Linux是一个多用户的操作系统。每个用户登录系统后,都会有一个…

    Linux干货 2016-08-12
  • 推荐-tree命令的安装和使用

    一、前言     tree命令是可以把指定文件夹的所以文件用树状罗列出来,呈现目录形式的一个命令。在Centos 6.5中默认不能直接使用: 输入type tree命令(type COMMAND:区别是内建命令还是外部命令)提示不存在: 二、安装       …

    系统运维 2016-03-27