文档章节

用Haproxy来做PostgreSQL的负载均衡

kenyon_君羊
 kenyon_君羊
发布于 2016/04/21 22:43
字数 1144
阅读 6061
收藏 173
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,可以用来做web或者数据库的负载均衡,在一定范围内读写能力与添加的服务器数量成正比。haproxy用来做mysql负载均衡的文章很多,这里简单介绍下配合postgresql的使用。

一、环境
Centos 6.7
PostgreSQL 9.5.2
Haproxy 1.6
虚机服务列表
haproxy ip 192.168.226.148 (pg agent)
datanode1 ip 192.168.226.133 (pg server)
datanode2 ip 192.168.226.143 (pg server)

二、软件安装
#yum install gcc gcc-c++ make
#groupadd haproxy
#useradd haproxy –g haproxy -s /sbin/nologin
#wget http://www.haproxy.org/download/1.6/src/haproxy-1.6.4.tar.gz
#cd haproxy-1.6.4
#make TARGET=linux2628 PREFIX=/usr/local/haproxy
#make install PREFIX=/usr/local/haproxy
#mkdir -p /etc/haproxy/
#cp examples/haproxy.init /etc/init.d/haproxy
#chmod +x /etc/init.d/haproxy
#ln -s /usr/local/haproxy/sbin/haproxy /usr/sbin/

三、软件配置

1.主要配置文件haproxy.cfg
[root@localhost ~]# vi /etc/haproxy/haproxy.cfg
global
	log 127.0.0.1 local0 info
	maxconn 4096
	user haproxy
	group haproxy
	daemon
	nbproc 1
	chroot /usr/local/haproxy
	pidfile /var/run/haproxy.pid
defaults
	log global
	mode tcp
	option tcplog
	option dontlognull
	option redispatch
	retries 3
	maxconn 2000
	timeout connect 10s
	timeout client 60s
	timeout server 60s
frontend postgres-front
	bind *:1949
	mode tcp
	default_backend postgresql
listen  postgresql
	mode tcp
	option tcplog
	balance leastconn
	#balance roundrobin
	#option mysql-check user haproxy
	#server mysql-1 192.168.184.131:3306 weight 1 check inter 2000 rise 2 fall 3
	#server mysql-2 192.168.184.132:3306 weight 1 check inter 2000 rise 2 fall 3
       option pgsql-check user haproxy
       server postgre_1 192.168.184.131:1949 weight 1 check inter 2000 rise 2 fall 3
       server postgre_2 192.168.184.132:1949 weight 1 check inter 2000 rise 2 fall 3
listen admin-stats
	mode http
	option httplog
	bind 0.0.0.0:8888
	stats enable
	stats refresh 30s
	stats uri /dbs
	stats realm welcome login\ Haproxy
	stats auth admin:admin
	stats admin if TRUE
 [root@localhost ~]#
2.日志文件
[root@localhost ~]# vi /etc/rsyslog.d/haproxy.conf
$ModLoad imudp
$UDPServerRun 514
local0.* /usr/local/haproxy/haproxy.log
[root@localhost ~]# vi /etc/sysconfig/rsyslog
SYSLOGD_OPTIONS="-c 2 -r -m 0"
[root@localhost ~]# service rsyslog restart

四、使用

1.启动关闭
[root@localhost ~]# chkconfig haproxy on
[root@localhost ~]# service haproxy start/stop/restart
2.验证
打开浏览器,输入 http://192.168.226.148:8888/dbs,用户密码是上面配置的admin/admin 会出来如下页面 ,如果一台pg挂了,则相关node行数据会显示显眼的红色

3.服务端验证
在133和143服务器上各建一个库db_kenyon,创建haproxy的用户,在下面建不同的表来验证
133上建表tbl_1
[postgres@localhost ~]$ psql
psql (9.5.2) Type "help" for help.
postgres=# create database db_kenyon;
CREATE DATABASE
postgres=# \c db_kenyon
You are now connected to database "db_kenyon" as user "postgres".
db_kenyon=# create table tbl_1(id int);
CREATE TABLE
同样,143上建表tbl_2

在148上执行验证,148上建postgresql的客户端,并在133和143的pg_hba.conf里设置允许148为trust访问
host all all 192.168.226.148/32 trust
[root@localhost ~]# psql -h127.0.0.1 -p13306 -Uhaproxy db_kenyon -c"\dt"
 List of relations
 Schema | Name | Type | Owner
 --------+-------+-------+----------
public | tbl_2 | table | postgres
(1 row)

[root@localhost ~]# psql -h127.0.0.1 -p13306 -Uhaproxy db_kenyon -c"\dt"
 List of relations
 Schema | Name | Type | Owner
 --------+-------+-------+----------
public | tbl_1 | table | postgres
(1 row)
可以看到实现了负载均衡

五、性能简单压测
在两台服务器的db_kenyon库里建同样的表tbl_1,并插入10000条数据
[postgres@localhost ~]$ psql db_kenyon
psql (9.5.2)
Type "help" for help.

db_kenyon=# select * from tbl_1;
 id 
----
(0 rows)

db_kenyon=# insert into tbl_1 select generate_series(1,10000);
INSERT 0 10000
db_kenyon=# \q
[postgres@localhost ~]$

[postgres@localhost ~]$ more test.conf 
\set naccounts 10000 * :scale
\setrandom id 1 :naccounts
SELECT id FROM tbl_1 WHERE id = :id;

--单台压测
[postgres@localhost ~]$ pgbench -c 25 -j 25 -M prepared -n -s 500 -T 60 db_kenyon  -f ./test.conf 
transaction type: Custom query
scaling factor: 500
query mode: prepared
number of clients: 25
number of threads: 25
duration: 60 s
number of transactions actually processed: 94052
latency average: 15.949 ms
tps = 1619.015406 (including connections establishing)
tps = 1622.670100 (excluding connections establishing)

--加了haproxy压测
[root@localhost ~]# pgbench -c 25 -j 25 -M prepared -n -s 500 -T 60 -h127.0.0.1 -p13306 -Uhaproxy  db_kenyon -f ./test.conf
transaction type: Custom query
scaling factor: 500
query mode: prepared
number of clients: 25
number of threads: 25
duration: 60 s
number of transactions actually processed: 175073
latency average: 8.568 ms
tps = 2916.996809 (including connections establishing)
tps = 2918.372106 (excluding connections establishing)
可以看到tps增加了接近一倍,假如slave节点机子越多,该tps会有更大的提高

六、关键参数及其他

主要挑几个cfg配置文件里的参数说明:
mode tcp :采用tcp模式
option pgsql-check user haproxy :haproxy内置的postgres检测模块,后面的haproxy是数据库内用户名
server postgre_1 192.168.184.131:1949 weight 1 check inter 2000 rise 2 fall 3 :设置访问节点服务,每2秒检测超过3次失败则失败,从失败转成成功则需要检测2次,weight是分配权重。同样的模块还有mysql-check 
balance leastconn :这个算法是最少连接数,还有个注释掉的roundrobin是轮训的方式

系统可以考虑加上keepalived和pgbouncer来搭整套环境,haproxy除了可以做负载均衡,还可以用来做读的ha和简单的状态监控,可以有效降低单台服务器的负载,单台压测cpu基本饱和,加了haproxy后每台cpu还能空出20%出来。

七、参考
http://www.haproxy.com/

© 著作权归作者所有

共有 人打赏支持
kenyon_君羊
粉丝 499
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
加载中

评论(25)

kenyon_君羊
kenyon_君羊

引用来自“扁豆焖面先生”的评论

好久没看到你更新了 PG现在是不是已经玩的炉火纯青了
玩的少了
kenyon_君羊
kenyon_君羊

引用来自“IamOkay”的评论

可以做到主从同步吗?
和主从没关系,只是负载均衡
kenyon_君羊
kenyon_君羊

引用来自“黑桃”的评论

正想了解这方面,问下,haproxy到pg是长连接吗?
是短链接,可以结合pgbouncer使用
riverpot
riverpot
greenplum都开源了,用这两个东西山寨如果钻研一下那个,稳定多了
jay_
jay_

引用来自“乌龟壳”的评论

@宏哥 说postgres不需要读写分离

引用来自“宏哥”的评论

OLTP环境不做读写分离 OLAP和OLTP是分开的。 的确是不需要做读写分离的。 如果要水平扩展, 考虑多master的方案

引用来自“kenyon_君羊”的评论

单台postgres也是有读写上限瓶颈的,加一层负载均衡可以降低服务器压力,如cpu,内存等。pg现在没有多master方案吧

引用来自“宏哥”的评论

有商业的 另外有一个办法利用 数据库内部的外部表(postgres)可以自己实现一个
貌似青梅开源了
IamOkay
IamOkay
可以做到主从同步吗?
黑桃
黑桃
正想了解这方面,问下,haproxy到pg是长连接吗?
乌龟壳
乌龟壳

引用来自“乌龟壳”的评论

@宏哥 说postgres不需要读写分离

引用来自“宏哥”的评论

OLTP环境不做读写分离 OLAP和OLTP是分开的。 的确是不需要做读写分离的。 如果要水平扩展, 考虑多master的方案

引用来自“kenyon_君羊”的评论

单台postgres也是有读写上限瓶颈的,加一层负载均衡可以降低服务器压力,如cpu,内存等。pg现在没有多master方案吧

引用来自“宏哥”的评论

有商业的 另外有一个办法利用 数据库内部的外部表(postgres)可以自己实现一个
@宏哥 其实我是支持博主的做法的,读多写少的场景太常见了,这个方案架构简单清晰。
宏哥
宏哥

引用来自“乌龟壳”的评论

@宏哥 说postgres不需要读写分离

引用来自“宏哥”的评论

OLTP环境不做读写分离 OLAP和OLTP是分开的。 的确是不需要做读写分离的。 如果要水平扩展, 考虑多master的方案

引用来自“kenyon_君羊”的评论

单台postgres也是有读写上限瓶颈的,加一层负载均衡可以降低服务器压力,如cpu,内存等。pg现在没有多master方案吧
有商业的 另外有一个办法利用 数据库内部的外部表(postgres)可以自己实现一个
kenyon_君羊
kenyon_君羊

引用来自“乌龟壳”的评论

@宏哥 说postgres不需要读写分离

引用来自“宏哥”的评论

OLTP环境不做读写分离 OLAP和OLTP是分开的。 的确是不需要做读写分离的。 如果要水平扩展, 考虑多master的方案
单台postgres也是有读写上限瓶颈的,加一层负载均衡可以降低服务器压力,如cpu,内存等。pg现在没有多master方案吧

暂无文章

Coding and Paper Letter(四十五)

资源整理。 1 Coding: 1.Python库gempy,一种基于Python的开源三维结构地质建模软件,它允许从界面和方向数据隐式(即自动)创建复杂的地质模型。 它还支持随机建模以解决参数和模型的不确定...

胖胖雕
29分钟前
0
0
golang 声明一个指定长度的数组,用于后续添加

很多时候我们需要声明一个指定长度的数组,用于后续添加.在使用go的时候要注意,下面的第一个例子会有报错 "non-constant array bound",应该使用第二个例子. Length 是动态的值 有报错的例子 ...

漫步海边小路
31分钟前
0
0
Java NIO示例

Server端 /** * 《构建高性能的大型分布式Java应用》 * 书中的示例代码 * 版权所有 2008---2009 */package book.chapter1.tcpnio;import java.net.InetSocketAddress;i...

月下狼
37分钟前
0
0
发布xxl-job executor dotnet core 执行器的实现

DotXxlJob [github][https://github.com/xuanye/DotXxlJob] xxl-job的dotnet core 执行器实现,支持XXL-JOB 2.0+ 1 XXL-JOB概述 [XXL-JOB][1]是一个轻量级分布式任务调度平台,其核心设计目标...

假正经哥哥
今天
5
0
mysql 查询当天、本周,本月,上一个月的数据

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 wher......

BraveLN
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部