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 ...
随机推荐
- Python3实战spark大数据分析及调度 ☝☝☝
Python3实战spark大数据分析及调度 ☝☝☝ 一.实例分析 1.1 数据 student.txt 1.2 代码 二.代码解析 2.1函数解析 2.1.1 collect() RDD的特性 在 ...
- java高并发----个人学习理解汇总记录
1.首先,需要理解几个概念 1.同步(Synchronous):同步方法调用一旦开始,调用者必须等到前面的方法调用返回后,才能继续后续的行为,依次直到完成所有. 2.异步(Asynchronous): ...
- 机器学习:IB1算法的weka源码详细解析(1NN)
机器学习的1NN最近邻算法,在weka里叫IB1,是因为Instance Base 1 ,也就是只基于一个最近邻的实例的惰性学习算法. 下面总结一下,weka中对IB1源码的学习总结. 首先需要把 ...
- Vulnhub靶场渗透练习(二) Billu_b0x
运行虚拟机直接上nmap扫描 获取靶场ip nmap 192.168.18.* 开放端口 TCP 22 SSH OpenSSH 5.9p1 TCP 80 HTTP Apache httpd 2.2.2 ...
- 5.Linux文件管理相关命令(下)
1.文件管理之:联网下载文件(wget.curl).文件上传与下载(rz.sz) 1.wget命令 1.CentOS7 系统最小化安装默认没有wget命令,需要进行安装 [root@oldboyedu ...
- javascript学习 first-day
1.javascript是一种客户端语言,设计它的目的是在用户的机器上而不是服务器上执行任务. 1.1 javascript不允许写服务器机器上的语言: 1.2 Javascript不能关闭不是由 ...
- 学习python3高阶函数笔记和demo
python的高阶函数的定义是:一个函数接收另一个函数作为参数,这种函数就称之为高阶函数 举一个最简单的例子: def text(a,b,c): return c(a)+c(b) print( tex ...
- Java线程切换(一)
(本文由言念小文原创,转载请注明出处) 一 前言有Android开发经验的同学都清楚,UI的更新必须在主线程中进行,且主线程不能被阻塞,否则系统ANR异常.我们往往做一些数据处理是耗时操作,必须要在 ...
- Django之多对多表之through第三张表之InlineModelAdmin后台内嵌
话不多说,来看表结构 这里有两个表,一个是阶段表,一个是老师表,一个老师可以带多个阶段,一个阶段也可以由多个老师带,所以是多对多关系 # 阶段表 class Stage(models.Model): ...
- SpringBoot是如何启动的?
本文是通过查看SpringBoot源码整理出来的SpringBoot大致启动流程,整体大方向是以简单为出发点,不说太多复杂的东西,内部实现细节本文不深扣因为每个人的思路.理解都不一样,我个人看的理解跟 ...