第一步:准备

1. 简介

  本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异常时,另一台主机上的实例自动接管所有的流量。

  在运行着 HAProxy 实例的两台主机上分别运行着 Keepalived 实例,这两个 Keepalived 争抢同一个 虚 IP 地址,两个 HAProxy 也尝试着去绑定同一个虚 IP 地址上的端口。只能有一个 Keepalived 能抢到这个虚 IP,抢到这个虚 IP 的 Keepalived 的主机上的 HAProxy 即为当前的 MASTER。

  Keepalived 内部维护一个权重值,权重值最高的 Keepalived 实例能够抢到虚 IP。Keepalived 会定期检查所在主机上的 HAProxy 的状态,状态健康时,则权重值增加。

2. 操作系统

CentOS-7-x86_64-Everything-1511

3. 安装包

keepalived-1.3.4.tar.gz

4. HAProxy 安装

参照 Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装和配置 在另一台主机(本文为192.168.6.129)上安装 HAProxy 实例。

5. 安装 psmisc

使用 killall -0 检查 HAProxy 服务是否存在。如果没有 killall 命令,则需要安装 psmisc 包。

# yum intall psmisc

6. 安装 openssl

# yum install openssl-devel

不安装 openssl,keepalived 编译的时候会报错:

7. 安装 libnl/libnl-3 库

# yum install libnl*

不安装 libnl/libnl-3,keepalived 编译的时候会报警告:

8. 安装

# yum install libnfnetlink-devel

不安装 libnfnetlink-devel,keepalived 编译的时候会报错:

第二步:安装与配置

1. 安装

# tar zxzf keepalived-1.3.4.tar.gz
# # cd keepalived-1.3.4
# ./configure --prefix=/usr/local/keepalived
# make
# make install

2. 配置

1)注册为系统服务

# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
# touch /etc/init.d/keepalived
# chmod +x /etc/init.d/keepalived
# vi /etc/init.d/keepalived

/etc/init.d/keepalived 的文件内容:

#!/bin/sh
#
# Startup script for the Keepalived daemon
#
# processname: keepalived
# pidfile: /var/run/keepalived.pid
# config: /etc/keepalived/keepalived.conf
# chkconfig: - 21 79
# description: Start and stop Keepalived # Source function library
. /etc/rc.d/init.d/functions # Source configuration file (we set KEEPALIVED_OPTIONS there)
. /etc/sysconfig/keepalived RETVAL=0 prog="keepalived" start() {
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
} stop() {
echo -n $"Stopping $prog: "
killproc keepalived
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog
} reload() {
echo -n $"Reloading $prog: "
killproc keepalived -1
RETVAL=$?
echo
} # See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
stop
start
;;
condrestart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start
fi
;;
status)
status keepalived
RETVAL=$?
;;
*)
echo "Usage: $0 {start|stop|reload|restart|condrestart|status}"
RETVAL=1
esac exit $RETVAL

2)编辑配置文件

# mkdir /etc/keepalived/
# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
# vi /etc/keepalived/keepalived.conf

配置文件内容:

global_defs {
router_id LVS_DEVEL #虚拟路由名称
} #HAProxy健康检查配置
vrrp_script chk_haproxy {
script "killall -0 haproxy" #使用killall -0检查haproxy实例是否存在,性能高于ps命令
interval 2 #脚本运行周期
weight 2 #每次检查的加权权重值
} #虚拟路由配置
vrrp_instance VI_1 {
state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface eno16777736 #本机网卡名称,使用ifconfig命令查看
virtual_router_id 51 #虚拟路由编号,主备机保持一致
priority 101 #本机初始权重,备机请填写小于主机的值(例如100)
advert_int 1 #争抢虚地址的周期,秒
virtual_ipaddress {
192.168.6.131 #虚地址IP,主备机保持一致
}
track_script {
chk_haproxy #对应的健康检查配置
}
}

3. 启动

# service keepalived start

返回信息:

其他相关命令:

重启

# service keepalived restart

返回信息:

停止

# service keepalived stop

返回信息:

4. 测试

1)查看进程

# ps -ef|grep keepalived |grep -v grep

返回信息:

2)查看虚拟 IP 持有者

# ip addr sh eno16777736

其中,eno16777736 为网卡名称

持有虚 IP 的主机返回以下信息:

另一台主机返回信息:

如果先启动备机的 Keepalived,那么很有可能虚 IP 会被备机抢到,因为备机的权重配置只比主机低1,只要执行一次健康检查就能把权重提高到102,高于主机的101。

第三步:测试

进行高可用性能测试

1. 架构信息

提供服务的 server 为 Nginx,每个 nginx 上放入带有本机 IP 的 HTML 页面,相关信息如下:

IP Nginx 端口 HAProxy 端口
192.168.6.128 8080 9090
192.168.6.129 8080 9090
192.168.6.130 8080 未安装

2. 转发测试

访问地址:http://192.168.6.131:9090/hello.html

返回的页面信息:

HAProxy 日志信息(/var/log/haproxy.log):

Nginx 日志信息:

3. 高可用测试

1)停掉 Keepalived 中为 MASTER 的主机上的 HAProxy 服务

# service haproxy stop

2)查看 Keepalived 日志(/var/log/messages)

MASER(192.168.6.128)健康检查失���,权重值从103降低到101,得知更高的权重值为备机的102,则进入备机状态:

192.168.6.128 将虚 IP 释放:

BACKUP(192.168.6.129)被选举为 MASTER:

192.168.6.129 获得虚 IP:

2)访问页面

地址:http://192.168.6.131:9090/hello.html

页面返回信息:

HAProxy 日志信息(/var/log/haproxy.log):

Nginx 日志信息:

附:搭建过程中遇到的问题

一、Haproxy 的问题

1. 现象

通过虚 IP 无法访问到 HAProxy,通过主机 IP 可以访问大 HAProxy。

2. 解决办法

配置 HAProxy 时,bind 的配置,写成了固定 IP:PORT 的格式,此时 HAProxy 无法绑定虚拟 IP 。将改行配置改成 bind *:port,问题解决。

二、Keepalived 的问题

1. 现象:

停止 MASTER 主机上的 HAProxy 服务,虚 IP 不漂移到 BACKUP 主机上。

2. 问题处理过程

1)健康检查脚本

首先怀疑健康检查脚本的问题。

进行手动执行:

HAProxy 未启动时:

HAProxy 启动时:

说明脚本没有问题,排除该脚本问题。

2)Keepalived 主备切换

怀疑 Keepalived 本身就不能切换。

停止 MASTER 的 Keepalived 服务,发现虚 IP 漂移到了 BACKUP 主机上。

说明 Keepalived 可以进行主备切换

3)版本

怀疑 Keepalived 版本的问题。

安装其他的版本,问题依然未解决。

排除版本问题

4)其他

主备配置字段、执行检测脚本的配置字段等,均已排除。

3. 解决办法

1)查看 Keepalived 的日志,发现一直打印 pid 退出的的日志,怀疑与此有关。

2)观察 Keepalived 启动过程的日志,日志中提示健康检查脚本中的 killall 使用完整的路径,即 /usr/bin/killall,修改完成后,重启,主备切换正常。

CentOS 7下Keepalived + HAProxy 搭建配置详解的更多相关文章

  1. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  2. Linux/centos/redhat下各种压缩解压缩方式详解

    1.zip命令 zip -r myfile.zip ./* 将当前目录下的所有文件和文件夹全部压缩成myfile.zip文件,-r表示递归压缩子目录下所有文件. 2.unzip unzip -o -d ...

  3. 基于 CentOS Mysql 安装与主从同步配置详解

    CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操 ...

  4. 【E20200105-1】Centos 7.x 下vsftpd配置文件常用配置详解

    centos 7 下vsftp的安装和配置可以参见<[E20200102-1]centos 7 下vsftp的安装和配置> ########匿名用户(anonymous)设置####### ...

  5. Keepalived部署与配置详解

    Keepalive详解 工作原理 Keepalived本质就是为ipvs服务的,它也不需要共享存储.IPVS其实就是一些规则,Keepalived主要的任务就是去调用ipvsadm命令,来生成规则,并 ...

  6. CentOS6.5下的Nagios安装配置详解(图文)

    最近因为,科研需要,接触上了Nagios,这里,我将安装笔记做个详解.为自己后续需要和博友们学习! VMware workstation 11 的下载 VMWare Workstation 11的安装 ...

  7. HAProxy安装配置详解

    简介 HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案. HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要 ...

  8. Linux下MongoDB安装和配置详解

    1.下载安装包 将解压到/usr/local/mongodb 文件夹下 # mkdir /usr/local/mongodb # tar zxvf mongodb-linux-x86_64-3.2.9 ...

  9. Jdk在window环境下的安装与配置详解

    本文为博主原创,转载请注明出处: 1.2  Java程序开发环境的配置 java开发工具包:java开发工具:记事本 IDE,这个只能写小程序,写大程序需要集成开发工具:反编译工具(我们可以在网上找一 ...

随机推荐

  1. luoguT21777

    #include <algorithm> #include <iostream> #include <cstring> #include <cstdio> ...

  2. 为应用指定多个struts配置文件

    在大部分应用里,随着应用规模的增加,系统中Action的数量也会大量增加,导致struts.xml配置文件变得非常臃肿.为了避免struts.xml文件过于庞大.臃肿,提高struts.xml文件的可 ...

  3. 图论trainning-part-1 D. Going in Cycle!!

    D. Going in Cycle!! Time Limit: 3000ms Memory Limit: 131072KB 64-bit integer IO format: %lld      Ja ...

  4. Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路

     Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...

  5. DBCA建库出错ORA-00600: internal error code, arguments

    正常步骤安装完成Oralce,通过dbca建库,报错如下图所示: Oracle安装日志中报错如下: [Thread-40] [ 1999-12-15 12:23:54.055 CST ] [Basic ...

  6. B题 Sort the Array

    题目大意:判断能否通过一次倒置,使序列变为一个递增序列 如果可以,输出倒置那一段的起始点和终点的位置: 题目链接:http://codeforces.com/problemset/problem/45 ...

  7. Session保存用户名到Session域对象中

    Session保存用户名 1.构造登录界面 用户名: 密   码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <!DOCTYPE html> < ...

  8. java打开本地应用程序(调用cmd)---Runtime用法详解

    有时候我们需要借助java程序打开电脑自带的一些程序,可以直接打开或者借助cmd命令窗口打开一些常用的应用程序或者脚本,在cmd窗口执行的命令都可以通过这种方式运行. 例如: package cn.x ...

  9. 在线修改MySQL大表的表结构

    由于某个临时需求,需要给在线MySQL的某个超过千万的表增加一个字段.此表在设计之时完全按照需求实现,并没有多余的保留字段. 我们知道在MySQL中如果要执行ALTER TABLE操作,MySQL会通 ...

  10. P1546||2627 最短网络 Agri-Net 洛谷||codevs

    https://www.luogu.org/problem/show?pid=1546 同http://codevs.cn/problem/2627/ 不同算法 题目背景 农民约翰被选为他们镇的镇长! ...