Keepalived + HAProxy 搭建【第二篇】Keepalived 的安装与配置
第一步:准备
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..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= prog="keepalived" start() {
echo -n $"Starting $prog: "
daemon keepalived ${KEEPALIVED_OPTIONS}
RETVAL=$?
echo
[ $RETVAL -eq ] && touch /var/lock/subsys/$prog
} stop() {
echo -n $"Stopping $prog: "
killproc keepalived
RETVAL=$?
echo
[ $RETVAL -eq ] && rm -f /var/lock/subsys/$prog
} reload() {
echo -n $"Reloading $prog: "
killproc keepalived -
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=
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 #脚本运行周期
weight #每次检查的加权权重值
}
#虚拟路由配置
vrrp_instance VI_1 {
state MASTER #本机实例状态,MASTER/BACKUP,备机配置文件中请写BACKUP
interface eno16777736 #本机网卡名称,使用ifconfig命令查看
virtual_router_id #虚拟路由编号,主备机保持一致
priority #本机初始权重,备机请填写小于主机的值(例如100)
advert_int #争抢虚地址的周期,秒
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,修改完成后,重启,主备切换正常。

Keepalived + HAProxy 搭建【第二篇】Keepalived 的安装与配置的更多相关文章
- Keepalived + HAProxy 搭建【第二篇】Keepalived 安装与配置
第一步:准备 1. 简介 本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异 ...
- CentOS 7下Keepalived + HAProxy 搭建配置详解
第一步:准备 1. 简介 本文搭建的是利用 Keepalived 实现 HAProxy 的热备方案,即两台主机上的 HAProxy 实例同时运行,其中全总较高的实例为 MASTER,MASTER出现异 ...
- 从零开始搭建系统2.8——HDFS安装及配置
从零开始搭建系统2.8——HDFS安装及配置
- docker swarm使用keepalived+haproxy搭建基于percona-xtradb-cluster方案的高可用mysql集群
一.部署环境 序号 hostname ip 备注 1 manager107 10.0.3.107 centos7;3.10.0-957.1.3.el7.x86_64 2 worker68 10.0.3 ...
- Keepalived+HAProxy 搭建高可用负载均衡
转载自:https://mp.weixin.qq.com/s/VebiWftaRa26x1aA21Jqww 1. 概述 软件负载均衡技术是指可以为多个后端服务器节点提供前端IP流量分发调度服务的软件技 ...
- Keepalived+Haproxy搭建高可用负载均衡
Keepalived 简单的是一个路由的软件用C写的这个项目的主要目标是提供简单而强大的设施的负载均衡和高可用性对Linux系统和基于Linux的基础设施.负载均衡架构依赖于众所周知的和广泛使用的Li ...
- CDH6.2安装配置第二篇:CDH安装的前期配置
本篇介绍cdh安装之前需要的一些必要配置,当然这些配置也可以用shell脚本来配置.在安装之前请先配置好yum源,在文中用的统一都是阿里源.在安装的时候,要确保主机的内存是4G以上,要不然会无限重启c ...
- g4e基础篇#3 Git安装与配置
g4e 是 Git for Enterprise Developer的简写,这个系列文章会统一使用g4e作为标识,便于大家查看和搜索. 章节目录 前言 1. 基础篇: 为什么要使用版本控制系统 Git ...
- Keepalived + HAProxy 搭建【第一篇】HAProxy 的安装和配置
第一步:准备 1. 操作系统 CentOS-7-x86_64-Everything-1511 2. 安装包 haproxy-1.7.2.tar.gz 第二步:安装 # tar zxvf haproxy ...
随机推荐
- stm32f103c8t6命名
stm32f103c8t6和stm32f103rbt c8:48脚.64k :rb:64脚.128k.
- Java中ArrayList类
ArratList 类:存放同一数据类型容器(只能为引用数据类型,因实际其内部存放的是地址) 1.导入其所在包 import java.util.ArratList 2.创建对象 ArrayList& ...
- android 按两次物理返回键退出程序
<?xml version="1.0" encoding="utf-8"?> <!-- 定义当前布局的基本LinearLayout --> ...
- Go -- log4go日志
折腾: [已解决]go语言中实现log信息同时输出到文件和控制台(命令行) 期间,已经通过io的MultiWriter搞定了同时输出信息到文件和console,但是不支持level. 所以,再去试试这 ...
- Android ZXing 二维码、条形码扫描介绍
本帖最后由 Shims 于 2013-11-9 12:39 编辑 最近公司的Android项目需要用到摄像头做条码或二维码的扫描,Google一下,发现一个开源的 ZXing项目.它提供二维码和条形码 ...
- python 怎么启动一个外部命令程序, 并且不阻塞当前进程
http://www.myexception.cn/perl-python/1278887.html http://blog.chinaunix.net/uid-25979788-id-3081912 ...
- weex 项目开发(五)自定义 过滤函数 和 混合 及 自定义 Header 组件
1.自定义 过滤函数 src / filters / index.js /** * 自定义 过滤函数 */ export function host (url) { if (!url) return ...
- javascript读取和改动原型特别须要注意的事儿,由于原型的读写不具有对等性
对于从原型对象继承而来的成员,其读和写具有内在的不正确等性.比方有一个对象A,假设它的原型对象是B.B的原型对象是null.假设我们须要读取A对象的name属性值,那么JS会优先在A中查找.假设找到了 ...
- mips-openwrt-linux-gcc test_usbsw.c -o usbsw 编译问题
mips-openwrt-linux-gcc: warning: environment variable 'STAGING_DIR' not defined mips-openwrt-linux ...
- activemq的安装使用
近期有项目中用到消息队列,JMS规范中实现最好的开源框架就是activemq.所以选择它(当然这是我老大决定的,像我这样的刚入职场的小菜鸟考虑问题还不太全面)作为消息队列数据传输.公司有有成型的消息队 ...