Chinaunix首页 | 论坛 | 博客
  • 博客访问: 355561
  • 博文数量: 34
  • 博客积分: 251
  • 博客等级: 二等列兵
  • 技术积分: 419
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-21 15:50
文章分类

全部博文(34)

文章存档

2017年(5)

2016年(19)

2012年(10)

我的朋友

分类: 系统运维

2017-03-27 20:40:13

Keepalived实现高可用

参考文档:

1.    keepalived user guide

2.    安装文档:源码解压包中的INSTALL文档

本文涉及keepalived的安装,简单配置,为haproxy做高可用。

一.环境准备

1.  操作系统

CentOS-7-x86_64-Everything-1511

2.  Keepalived版本

截至2017-03-22keepalived版本是1.3.5:

3.  拓扑图


1)       采用VMware ESXi虚拟出的2台服务器node1/2,前端访问地址10.11.4.151/152,后端地址192.168.4.151/2

2)       Web1服务器为采用docker技术生成的1台服务器,已安装并启动nginxphp服务,ip地址192.168.4.171

3)       Web2/3Web1服务器,ip地址192.168.4.172/173

4)       计划在node1/2两台服务器上部署keepalive&haproxy,利用keepalived虚拟出vip10.11.4.150做高可用;

5)       Haproxy相关配置请参考:http://blog.chinaunix.net/uid-26168435-id-5761429.html,调整后将静态网页指向web1/2服务器的index.html,将动态网页指向web1/2服务器的index.php,其他指向web3服务器;

6)       web1为例,设置测试页面,以方便后续查看验证结果。

二.Keepalived安装配置

以下流程均在node1节点完成,node2节点请参考node1做适当修改。

1.  依赖软件

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# yum install openssl-devel libnl3-devel ipset-devel iptables-devel libnfnetlink-devel popt popt-static popt-devel gcc kernel-headers kernel-devel net-snmp-devel -y

#升级或者安装相关软件,不是必需都安装一次,但一般libnl3-devel ipset-devel iptables-devel libnfnetlink-devel popt popt-static popt-devel等并没有预安装到系统中,net-snmp-devel是需要开启相关功能才需要。

2.  下载

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# cd /usr/local/src/
  2. [root@elk-node1 src]#wget http://www.keepalived.org/software/keepalived-1.3.5.tar.gz

3.  编译安装

点击(此处)折叠或打开

  1. [root@elk-node1 src]# tar -zxvf keepalived-1.3.5.tar.gz
  2. [root@elk-node1 src]# cd keepalived-1.3.5
  3. [root@elk-node1 keepalived-1.3.5]# ./configure --prefix=/usr/local/keepalived
  4. [root@elk-node1 keepalived-1.3.5]# make
  5. [root@elk-node1 keepalived-1.3.5]# make install

#编译前可通过”./configure --help”查看相关编译参数;

#此编译未带“--with-kernel-dir”参数,一般认为采用”--with-kernel-dir=/usr/src/kernels/(version)”指定到内核效果更好,可能本人环境比较简单,实际使用后并没有明显的问题;这里未指定是因为centos7在编译使用参数之后找不到”linux/netlink.h”头文件,即使在相应目录下能找到相应头文件,搜了一下也没有找到对应的解决方案。

4.  配置开机启动

1)   启动相关命令

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# cd /usr/local/keepalived/
  2. [root@elk-node1 keepalived]# ln -s /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  3. [root@elk-node1 keepalived]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/

#软链接。

2)   配置文件

点击(此处)折叠或打开

  1. [root@elk-node1 keepalived]# mkdir -p /etc/keepalived
  2. [root@elk-node1 keepalived]# ln -s /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

#软链接。

3)   开机启动

点击(此处)折叠或打开

  1. [root@elk-node1 keepalived]# touch /etc/rc.d/init.d/keepalived
  2. [root@elk-node1 keepalived]# chmod +x /etc/rc.d/init.d/keepalived
  3. [root@elk-node1 keepalived]# vim /etc/rc.d/init.d/keepalived
  4. #!/bin/sh
  5. #
  6. # keepalived High Availability monitor built upon LVS and VRRP
  7. #
  8. # chkconfig: - 86 14
  9. # description: Robust keepalive facility to the Linux Virtual Server project \
  10. # with multilayer TCP/IP stack checks.
  11. ### BEGIN INIT INFO
  12. # Provides: keepalived
  13. # Required-Start: $local_fs $network $named $syslog
  14. # Required-Stop: $local_fs $network $named $syslog
  15. # Should-Start: smtpdaemon httpd
  16. # Should-Stop: smtpdaemon httpd
  17. # Default-Start:
  18. # Default-Stop: 0 1 2 3 4 5 6
  19. # Short-Description: High Availability monitor built upon LVS and VRRP
  20. # Description: Robust keepalive facility to the Linux Virtual Server
  21. # project with multilayer TCP/IP stack checks.
  22. ### END INIT INFO
  23. # Source function library.
  24. . /etc/rc.d/init.d/functions
  25. exec="/usr/sbin/keepalived"
  26. prog="keepalived"
  27. config="/etc/keepalived/keepalived.conf"
  28. [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
  29. lockfile=/var/lock/subsys/keepalived
  30. start() {
  31.     [ -x $exec ] || exit 5
  32.     [ -e $config ] || exit 6
  33.     echo -n $"Starting $prog: "
  34.     daemon $exec $KEEPALIVED_OPTIONS
  35.     retval=$?
  36.     echo
  37.     [ $retval -eq 0 ] && touch $lockfile
  38.     return $retval
  39. }
  40. stop() {
  41.     echo -n $"Stopping $prog: "
  42.     killproc $prog
  43.     retval=$?
  44.     echo
  45.     [ $retval -eq 0 ] && rm -f $lockfile
  46.     return $retval
  47. }
  48. restart() {
  49.     stop
  50.     start
  51. }
  52. reload() {
  53.     echo -n $"Reloading $prog: "
  54.     killproc $prog -1
  55.     retval=$?
  56.     echo
  57.     return $retval
  58. }
  59. force_reload() {
  60.     restart
  61. }
  62. rh_status() {
  63.     status $prog
  64. }
  65. rh_status_q() {
  66.     rh_status &>/dev/null
  67. }
  68. case "$1" in
  69.     start)
  70.         rh_status_q && exit 0
  71.         $1
  72.         ;;
  73.     stop)
  74.         rh_status_q || exit 0
  75.         $1
  76.         ;;
  77.     restart)
  78.         $1
  79.         ;;
  80.     reload)
  81.         rh_status_q || exit 7
  82.         $1
  83.         ;;
  84.     force-reload)
  85.         force_reload
  86.         ;;
  87.     status)
  88.         rh_status
  89.         ;;
  90.     condrestart|try-restart)
  91.         rh_status_q || exit 0
  92.         restart
  93.         ;;
  94.     *)
  95.         echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
  96.         exit 2
  97. esac
  98. exit $?
  99. [root@elk-node1 keepalived]# chkconfig --add keepalived
  100. [root@elk-node1 keepalived]# chkconfig --level 35 keepalived on

#centos7编译安装目录下,默认没有”etc/rc.d/init.d/keepalived”文件,即自启脚本,需要手工配置,前提是将启动相关命令,配置文件等按脚本定义的目录放置。

5.  Keepalived配置文件

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# vim /usr/local/keepalived/etc/keepalived/keepalived.conf
  2. #=====================================================
  3. # keepalived.conf 配置
  4. #------------------------------------------------------------
  5. # 1、Keepalived 配置文件以block形式组织,每个块内容都包含在{}
  6. # 2、“#”,“!”开头行为注释
  7. # 3、keepalived 配置为三类:
  8. # (1)全局配置:对整个keepalived都生效的配置
  9. # (2)VRRPD 配置:核心配置,主要实现keepalived高可用功能
  10. # (3)LVS配置
  11. #=====================================================
  12. ! Configuration File for keepalived
  13. ########################
  14. # 全局配置
  15. ########################
  16. # global_defs 全局配置标识;
  17. global_defs {
  18. # notification_email用于设置报警邮件地址; 可以设置多个,每行一个; 设置邮件报警需开启本机Sendmail服务
  19.    notification_email {
  20.      root@localhost.local
  21.    }
  22. # 设置邮件发送地址, smtp server地址, 连接smtp sever超时时间
  23.    notification_email_from root@localhost.local
  24.    smtp_server 10.11.4.151
  25.    smtp_connect_timeout 30
  26. # 表示运行keepalived服务器标识,邮件发送时在主题中显示的信息
  27.    router_id Haproxy_DEVEL
  28. }
  29. ######################
  30. # 服务检测配置
  31. ######################
  32. # 服务探测,che_haproxy为服务名返回0说明服务是正常的
  33.     vrrp_script chk_haproxy {
  34.         script "/usr/local/keepalived/etc/chk_haproxy.sh"
  35. #每隔1秒探测一次
  36.         interval 1
  37. #haproxy在线,权重加2
  38. # weight 2
  39. }
  40. ######################
  41. # VRRPD配置
  42. ######################
  43. # VRRPD配置标识,VI_1是实例名称
  44. vrrp_instance VI_1 {
  45. # 指定Keepalvied角色,MASTER(必须大写)表示此主机为主服务器,BACKUP则是表示为备用服务器;
  46. # 这里因为配置非抢占模式,nopreempt只作用于BACKUP,将2台主机均配置为BACKUP
  47.     state BACKUP
  48. # 指定HA监测网络的接口
  49.     interface eth0
  50. # 虚拟路由标识,标识为数字,1-255可选;
  51. # 同1个VRRP实例使用唯一的标识,MASTER_ID = BACKUP_ID
  52.     virtual_router_id 51
  53. # 定义节点优先级,数字越大表示节点的优先级越高;
  54. # 同1个VRRP_instance下,MASTE_PRIORITY > BACKUP_PRIORITY
  55.     priority 100
  56. # MASTER与BACKUP主机之间同步检查的时间间隔,单位为秒
  57.     advert_int 1
  58. # 从实际应用角度,建议配置非抢占模式,防止网络频繁切换震荡
  59.     nopreempt
  60. # 设定节点间通信验证类型与密码,验证类型主要有PASS和AH两种;
  61. # 同1个vrrp_instance,MASTER验证密码和BACKUP保持一致
  62.     authentication {
  63.         auth_type PASS
  64.         auth_pass 987654
  65.     }
  66. # 设置虚拟IP地址(VIP),又叫做漂移IP地址;
  67. # 可设置多个,1行1个;
  68. # keepalived通过“ip address add”命令的形式将VIP添加到系统
  69.     virtual_ipaddress {
  70.         10.11.4.150
  71.     }
  72. # 脚本追踪,对应服务检测
  73.     track_script {
  74.         chk_haproxy
  75.     }
  76. }
  77. ##############################################
  78. # LVS配置,这里keepalived只做高可用,并不做lvs
  79. ##############################################
  80. # virtual_server LVS配置标识
  81. # 格式: virtual_server VIP port [IP 和 port 之间空格隔开]
  82. # virtual_server 10.11.4.150 443 {
  83. # 设置健康检查时间间隔,单位为秒
  84. # delay_loop 6
  85. # 设置负载调度算法,常用调度算法是: rr、wlc,另有:lc、lblc、sh、dh等
  86. # lb_algo rr
  87. # 设置LVS实现负载均衡的机制,有NAT、TUN和DR三种模式可选
  88. # lb_kind NAT
  89. # 会话保持时间,其对动态网页非常有用,为集群系统中的seesion共享提供了一个很好的解决方案;
  90. # 用户的请求会一直分发到某个服务节点,直至超过这个会话的保持时间(指最大无响应超时时间),
  91. # 即用户操作动态页面如果在50s没有执行任何操作则被分发到另外的节点
  92. # persistence_timeout 50
  93. # 转发协议类型
  94. # protocol TCP
  95. # 设置real server段开始的标识 [ IP为真实IP地址]
  96. # 格式:real_server realIP port [IP 和 port 之间空格隔开]
  97. # real_server 192.168.201.100 443 {
  98. # real server节点的权值,权值大小用数字表示,数字越大,权值越高
  99. # weight 1
  100. # 健康检查 SSL_GET
  101. # SSL_GET {
  102. # 指定SSL检查的URL信息,可以指定多个
  103. # url {
  104. # 详细的URL路径
  105. # path /index.html
  106. # SSL检查后的摘要信息,可以通过genhash命令工具获取,命令如下:
  107. # [root@elk-node1 bin]# /usr/local/keepalived/bin/genhash -s 192.168.4.171 -p 80 -u /index.html
  108. # digest ff20ad2481f97b1754ef3e12ecd3a9cc
  109. # }
  110. # url {
  111. # path /mrtg/
  112. # digest 9b3a0c85a887a256d6939da88aabd8cd
  113. # }
  114. # 无响应超时时间,单位为秒
  115. # connect_timeout 3
  116. # 重试次数
  117. # nb_get_retry 3
  118. # 重试间隔
  119. # delay_before_retry 3
  120. # }
  121. # }
  122. #}

6.  Keepalived检测脚本

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# touch /usr/local/keepalived/etc/chk_haproxy.sh
  2. [root@elk-node1 ~]# chmod 755 /usr/local/keepalived/etc/chk_haproxy.sh
  3. [root@elk-node1 ~]# vim /usr/local/keepalived/etc/chk_haproxy.sh
  4. #!/bin/bash
  5. # check haproxy process, if there isn't any process, try to start the process once,
  6. # check it again after 3s, if there isn't any process still, restart keepalived process, change state.
  7. # 2017-03-22 v0.1
  8. if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
  9.      /etc/rc.d/init.d/haproxy start
  10.      sleep 3
  11.      if [ $(ps -C haproxy --no-header | wc -l) -eq 0 ]; then
  12.           /etc/rc.d/init.d/keepalived restart
  13.      fi
  14. fi
  15. # another method to check haproxy process
  16. #killall -0 haproxy
  17. #if [[ $? -ne 0 ]];then
  18. # /etc/rc.d/init.d/keepalived restart
  19. #fi

#检测haproxy服务是否正常运行,如果没有则尝试拉起来,如果尝试失败则重启keepalived服务,切换keepalivedvip

三.验证

1.  启动

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# service keepalived start
  2. [root@elk-node2 ~]# service keepalived start

2.  查看日志

1)   Node1

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# tailf /var/log/messages


1)    BACKUP模式启动;

2)    切换到MASTER模式;

3)    获得vip 10.11.4.150,开始对外发送免费arp通告。

2)   Node2

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# tailf /var/log/messages


1)    两个相关子进程启动;

2)    启动后进入BACKUP模式。

3.  VIP

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# ip address show eth0


Node1
的网卡eth0已经获得vip 10.11.4.150

#因使用的是”ip address add”添加的vip到系统中,所以”ifconfig”命令看不到效果。

4.  故障切换

1)   Haproxy故障拉起

点击(此处)折叠或打开

  1. [root@elk-node1 ~]# date ; service haproxy stop
  2. [root@elk-node1 ~]# date ; service haproxy status


1)    手工停止haproxy服务;

2)    因为keepalived配置文件中定义了拉起haproxy服务的脚本,可以看到1s的时间内,haproxy服务又开始运行了。

2)   Node1日志


1)    日志显示haproxy服务停止后再被拉起;

2)    Keepalived进入FAULT STATE,进而转到BACKUP STATE

3)    Node1eth0网卡的vip被删除。

3)   Node2日志


1)    Node2转到MASTER STATE;

2)    Node2获得vip 10.11.4.150,并开始对外发免费arp通告。

4)   Node2 VIP

点击(此处)折叠或打开

  1. [root@elk-node2 ~]# ip address show eth0


Node2
的网卡eth0已经获得vip 10.11.4.150

阅读(5702) | 评论(0) | 转发(0) |
0

上一篇:CentOS7部署Haproxy 1.7.2

下一篇:MySQL主从复制

给主人留下些什么吧!~~