系统环境: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容器配置)的更多相关文章

  1. mysql复制(高可用架构方案的基础)

    mysql复制:把一个数据库实例上所有改变复制到另外一个数据库库服务器实例的过程特点:1.没有改变就无所谓复制 ;改变是复制的根本与数据源2.所有的改变:是指可以复制全部改变,也可以复制部分改变 可以 ...

  2. 美团点评MySQL数据库高可用架构从MMM到MHA+Zebra以及MHA+Proxy的演进

    本文介绍最近几年美团点评MySQL数据库高可用架构的演进过程,以及我们在开源技术基础上做的一些创新.同时,也和业界其它方案进行综合对比,了解业界在高可用方面的进展,和未来我们的一些规划和展望. MMM ...

  3. Keepalived+MySQL实现高可用

    MySQL的高可用方案有很多,比如Cluster,MMM,MHA,DRBD等,这些都比较复杂,我前面的文章也有介绍.最近Oracle官方也推出了Fabric.有时我们不需要这么复杂的环境,这些方案各有 ...

  4. mysql实现高可用架构之MHA

    一.简介 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能.MHA 在监控到 mas ...

  5. 利用Keepalived+mysql构建高可用MySQL双主自动切转

    转载:http://www.it300.com/index.php/article-15266.html 关于MySQL-HA,目前有多种解决方案,比如heartbeat.drbd.mmm.共享存储, ...

  6. mysql mha高可用架构的安装

    MMM无法全然地保证数据的一致性,所以MMM适用于对数据的一致性要求不是非常高.可是又想最大程度的保证业务可用性的场景对于那些对数据一致性要求非常高的业务,非常不建议採用MMM的这样的高可用性架构.那 ...

  7. Keepalived+MySQL实现高可用(转)

    http://www.cnblogs.com/wingsless/p/4033093.html   MHA高可用 http://www.cnblogs.com/gomysql/p/3856484.ht ...

  8. centos6.6部署mysql mmm高可用架构

    一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...

  9. mysql mmm高可用架构设计

    项目概述:搭建主从,双主,安装Perl模块  安装配置mmm软件  测试 硬件环境:4台虚拟PC 软件环境:rehl6.5 MySQL-5.6.26 percona-xtrabackup-2.3.4 ...

随机推荐

  1. 面试官,不要再问我“Java GC垃圾回收机制”了

    Java GC垃圾回收几乎是面试必问的JVM问题之一,本篇文章带领大家了解Java GC的底层原理,图文并茂,突破学习及面试瓶颈. 楔子-JVM内存结构补充 在上篇<JVM之内存结构详解> ...

  2. php 加入 unless 语法

    1. php 的版本 :PHP 7.3.0-dev (cli) (built: Mar 18 2018 00:28:55) ( NTS ) 2. unless 语法结构: unless($cond){ ...

  3. Mobius 反演与杜教筛

    积性函数 积性函数 指对于所有互质的整数 aaa 和 bbb 有性质 f(ab)=f(a)f(b)f(ab)=f(a)f(b)f(ab)=f(a)f(b) 的数论函数. 特别地,若所有的整数 aaa ...

  4. [JZOJ5775]【NOIP2008模拟】农夫约的假期

    Description   在某国有一个叫农夫约的人,他养了很多羊,其中有两头名叫mm和hh,他们的歌声十分好听,被当地人称为“魔音”······  农夫约也有自己的假期呀!他要去海边度假,然而mm和 ...

  5. Unity的学习笔记(射线检测)

    首先,射线检测的API是这样的,网上找了一下,这个图片看得很清楚: 接下来是自己使用这个进行测试 using System.Collections; using System.Collections. ...

  6. 5.Linux文件管理相关命令(下)

    1.文件管理之:联网下载文件(wget.curl).文件上传与下载(rz.sz) 1.wget命令 1.CentOS7 系统最小化安装默认没有wget命令,需要进行安装 [root@oldboyedu ...

  7. 百万年薪python之路 -- 并发编程之 多线程 一

    多线程 1.进程: 生产者消费者模型 一种编程思想,模型,设计模式,理论等等,都是交给你一种编程的方法,以后遇到类似的情况,套用即可 生产者与消费者模型的三要素: 生产者:产生数据的 消费者:接收数据 ...

  8. JVM学习记录2--垃圾回收算法

    首先要明确,垃圾回收管理jvm的堆内存,方法区是堆内存的一部分,所以也是. 而本地方法栈,虚拟机栈,程序计数器随着线程开始而产生,线程的结束而消亡,是不需要垃圾回收的. 1. 判断对象是否可以被回收 ...

  9. 设计模式(二十三)Interpreter模式

    在Interpreter模式中,程序要解决的问题会被用非常简单的“迷你语言”表述出来,即用“迷你语言”编写的“迷你程序”把具体的问题表述出来.迷你程序是无法单独工作的,还需要用java语言编写一个负责 ...

  10. Android应用程序版本升级时签名冲突

    这种错误特别容易在调试中出现,原因是你手机上的应用是直接用eclipse或者android studio安装的,而eclipse或者android studio有自己默认的签名:**debug.key ...