美文网首页
HAproxy+keepalived+postgresql构建高

HAproxy+keepalived+postgresql构建高

作者: 云spark | 来源:发表于2019-08-02 10:41 被阅读0次

    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 连接数据库

    相关文章

      网友评论

          本文标题:HAproxy+keepalived+postgresql构建高

          本文链接:https://www.haomeiwen.com/subject/ffafeqtx.html