HAproxy+keepalived+mysql构建高可用数据库

HAproxy+keepalived+mysql构建高可用数据库

1、概况

1.1 应用场景

Nginx/LVS/HAProxy的基于Linux的开源免费的负载均衡软件。对于大型的,需要进行高并发的网站或者对网络不太严格的场景,可以使用Nginx;对于大型的Web服务器的时候可以使用Haproxy;对性能有严格要求的时候可以使用LVS,就单纯从负载均衡的角度来说,LVS也许会成为主流,更适合现在大型的互联网公司。本文采用HAproxy+keepalived+mysql主从方案来解决业务架构高可用。

1.2 LVS/Nginx/HAProxy特点

LVS

1)抗负载能力强、是工作在网络4层之上仅作分发之用,没有流量的产生,这个特点也决定了它在负载均衡软件里的性能最强的;

2)配置性比较低,这是一个缺点也是一个优点,因为没有可太多配置的东西,所以并不需要太多接触,大大减少了人为出错的几率;

3)工作稳定,自身有完整的双机热备方案,如LVS+Keepalived和LVS+Heartbeat,不过我们在项目实施中用得最多的还是LVS/DR+Keepalived;

4)无流量,保证了均衡器IO的性能不会收到大流量的影响;

5)应用范围比较广,可以对所有应用做负载均衡;

6)软件本身不支持正则处理,不能做动静分离,这个就比较遗憾了;其实现在许多网站在这方面都有较强的需求,这个是Nginx/HAProxy+Keepalived的优势所在。

7)如果是网站应用比较庞大的话,实施LVS/DR+Keepalived起来就比较复杂了,特别后面有Windows Server应用的机器的话,如果实施及配置还有维护过程就比较复杂了。

Nginx

1)工作在网络的7层之上,可以针对http应用做一些分流的策略,比如针对域名、目录结构,它的正则规则比HAProxy更为强大和灵活,这也是许多朋友喜欢它的原因之一;

2)Nginx对网络的依赖非常小,理论上能ping通就就能进行负载功能,这个也是它的优势所在;

3)Nginx安装和配置比较简单,测试起来比较方便;

4)也可以承担高的负载压力且稳定,一般能支撑超过几万次的并发量;

5)Nginx可以通过端口检测到服务器内部的故障,比如根据服务器处理网页返回的状态码、超时等等,并且会把返回错误的请求重新提交到另一个节点,不过其中缺点就是不支持url来检测;

6)Nginx仅能支持http和Email,这样就在适用范围上面小很多,这个它的弱势;

7)Nginx不仅仅是一款优秀的负载均衡器/反向代理软件,它同时也是功能强大的Web应用服务器。LNMP现在也是非常流行的web架构,大有和以前最流行的LAMP架构分庭抗争之势,在高流量的环境中也有很好的效果。

8)Nginx现在作为Web反向加速缓存越来越成熟了,很多朋友都已在生产环境下投入生产了,而且反映效果不错,速度比传统的Squid服务器更快,有兴趣的朋友可以考虑用其作为反向代理加速器。

HAProxy

1)支持两种代理模式:TCP(四层)和HTTP(七层)HAProxy是支持虚拟主机的。

2)能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作

3)支持url检测后端的服务器出问题的检测会有很好的帮助。

4)它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。

5)HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS。

6)HAProxy的算法现在也越来越多了,算法特别灵活

2、相关理论

2.1 Keepalived工作原理

keepalived:顾名思义是保持存活,常用来搭建设备的高可用,防止业务核心设备出现单点故障。keepalived基于VRRP协议来实现高可用,主要用作realserver的健康检查以及负载均衡主机和backup主机之间的故障漂移。如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态,如果某台web服务器故障,Keepalived将检测到并将其从系统中剔除,当该web服务器工作正常后Keepalived自动将其加入到服务器群中,这些工作全部自动完成,而不需要人工干预,只需要人工修复故障的web服务器即可。

三层机理是发送ICMP数据包即PING给某台服务器,如果不通,则认为其故障,并从服务器群中剔除;四层机理是检测TCP端口号状态来判断某台服务器是否故障,如果检测端口存在异常,则从服务器群中剔除;五层机理是根据用户的设定检查某个服务器应用程序是否正常运行,如果不正常,则从服务器群中剔除。

2.2 HAproxy工作原理

Haproxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案,反向代理服务器,支持双机热备支持虚拟主机,但其配置简单,拥有非常不错的服务器健康检查功能,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。

3、架构拓扑

4、资源规划

主机名称IP操作系统

haproxy1192.168.74.126Centos7 64位

haproxy2192.168.74.127Centos7 64位

mysql1192.168.74.128Centos7 64位

mysql2192.168.74.129Centos7 64位

VIP192.168.74.150\

软/硬件选型

企业大数据系统在软/硬件选型方面将遵循两个原则:一是硬件上将遵循“同品牌、同型号、同配置”的原则,不因应用系统或分布式系统的不同而不同;二是软件上将遵偱“同操作系统、同JVM 虚拟机、同系统账户体系”的原则。

推荐硬件选型如表1-1 所示。

表1-1 推荐硬件选型列表

品牌:用户自定

设备名:节点机

配置

CPU:2个4核,主频为2.4GHz以上

内存:16G

硬盘:500G

网卡:千兆

备注:数据中心的所有节点机器配置基本相同

每个节点的基础软件选型如表1-2所示。

表1-2 节点基础软件选型列表

操作系统:Centos7 64位

Mysql:mysql-5.7.X

HAproxy:haproxy-1.8.X

keepalived:keepalived-1.2.X

目录配置:统一自定安装目录,统一环境配置

应用服务器对只读的应用程序连接虚拟IP地址,连接到haproxy,然后通过haproxy将TCP协议转移到下面的2个MySQL主从数据库服务器中。Haproxy在此做4层的TCP交换服务。keepalived为了防止haproxy单点故障。这里可以使用两个VIP(虚拟IP)实现haproxy代理服务器的高可用负载均衡。

5、安装介质

CentOS操作系统版本:CentOS-7-x86_64-DVD-1511.iso

mysql版本:mysql-5.7.22-linux-glibc2.12-x86_64.tar 

HAproxy版本:haproxy-1.8.14.tar.gz

keepalived版本:keepalived-1.2.7.tar.gz

6、准备工作(每台机器)

安装之前,如果之前安装过mysql,那么需要删除相应的各种mysql文件,删除之前请停止mysql服务。并且不要忘记删除my.cnf这些配置文件。确保删除干净。不然可能会和后面的安装有冲突。如果是实验,关闭防火墙,实际中,防火墙打开对应端口(注意实际中需要使用的端口不只有3306端口,还有同步需要使用的6677端口)。保证服务器之前能互相访问,能ping通。保证固定的ip地址。保证没有别的程序占用需要使用的端口。如3306等。这些都确认完毕后再进行安装。

6.1关闭防火墙

systemctl stopfirewalld.service

systemctl disablefirewalld.service

6.2挂载光盘(每台机器)

mount /dev/cdrom /mnt

删除原有的yum的源

cd /etc/yum.repos.d/

rm -rf *

创建自己的源vi my.repo

[centos-yum]

baseurl=file:///mnt

enabled=1

gpgcheck=0                 

6.3NTP服务需要每台机器进行安装(时间同步)

yum install ntp

systemctl is-enabledntpd

systemctl enable ntpd

systemctl start ntpd

7、安装mysql

以下的所有操作需要在所有的集群节点(128/129)都要进行相同的操作

7.1新增用户组mysql和用户msyql

groupadd mysql

useradd -g mysql -s/bin/false mysql

新建文件夹并赋予权限

mkdir /var/lib/mysql

chown root:mysql/var/lib/mysql

7.2将下载后的包上传至服务器/usr/local下

解压

cd /usr/local

tar xvf mysql-5.7.22-linux-glibc2.12-x86_64.tar

7.3创建链接方便访问

ln -s /usr/local/mysql-gpl-7.5.4-linux-glibc2.5-x86_64/usr/local/mysql

7.4初始化数据库(这里要注意,如果安装的版本不同,数据库初始化的命令可能不同的,很多之前的版本会使用:scripts/mysql_install_db --user=mysql来初始化,这个已经被mysql在新的版本中废弃了,所以需要使用下面的命令安装,如果需要安装别的版本请参考mysql官网的对应版本的安装命令。)

进入刚才创建的目录的bin目录下初始化,正常安装mysql如何初始化就如何进行安装就可以了,这里还可以设置安装数据库的data目录等参数。

cd /usr/local/mysql/bin

./mysqld --initialize--user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

如果初始化成功之后,系统会提示一个随机生成的数据库密码,此时需要记住这个密码,之后登录数据库需要使用这个密码。

192.168.74.128         p.(V9O+2*etk                      #记录192.168.74.128的初始化密码

192.168.74.129          vKeCI;+4Igl?                       #记录192.168.74.129的初始化密码

7.5修改权限

chown -R root .

chown -R mysql data

chgrp -R mysql .

cpsupport-files/mysql.server /etc/rc.d/init.d/

chmod +x/etc/rc.d/init.d/mysql.server

chkconfig --addmysql.server

7.6配置主节点

vi /etc/my.cnf

[client]

port = 3306

socket =/tmp/mysql.sock


[mysqld]

basedir=/usr/local/mysql/

datadir=/usr/local/mysql/data

user=root

port=3306

socket=/tmp/mysql.sock

server-id=1

log-bin=mysql-bin

skip-name-resolve

7.7配置从节点

vi /etc/my.cnf

[client]

port = 3306

socket =/tmp/mysql.sock


[mysqld]

basedir=/usr/local/mysql/

datadir=/usr/local/mysql/data

user=root

port=3306

socket=/tmp/mysql.sock

server-id=2

log-bin=mysql-bin

skip-name-resolve

其中slave的server-id要设置比master大

/etc/init.d/mysql.serverstart

./mysql -uroot -p                                #登录mysql,密码粘贴上面记录的初始密码

setpassword=password('123456');        #修改密码

./mysql -uroot -p123456                      #测试修改后的密码是否能够登录


7.8在Master服务器上创建MySQL用户(授权复制用户)

GRANT ALL PRIVILEGES ON*.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

查看master状态

show master status;

在slave添加master配置

命令:change master to

->master_host=' 192.168.74.128',

->master_user=' root',

->master_password='123456',

->master_log_file=' mysql-bin.000010',    #show master status中File的值

->master_log_pos=154;

        show master status中Position的值

7.9主从同步测试

命令:show slave status\G

当Slave_IO_Running和Slave_SQL_Running均为Yes时,表示同步成功。

8、搭建haproxy

8.1上传haproxy安装包到/usr/local

在74.126和74.127解压缩安装

tar -zxvfhaproxy-1.8.14.tar.tar

cd haproxy-1.8.14

yum install -y gcc

make TARGET=linux310

ARCH=x86_64 # uname -a查看主机信息填写

make installSBINDIR=/usr/sbin/ MANDIR=/usr/share/man/ DOCDIR=/usr/share/doc/

8.2提供启动脚本

vim /etc/init.d/haproxy

 #

# haproxy

#

# chkconfig:   - 85 15

# description:  HAProxy is a free, very fast and reliablesolution \

#               offering high availability, loadbalancing, and \

#               proxying for TCP and  HTTP-based applications

# processname: haproxy

# config:      /etc/haproxy/haproxy.cfg

# pidfile:     /var/run/haproxy.pid


#Sourcefunction library.

./etc/rc.d/init.d/functions


# Source networkingconfiguration.

. /etc/sysconfig/network


# Check that networkingis up.

["$NETWORKING" = "no" ] && exit 0


exec="/usr/sbin/haproxy"

prog=$(basename $exec)


[ -e/etc/sysconfig/$prog ] && . /etc/sysconfig/$prog


cfgfile=/etc/haproxy/haproxy.cfg

pidfile=/var/run/haproxy.pid

lockfile=/var/lock/subsys/haproxy


check() {

    $exec -c -V -f $cfgfile $OPTIONS

}


start() {

    $exec -c -q -f $cfgfile $OPTIONS

    if [ $? -ne 0 ]; then

        echo "Errors in configurationfile, check with $prog check."

        return 1

    fi


    echo -n $"Starting $prog: "

    # start it up here, usually something like"daemon $exec"

    daemon $exec -D -f $cfgfile -p $pidfile$OPTIONS

    retval=$?

    echo

    [ $retval -eq 0 ] && touch$lockfile

    return $retval

}


stop() {

    echo -n $"Stopping $prog: "

    # stop it here, often "killproc$prog"

    killproc $prog

    retval=$?

    echo

    [ $retval -eq 0 ] && rm -f$lockfile

    return $retval

}


restart() {

    $exec -c -q -f $cfgfile $OPTIONS

    if [ $? -ne 0 ]; then

       echo "Errors in configuration file, check with $prog check."

        return 1

    fi

    stop

    start

}


reload() {

    $exec -c -q -f $cfgfile $OPTIONS

    if [ $? -ne 0 ]; then

        echo "Errors in configurationfile, check with $prog check."

        return 1

    fi

    echo -n $"Reloading $prog: "

    $exec -D -f $cfgfile -p $pidfile $OPTIONS-sf $(cat $pidfile)

    retval=$?

    echo

    return $retval

}


force_reload() {

    restart

}


fdr_status() {

    status$prog

}


case "$1" in

    start|stop|restart|reload)

        $1

        ;;

    force-reload)

        force_reload

        ;;

    check)

        check

        ;;

    status)

        fdr_status

        ;;

    condrestart|try-restart)

        [ ! -f $lockfile ] || restart

        ;;

    *)

        echo $"Usage: $0{start|stop|status|restart|try-restart|reload|force-reload}"

        exit2

esac

8.3提供配置文件

mkdir /etc/haproxy

mkdir /var/lib/haproxy

useradd -r haproxy

vim/etc/haproxy/haproxy.cfg

global


    log        127.0.0.1 local2


    chroot     /var/lib/haproxy

    pidfile    /var/run/haproxy.pid

    maxconn    4000

    user       haproxy

    group      haproxy

    daemon


defaults

    mode                    tcp

    log                     global

    option                  dontlognull

    option                  redispatch

    retries                 3

    timeout http-request    10s

    timeoutqueue           1m

    timeout connect         10s

    timeout client          1m

    timeoutserver          1m

    timeout http-keep-alive 10s

    timeout check           10s

    maxconn                 600


listen stats

    mode http

    bind :6677

    stats enable

    stats hide-version             

    stats uri     /haproxyadmin?stats

    stats realm   Haproxy\ Statistics

    stats auth    admin:admin

    statsadmin if TRUE


frontend  main

    bind *:3306

    default_backend             mysql


backend mysql

    balance    leastconn

    server m1 192.168.74.128:3306 check port3306 maxconn 300

    server m2 192.168.74.129:3306 check port3306 maxconn 300

8.4修改日志系统

###Provides UDP syslog

reception //去掉下面两行注释,开启UDP监听


$ModLoad imudp

$UDPServerRun 514


local2.*

/var/log/haproxy.log //添加此行

service rsyslog restart

8.5启动测试haproxy

service haproxy start

chkconfig --add haproxy

chkconfig haproxy on

netstat -tnlp

mysql -P3306 -uroot

-p123456 -h192.168.74.129 # 查看

server_id,判断是否成功

9、搭建keepalived

9.1上传keepalived安装包到/usr/local

在74.126和74.127解压缩安装

tar xfkeepalived-1.2.7.tar.gz

cd keepalived-1.2.7

./configure --prefix=/usr/local/keepalived--sbindir=/usr/sbin/ --sysconfdir=/etc/ --mandir=/usr/local/share/man/

make && makeinstall

chkconfig --addkeepalived

chkconfig keepalived on

可能会报错1

!!! OpenSSL isnot properly installed on your system. !!!

!!! Can notinclude OpenSSL headers files.

解决方法:

yum -y installopenssl-devel

可能会报错2

configure: error: Poptlibraries isrequired

解决方法:

yum install

popt-devel

9.2提供配置文件

vim

/etc/keepalived/keepalived.conf # 两个机器配置文件不同


! Configuration Filefor keepalived


global_defs {          

notification_email{          #忽略

     acassen@firewall.loc

     failover@firewall.loc

     sysadmin@firewall.loc

   }

   notification_email_fromAlexandre.Cassen@firewall.loc

   smtp_server 192.168.200.1

   smtp_connect_timeout 30

   router_id LVS_DEVEL

}


vrrp_script chk_haproxy{

    script"/etc/keepalived/chk.sh"     #检查haproxy的脚本

    interval 2                          #每两秒检查一次

}


vrrp_instance VI_1 {

    stateBACKUP                        #定义为BACKUP节点

    nopreempt                           #开启不抢占,另一个不写

    interface ens33

    virtual_router_id 51

    priority 100                        #开启了不抢占,所以此处优先级必须高于另一台,另一个写99

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass abcd

    }

    virtual_ipaddress {

        192.168.74.150                  #配置VIP

    }

    track_script {

        chk_haproxy                     #调用检查脚本

    }


    notify_backup "/etc/init.d/haproxyrestart"

    notify_fault "/etc/init.d/haproxystop"

}

9.3创建check文件

vim/etc/keepalived/chk.sh

#!/bin/bash


if [ $(ps -C haproxy--no-header | wc -l) -eq 0 ]; then

       /etc/init.d/keepalived stop

fi

chmod +x/etc/keepalived/chk.sh

service keepalivedstart

10、测试

ip addr # 查看是否绑定了虚ip

tcpdump-nn -i ens33 vrrp #抓包查看

http://192.168.74.128:6677/haproxyadmin?stats

# 通过haproxy查看状态

10.1测试无误后,重启MySQL、Haproxy、Keepalived,顺序依次为MySQL、Haproxy、Keepalived

/etc/init.d/mysql.serverstart

service haproxy start

service keepalivedstart

10.2测试mysql数据同步

通过对数据库进行增删改查操作,这里就不演示了

10.3测试mysql高可用

/etc/init.d/mysql.serverstop   停止服务测试效果,VIP是否还能够连上数据库

mysql -uroot -p123456-h192.168.74.150

10.4测试haproxyl高可用

service haproxy stop      停止服务测试效果

http://192.168.74.126:6677/haproxyadmin?stats是否还能够访问

mysql -uroot -p123456-h192.168.74.150

10.5测试mysql高可用

service keepalived stop 停止服务测试效果

ip addr    查看VIP

mysql -uroot -p123456

-h192.168.74.150 连接数据库

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容