共计 8548 个字符,预计需要花费 22 分钟才能阅读完成。
这篇文章主要介绍“在流复制主备环境下怎么使用 HAProxy 搭建负载均衡环境”,在日常操作中,相信很多人在在流复制主备环境下怎么使用 HAProxy 搭建负载均衡环境问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”在流复制主备环境下怎么使用 HAProxy 搭建负载均衡环境”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!
安装
使用 yum 安装相关软件,在数据库服务器上安装 xinted 和 telnet
yum -y install xinetd telnet
配置 xinetd
编写识别主从库的脚本 pgsqlchk
[pg12@localhost ~]$ cat pgsqlchk
#!/bin/bash
# This script checks if a postgres server is healthy running on localhost. It will return:
# HTTP/1.x 200 OK\r (if postgres is running smoothly)
# - OR -
# HTTP/1.x 500 Internal Server Error\r (else)
# The purpose of this script is make haproxy capable of monitoring postgres properly
# It is recommended that a low-privileged postgres user is created to be used by this script.
# For eg. create user healthchkusr login password hc321
PGBIN=/appdb/pg12/pg12.0/bin
PGSQL_HOST= localhost
PGSQL_PORT= 5432
PGSQL_DATABASE= testdb
PGSQL_USERNAME= pg12
export PGPASSWORD= root
TMP_FILE= /tmp/pgsqlchk.out
ERR_FILE= /tmp/pgsqlchk.err
# We perform a simple query that should return a few results
VALUE=`$PGBIN/psql -qt -h localhost -U pg12 -p 5432 -c select pg_is_in_recovery() 2 /dev/null`
# Check the output. If it is not empty then everything is fine and we return something. Else, we just do not return anything.
if [ $VALUE == t ]
/bin/echo -e HTTP/1.1 206 OK\r\n
/bin/echo -e Content-Type: Content-Type: text/plain\r\n
/bin/echo -e \r\n
/bin/echo Standby
/bin/echo -e \r\n
elif [ $VALUE == f ]
/bin/echo -e HTTP/1.1 200 OK\r\n
/bin/echo -e Content-Type: Content-Type: text/plain\r\n
/bin/echo -e \r\n
/bin/echo Primary
/bin/echo -e \r\n
/bin/echo -e HTTP/1.1 503 Service Unavailable\r\n
/bin/echo -e Content-Type: Content-Type: text/plain\r\n
/bin/echo -e \r\n
/bin/echo DB Down
/bin/echo -e \r\n
[pg12@localhost ~]$
如为主库,该脚本模拟接收 http 请求返回 http 200 响应,如为从库则返回 206,如数据库不可用则返回 503
# 主库
[pg12@localhost ~]$ ifconfig | grep inet
inet 192.168.26.28 netmask 255.255.0.0 broadcast 192.168.255.255
...
[pg12@localhost ~]$ ./pgsqlchk
HTTP/1.1 200 OK
Content-Type: Content-Type: text/plain
Primary
[pg12@localhost ~]$ ifconfig | grep inet
inet 192.168.26.25 netmask 255.255.0.0 broadcast 192.168.255.255
...
[pg12@localhost ~]$ ./pgsqlchk
HTTP/1.1 206 OK
Content-Type: Content-Type: text/plain
Standby
创建 xinetd 配置文件,端口使用 23267,指向刚才配置的 pgsqlchk 执行文件
[pg12@localhost ~]$ cat /etc/xinetd.d/pgsqlchk
service pgsqlchk
flags = REUSE
socket_type = stream
port = 23267
wait = no
user = nobody
server = /home/pg12/pgsqlchk
log_on_failure += USERID
disable = no
only_from = 0.0.0.0/0
per_source = UNLIMITED
}
添加服务,并启动 xinetd
[pg12@localhost ~]$ sudo bash -c echo pgsqlchk 23267/tcp # pgsqlchk /etc/services
[pg12@localhost ~]$ sudo systemctl start xinetd
[pg12@localhost ~]$ systemctl status xinetd
● xinetd.service - Xinetd A Powerful Replacement For Inetd
Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-11-14 12:04:37 CST; 23s ago
Process: 2847 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS)
Main PID: 2848 (xinetd)
CGroup: /system.slice/xinetd.service
└─2848 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
[pg12@localhost ~]$
检查服务和监听,(可通过设置 flags=IPv4 调整为监听 IPv4 地址)
[pg12@localhost ~]$ sudo netstat -antup | grep 23267
tcp6 0 0 :::23267 :::* LISTEN 6837/xinetd
[pg12@localhost ~]$ sudo systemctl restart xinetd
[pg12@localhost ~]$ sudo systemctl status xinetd -l
● xinetd.service - Xinetd A Powerful Replacement For Inetd
Loaded: loaded (/usr/lib/systemd/system/xinetd.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2019-11-14 15:43:49 CST; 6s ago
Process: 7461 ExecStart=/usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid $EXTRAOPTIONS (code=exited, status=0/SUCCESS)
Main PID: 7462 (xinetd)
CGroup: /system.slice/xinetd.service
└─7462 /usr/sbin/xinetd -stayalive -pidfile /var/run/xinetd.pid
Nov 14 15:43:49 localhost.localdomain xinetd[7462]: START: pgsqlchk pid=7463 from=192.168.26.26
Nov 14 15:43:49 localhost.localdomain xinetd[7462]: EXIT: pgsqlchk status=0 pid=7463 duration=0(sec)
Nov 14 15:43:52 localhost.localdomain xinetd[7462]: START: pgsqlchk pid=7465 from=192.168.26.26
Nov 14 15:43:52 localhost.localdomain xinetd[7462]: EXIT: pgsqlchk status=0 pid=7465 duration=0(sec)
Nov 14 15:43:52 localhost.localdomain xinetd[7462]: START: pgsqlchk pid=7466 from=192.168.26.26
Nov 14 15:43:52 localhost.localdomain xinetd[7462]: EXIT: pgsqlchk status=0 pid=7466 duration=0(sec)
Nov 14 15:43:55 localhost.localdomain xinetd[7462]: START: pgsqlchk pid=7467 from=192.168.26.26
Nov 14 15:43:55 localhost.localdomain xinetd[7462]: EXIT: pgsqlchk status=0 pid=7467 duration=0(sec)
Nov 14 15:43:55 localhost.localdomain xinetd[7462]: START: pgsqlchk pid=7468 from=192.168.26.26
Nov 14 15:43:55 localhost.localdomain xinetd[7462]: EXIT: pgsqlchk status=0 pid=7468 duration=0(sec)
[pg12@localhost ~]$ sudo netstat -antup | grep 23267
tcp 0 0 0.0.0.0:23267 0.0.0.0:* LISTEN 7462/xinetd
[pg12@localhost ~]$
配置 HAProxy with xinetd
在代理服务器上安装 HAProxy
yum -y install haproxy telnet
配置 HAProxy(/etc/haproxy/haproxy.cfg)
[pg12@localhost ~]$ cat /etc/haproxy/haproxy.cfg
#---------------------------------------------------------------------
# Example configuration for a possible web application. See the
# full configuration options online.
# http://haproxy.1wt.eu/download/1.4/doc/configuration.txt
#---------------------------------------------------------------------
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the -r option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the listen and backend sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option http-server-close
option forwardfor except 127.0.0.0/8
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen stats
mode http
bind *:7000
stats enable
stats uri /
listen ReadWrite
bind *:5000
option httpchk
http-check expect status 200
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server pg0 pg0:5432 maxconn 100 check port 23267
listen ReadOnly
bind *:5001
option httpchk
http-check expect status 206
default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
server pg0 pg0:5432 maxconn 100 check port 23267
server pg1 pg1:5432 maxconn 100 check port 23267
[pg12@localhost ~]$
启动 HAProxy
[pg12@localhost ~]$ sudo systemctl start haproxy
[pg12@localhost ~]$
划重点:
1.HAProxy 使用 TCP 模式而不是默认的 http 模式
2.HAProxy 监听的端口是 5000-5001
3. 端口 5000 用于 RW 而 5001 用于 Read-only
4. 使用 http-check(端口为 23267)判断状态
5.pg0 可用于读写,pg1 仅用于读
6. 基于 http-check,确定服务器状态(根据服务响应确定:200/206/503)
验证 haproxy 服务是否正常启动,如出现 bind socket 的错误,则需调整内核参数和 SELinux 策略
1. 设置内核参数:net.ipv4.ip_nonlocal_bind=1
2. 设置 SELinux 策略
setsebool -P haproxy_connect_any=1
vim /etc/sysconfig/selinux
SELINUX=enforcing
SELINUX=permissive
正常启动 HAProxy 的日志
[root@localhost ~]# systemctl status haproxy -l
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/usr/lib/systemd/system/haproxy.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2019-11-14 14:41:09 CST; 12min ago
Main PID: 1963 (haproxy-systemd)
CGroup: /system.slice/haproxy.service
├─1963 /usr/sbin/haproxy-systemd-wrapper -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid
├─1964 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
└─1965 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
Nov 14 14:41:09 localhost.localdomain systemd[1]: Started HAProxy Load Balancer.
Nov 14 14:41:09 localhost.localdomain haproxy-systemd-wrapper[1963]: haproxy-systemd-wrapper: executing /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /run/haproxy.pid -Ds
[root@localhost ~]#
到此,关于“在流复制主备环境下怎么使用 HAProxy 搭建负载均衡环境”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!