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

keepalived + haproxy + postgresql构建高可用数据库

1、搭建最低配测试环境(两台虚拟机)

keepalived 的高可用是主备,有一台作为备用

keepalived +

haproxy 搭建的高可用是可以两台都会调度的高可用

2、拓扑图


keepalived:负责抢占虚拟ip,使用vrrp协议

haproxy

:负责做访问调度,减轻单点压力,单独监听一个端口,这里用3306,用于区分postgres的5432端口。

3、资源规划

主机名称IP操作系统

haproxy1192.168.74.126Centos7 64位

haproxy2192.168.74.127Centos7 64位

Master192.168.74.126Centos7 64位

slave192.168.74.127Centos7 64位

VIP192.168.74.150\


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

4、安装介质

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

postgres版本:postgresql11-11.2-1PGDG.rhel7.x86_64.rpm

                            postgresql11-libs-11.2-1PGDG.rhel7.x86_64.rpm

              postgresql11-server-11.2-1PGDG.rhel7.x86_64.rpm

HAproxy版本:haproxy-1.8.14.tar.gz

keepalived版本:keepalived-1.2.7.tar.gz

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

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

关闭防火墙

systemctl stop firewalld.service

systemctl disablefirewalld.service

挂载光盘(每台机器)

mount /dev/cdrom /mnt

删除原有的yum的源

cd /etc/yum.repos.d/

rm -rf *

创建自己的源vi my.repo

[centos-yum]

baseurl=file:///mnt

enabled=1

gpgcheck=0              

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

yum install ntp

systemctl is-enabledntpd

systemctl enable ntpd

systemctl start ntpd

6、安装postgres

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

新建文件夹并赋予权限

mkdir/var/lib/pgsql/pg_archive/

chmod 777 -R/var/lib/pgsql/pg_archive/

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

执行命令

cd /usr/local

yum install -ypostgresql11-libs-11.2-1PGDG.rhel7.x86_64.rpm

yum install -ypostgresql11-11.2-1PGDG.rhel7.x86_64.rpm

yum install -ypostgresql11-server-11.2-1PGDG.rhel7.x86_64.rpm

主节点配置:

初始化主节点:

/usr/pgsql-11/bin/postgresql-11-setupinitdb

systemctl enable postgresql-11

systemctl startpostgresql-11

配置pg_hba.conf:

vim/var/lib/pgsql/11/data/pg_hba.conf

#最后添加下面几行

host    all             all             all                     md5

host   all             all              192.168.74.126/32      trust

host   all            all              192.168.74.127/32      trust

host   replication      replica          192.168.74.127/32      trust

配置postgresql.conf:

vim/var/lib/pgsql/11/data/postgresql.conf

listen_addresses = '*'

wal_level = hot_standby

synchronous_commit = on

archive_mode = on

archive_command = 'cp%p /var/lib/pgsql/pg_archive/%f'

max_wal_senders = 16

wal_keep_segments = 256

wal_sender_timeout =60s

hot_standby = on

max_standby_archive_delay= -1

max_standby_streaming_delay= -1

wal_receiver_status_interval= 2s

hot_standby_feedback =on

修改密码:

su postgres

$ psql

\password postgres

postgres

创建同步用户

su postgres

$ psql


CREATE ROLE replicalogin replication encrypted password 'replica';

重启主节点:

systemctl restartpostgresql-11

配置从节点

su postgres

pg_basebackup -h192.168.74.126 -U replica -D /var/lib/pgsql/11/data -X stream -P

配置recovery.conf:

cp/usr/pgsql-11/share/recovery.conf.sample /var/lib/pgsql/11/data/recovery.conf

vi/var/lib/pgsql/11/data/recovery.conf

standby_mode = on       

primary_conninfo ='host=192.168.74.126 port=5432 user=replica password=replica'

recovery_target_timeline= 'latest'

restore_command = 'cp%p /var/lib/pgsql/pg_archive/%f %p'

配置postgresql.conf:

vim/var/lib/pgsql/11/data/postgresql.conf

max_connections = 200    #其中slave的max_connections要设置比master大

启动从节点:

systemctl startpostgresql-11

在master上登陆psql查看状态:

selectclient_addr,sync_state from pg_stat_replication;

至此,主从就配置完了,可以创建库表、增删记录等方式测试同步情况,这里就不在详述了

7、搭建haproxy

上传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/

提供启动脚本

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


# Sourcefunctionlibrary.

./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 configurationfile, check with $prog check."

        return 1

    fi

    stop

    start

}


reload() {

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

    if [ $? -ne 0 ]; then

        echo "Errors in configuration file,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

提供配置文件

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

    stats admin if TRUE


frontend  main

    bind *:23306

    default_backend             mysql


backend mysql

    balance    leastconn

     server m1 192.168.74.126:5432 check port5432 maxconn 300

     server m2 192.168.74.127:5432 check port5432 maxconn 300

修改日志系统

###Provides UDP syslog

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


$ModLoad imudp

$UDPServerRun 514


local2.*

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

service rsyslog restart

启动测试haproxy

service haproxy start

chkconfig --add haproxy

chkconfig haproxy on

netstat -tnlp

psql -h 192.168.74.126

-U postgres # 查看

server_id,判断是否成功

8、搭建keepalived

上传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 not includeOpenSSL headers files.

解决方法:

yum -y installopenssl-devel

可能会报错2

configure: error: Popt

libraries is required

解决方法:

yum install

popt-devel

提供配置文件

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"

}

创建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

9、测试

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

tcpdump -nn -i

ens33 vrrp # 抓包查看

http://192.168.74.126:6677/haproxyadmin?stats

# 通过haproxy查看状态

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

systemctl start postgresql-11

service haproxy start

service keepalivedstart

测试mysql数据同步

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

测试VIP高可用

systemctl startpostgresql-11  停止服务测试效果,VIP是否还能够连上数据库

psql -h 192.168.74.150-U postgres

测试haproxyl高可用

service haproxy stop      停止服务测试效果

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

psql -h 192.168.74.150-U postgres

测试postgres高可用

service keepalived stop 停止服务测试效果

ip addr    查看VIP

psql -h 192.168.74.150

-U postgres 连接数据库

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

推荐阅读更多精彩内容