Ubuntu编译安装HAprox+Keepalived+MySQL负载高可用架构(结合Docker容器配置)
系统环境:Ubuntu16.04(Docker容器)
架构环境:
Keepalived/HAproxy MASTER: 172.17.0.4
Keepalived/HAproxy BACKUP: 172.17.0.6
MySQL MASTER: 172.17.0.2
MySQL SLAVE: 172.17.0.3
HAproxy版本:haproxy-2.0.8.tar.gz
Keepalived版本:keepalived-2.0.19.tar.gz
一、安装HAproxy(MASTER/BACKUP两台都要装)
1、前往官网https://www.haproxy.org/ 下载HAproxy
解压,进入haproxy-2.0.8目录
vim INSTALL;查看安装说明

2、编译安装HAproxy
(1)编译
报错1:bash: make: command not found

我直接用docker容易,make命令没安装,安装一下:
apt-get -y install make
然后执行:
make -j 2 TARGET=generic USE_GZIP=1
报错2:/bin/sh: 1: gcc: not found

未安装gcc,安装gcc:
apt-get -y install gcc
然后再执行:
make -j 2 TARGET=generic USE_GZIP=1
暂时未报错:

(2)安装
直接执行:
make install PREFIX=/usr/local/HAproxy2.0.8

(3)复制命令至/usr/local/sbin/下

3、添加服务启动脚本文件
vim /etc/init.d/haproxy
#!/bin/bash
#
# chkconfig:
# descrition: haproxy loadbalancer DAEMON=haproxy
PROG_DIR=/usr/local/HAproxy2.0.8
RETVAL= success() { #跟朋友的探讨,使用shell本身来实现;当然也可以使用for的遍历循环,
总之方法有很多种
for ((i=;i<=;i++))
do
sleep 0.2
echo -n "."
done
} start ()
{
PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
if [ -z "$PROG_STAT" ]; then
$PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg
echo -ne "Starting ${DAEMON}......\t\t\t" && success
echo -e "\e[32m[OK]\e[0m"
else
echo "$DAEMON is already running"
RETVAL=
fi
} stop ()
{
PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
if [ -n "$PROG_STAT" ]; then
echo -ne "stopping ${DAEMON}......\t\t\t" && success
PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
kill $PROG_PID
echo -e "\e[32m[OK]\e[0m"
else
echo "$DAEMON is already stopped"
RETVAL=
fi
} restart()
{
echo -ne "restarting ${DAEMON}......\t\t\t" && success
PROG_PID=$(cat $PROG_DIR/run/${DAEMON}.pid)
$PROG_DIR/sbin/$DAEMON -f $PROG_DIR/conf/${DAEMON}.cfg -st $PROG_PID
echo -e "\e[32m[OK]\e[0m"
} status ()
{
PROG_STAT=$(netstat -tlnp | grep ${DAEMON})
if [ -z "$PROG_STAT" ]; then
echo "${DAEMON} stopped"
else
echo "${DAEMON} running"
fi
} case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "Usage /etc/init.d/$DAEMON {start | stop | restart | status}"
RETVAL=
esac
exit $RETVAL
赋予执行权限:
chmod +x /etc/init.d/haproxy
4、添加haproxy.conf配置文件
先创建haproxy用户与组:

再创建配置文件:
mkdir -p /etc/haproxy
vim /etc/haproxy/haproxy.conf
global
log 127.0.0.1 local2 info # 设置日志文件输出定向,info为日志级别
chroot /usr/local/HAproxy2.0.8 # 改变当前工作目录
pidfile /usr/local/HAproxy2.0.8/run/haproxy.pid #PID文件位置
user haproxy # 用户与用户组
group haproxy
daemon # 守护进程启动,运维方式为后台工作
maxconn # 最大连接数 # 作用于其后紧跟的listen块,直至下一个defaults 块,下一个default 将替换上一个块作用于以后的listen
defaults
log global #启动每个实例日志记录事件和流量
mode http #默认的模式mode {tcp|http|health},tcp是四层,http是七层,health只会返回ok
retries #对server的connection失败后,重试的次数
option redispatch #启用或禁止在连接故障情况下的会话重新分配
maxconn #maxconn每个进程可用的最大连接数
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s frontend main
bind 0.0.0.0:
default_backend mysql backend mysql
balance leastconn #算法:最少连接数
server mysql1 172.17.0.2: check port maxconn
server mysql2 172.17.0.3: check port maxconn
复制一份配置文件到该目录:
cp -a /etc/haproxy/haproxy.conf /usr/local/HAproxy2.0.8/conf/haproxy.cfg
来启动haproxyd服务
/etc/init.d/haproxy start

显示服务启动成功,端口也在
二、安装Keepalived
1、前往官网下载所需版本https://www.keepalived.org/
同样解压,进入目录,查看安装说明文档(此处忽略)
2、编译扮装
(1)检查环境
./configure --prefix=/usr/local/keepalived-2.0.19
报错1:Can not include OpenSSL headers files

没有openssl,执行:
apt-get -y install openssl libssl-dev
注意:redhat和centos中是需要安装openssl和openssl-devel的,在ubuntu中,openssl-devel被libssl-dev所代替,安装libssl-dev即可
再重新检查环境~

ok,每问题,警告忽视
(2)编译、编译安装
make && make install

ok,编译安装完成
3、编辑配置文件
cp /usr/local/keepalived-2.0.19/etc/keepalived/keepalived.conf /etc/keepalived/ #复制配置文件
cp /usr/local/keepalived-2.0.19/sbin/keepalived /usr/local/sbin/
cp /usr/local/keepalived-2.0.19/etc/rc.d/init.d/keepalived /etc/init.d/ #复制服务启动文件
chmod +x /etc/init.d/keepalived
vim /etc/keepalived/keepalived.conf(MASTER机)
! Configuration File for keepalived
global_defs {
router_id r1 #虚拟路由名称,master和backup不能一致
}
vrrp_script chk_haproxy { #定义检查脚本
script "/etc/keepalived/chk_haproxy.sh" #脚本位置
interval #每3秒检测一次
fall #失败判断3次
# weight - #失败后权重-
}
vrrp_instance VI_1 {
state MASTER #状态,只有MASTER或BACKUP
interface eth0 #网卡名称,注意一定要是自己正在使用的网卡名称
virtual_router_id #虚拟路由id,是虚拟路由的mac最后两位
priority #优先级
advert_int #通告间隔时间
authentication { #认证
auth_type PASS
auth_pass
}
track_script { #执行以上脚本
chk_haproxy
}
virtual_ipaddress { #VIP地址,同网段
172.17.0.253
}
# notify_master "/etc/init.d/haproxy start" #当 当前节点成为master时,执行的任务
# notify_backup "/etc/init.d/haproxy restart" #当 当前节点成为backup时,执行的任务
# notify_fault "/etc/init.d/haproxy stop" #当 当前节点出现故障时,执行的任务
}
ok,创建健康检查脚本文件
vim /etc/keepalived/chk_haproxy.sh
#/bin/bash STAT=`ps -C haproxy --no-header | wc -l` if [[ ! "$STAT" -eq ]];then
/etc/init.d/keepalived stop
fi
如果进程未在,直接关闭keepalived
chmod +x chk_haproxy.sh #给个执行权限
4、启动keepalived服务
启动文件中某些文件不存在,需要手动链接一下(ubuntu就是麻烦):

ln -s /lib/lsb/init-functions /etc/init.d/functions
mkdir /etc/rc.d
ln -s /etc/init.d /etc/rc.d/
cp /src/keepalived-2.0.19/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
然后安装daemon命令:
apt-get -y install daemon
注意图中,daemon -- keepalived 之前是 daemon keepalived,加了两条横杠
这个命令是有问题的,其中的-D本来是给keepalived用的,但这样组合后被认为是daemon命令的参数。这会导致服务不能启动。 如果不修改,会提示启动失败,但却不输出具体信息。
注意,由于我是使用docker容器安装的keepalived,所以我需要将此容器保存成镜像,然后再重新docker run,要加上--privileged这个参数,才能显示keepalived的VIP(不是用容器安装的可以忽略)
docker run -dit --privileged --name ha_keep -p 3308:3307 ha_keep
下边启动服务:
/etc/init.d/keepalived start

执行:ip addr

5、配置BACKUP机
haproxy服务于MASTER机一致,keepalived服务主要修改主配置文件
Keepalived/BACKUP机配置文件:
! Configuration File for keepalived
global_defs {
router_id r2 #虚拟路由名称,master和backup不能一致
}
vrrp_script chk_haproxy { #定义检查脚本
script "/etc/keepalived.chk_haproxy.sh" #脚本位置
interval #每3秒检测一次
fall #失败判断3次
# weight - #失败后权重-
}
vrrp_instance VI_1 {
state BACKUP #状态,只有MASTER或BACKUP
interface eth0 #网卡名称,注意一定要是自己正在使用的网卡名称
virtual_router_id #虚拟路由id,是虚拟路由的mac最后两位
priority #优先级
advert_int #通告间隔时间
authentication { #认证
auth_type PASS
auth_pass
}
track_script {
chk_haproxy
}
virtual_ipaddress { #VIP地址,同网段
172.17.0.253
}
# notify_master "/etc/init.d/haproxy start" #当 当前节点成为master时,执行的任务
# notify_backup "/etc/init.d/haproxy restart" #当 当前节点成为backup时,执行的任务
# notify_fault "/etc/init.d/haproxy stop" #当 当前节点出现故障时,执行的任务
}
其他配置相同,然后启动keepalived
6、测试将MASTER机的haproxy服务stop,会不会自动将keepalived服务关掉,将VIP转移到BAKUP机
下图所示VIP到BACKUP机就说明配置ok

7、负载均衡高可用配置完毕,不过此架构适用于mysql主主复制或有共享存储服务器。
如有转载请标明出处
Ubuntu编译安装HAprox+Keepalived+MySQL负载高可用架构(结合Docker容器配置)的更多相关文章
- mysql复制(高可用架构方案的基础)
mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...
- 美团点评MySQL数据库高可用架构从MMM到MHA+Zebra以及MHA+Proxy的演进
本文介绍最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望. MMM ...
- Keepalived+MySQL实现高可用
MySQL的高可用方案有很多,比如Cluster,MMM,MHA,DRBD等,这些都比较复杂,我前面的文章也有介绍.最近Oracle官方也推出了Fabric.有时我们不需要这么复杂的环境,这些方案各有 ...
- mysql实现高可用架构之MHA
一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...
- 利用Keepalived+mysql构建高可用MySQL双主自动切转
转载:http://www.it300.com/index.php/article-15266.html 关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储, ...
- mysql mha高可用架构的安装
MMM无法全然地保证数据的一致性,所以MMM适用于对数据的一致性要求不是非常高.可是又想最大程度的保证业务可用性的场景对于那些对数据一致性要求非常高的业务,非常不建议採用MMM的这样的高可用性架构.那 ...
- Keepalived+MySQL实现高可用(转)
http://www.cnblogs.com/wingsless/p/4033093.html MHA高可用 http://www.cnblogs.com/gomysql/p/3856484.ht ...
- centos6.6部署mysql mmm高可用架构
一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...
- mysql mmm高可用架构设计
项目概述:搭建主从,双主,安装Perl模块 安装配置mmm软件 测试 硬件环境:4台虚拟PC 软件环境:rehl6.5 MySQL-5.6.26 percona-xtrabackup-2.3.4 ...
随机推荐
- ASP.NET Core API ——Dapper的使用
ASP.NET Core API ——Dapper的使用 简介:Dapper是一个ORM框架,负责数据库和程序语言之间的映射. 使用步骤: l 创建一个IDBConnection的接口对象 l 编 ...
- PHP reset
1.函数的作用:重置数组内部指针,并返回第一个元素 2.函数的参数: @param array $array 3. 例子一: <?php $arr1 = []; $arr2 = [false, ...
- TomCat中间件漏洞复现总汇
TomCat中间件漏洞复现 前言 在渗透测试过程中,遇到php的站相对多一点,所以对apache了解的也多一点.TomCat中间件的站了解的比较少一点,这是自己第一次搭建环境测试漏洞,所以在自己摸索的 ...
- markdown数学公式大全
目录 Cmd Markdown 公式指导手册 一.公式使用参考 1.如何插入公式 2.如何输入上下标 3.如何输入括号和分隔符 4.如何输入分数 5.如何输入开方 6.如何输入省略号 7.如何输入矢量 ...
- Leetcode(6)Z字形变换
Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...
- mysql库表优化实例
一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...
- MySQL基础篇(3)常用函数和运算符
一.字符串函数(索引位置都从1开始) CONCAT(S1,S2,...Sn): 连接S1,S2,...Sn为一个字符串,任何字符串与NULL进行连接的结果都是NULL INSERT(str,x,y,i ...
- Docker 实战—使用 Dockerfile 构建镜像
Dockerfile 指令详解请访问:https://www.cnblogs.com/cloudfloating/p/11737447.html 使用 Alpine Linux 作为基础镜像 Alpi ...
- 面向对象的7个设计原则->开车理解->贴近生活
设计模式在我们的开发中是不可或缺的一部分,很多人会说,我没用那些设计模式啊,我也开发的挺好的,其实不然,我们在开发中都用到了这些设计模式,只不过我们并没有在意这些,今天我就用开车的方法来解释一下我们的 ...
- 关于 mybatis 报invalid comparison: java.util.Arrays$ArrayList and java.lang.String异常
今天碰到个问题,来记录下,希望可以帮助到大家 贴错误源码: 这是一个根据list集合的查找数据的 sql,在接收list的时候加了判断 list != ‘ ’ “”,引起了集合与Stirng类型的比较 ...