舒忠国
新手
新手
  • UID542
  • 粉丝0
  • 关注0
  • 发帖数4
阅读:35886回复:1

Postgres+pgpool集群安装部署

楼主#
更多 发布于:2019-05-27 01:44
一、 集群介绍

1.1集群简单说明

描述:架构图

图片:1.jpg

架构图

下面是pgpool+postgresql的集群架构图。
   在图中应用程序ApplicationServer是通过VIP(virtual IP)连接到Pgpool,Pgpool集群通过本次请求,如果是只读请求,把请求通过独立的IP的连接到postgresql的备用服务器(standby)。如果是删除、更新、插入、建表等语句通过独立的IP连接到postgresql的主服务器(master),主备服务器之间的数据库是同步的。
   数据库postgresql多台服务器的协同工作解决postgresql的高可用,高可靠和负载均衡。
上图中的pgpool在是个数据库连接池,起着负载均衡,限制连接,复制的功能。
Ø  连接池 使连接数据库更加的高效,当一个连接断开,pgpool把该连接进行缓存,下次同一个请求连接,直接从缓存获取,达到高效重用的效果。
Ø  负载均衡,根据请求的性质路由到不同的服务器,比如只读请求到只读postgresql服务器(备用服务器)。
Ø  限制连接 连接池都有一个最大连接,pgpool设置的最大连接数,不超过数据库的连接最大数,如果当前的并发连接超过了最大连接,会加入等待连接的队列。
Ø  复制 当数据库postgresql服务器备用服务器宕机或无法接受请求时不影响正常使用,当主服务器宕机或无法接受请求时pgpool会进行故障转移,进行主备切换。
  上面的pgpool如果是单节点的,如果pgpoold的节点出现故障,那么整个数据库就使用不了,再增加pgpool节点或多个节点解决pgpool的单节点故障问题。
多个pgpool之间的通信进行故障转移,是通过看门狗(watchdog)进行通信。
 
1.2集群安排
   从上图中可知有postgresql三个节点,pgpool有两个节点,有一个VIP。下面进行使用postgres的版本是10.7,pgpool的版本是3.6.16。postgres的集群使用异步流复制有三个节点,Pgpool的集群两个节点。
Postgres的节点分布表如下

描述:postgresql节点分布

图片:11.png

postgresql节点分布

Pgpool的节点分布表

描述:pgpool-II节点分布

图片:12.png

pgpool-II节点分布

安装方式,这里使用的在线安装rpm包安装,在安装时必须保证这些服务器能够访问外网。


二、postgres集群搭建

2.1下载Postgres及安装
  下载连接地址是:https://www.postgresql.org/download/linux/redhat/,在打开的页面中PostgreSQL Yum Repository这一小节,选择版本为10,平台为CentOS7 x86_64,这时在Install the repository RPM 会生成对应的安装postgres的yum库命令及链接地址。在执行yum 安装 postgresql10-server。接着就是初始化。
安装client packages:
yum install postgresql10
安装 server packages:
yum install postgresql10-server
初始化数据库和自启动
/usr/pgsql-10/bin/postgresql-10-setup initdb
systemctl enable postgresql-10
systemctl start postgresql-10
同样要在192.168.50.56(imp04),192.168.50.57(imp05),192168.50.58(imp06)执行安装

2.2查看数据目录
      1.切换到postgres用户 执行命令
         su postgres
      2.执行登录数据库命令
         psql
         默认安装完后之后,本机登录是免密码的,所有执行psql命令直接就可以登录上。
      在执行psql时候没有找该命令时,可以进行环境变量的配置或
        到pgsql的主目录下执行命令
        bin/psql
      3.查看数据目录执行命令
       show data_directory;
     会显示当前数据目录。如果当前的数据目录是你想要的位置,进入配置阶段。如果不是移动数据目录。再开始配置。
        4.退出数据库执行命令\q
         \q
在上面查看数据目录,进行到数据目录下面。


2.3主节点primary

2.3.1配置pg_hba.conf文件
修改配置pg_hba.conf文件执行命令:
vim pg_hba.conf
在文件的IPv4小节的默认添加一行

host                          all                          all                          0.0.0.0/0                          md5

   添加这一行的意思是type是local或host这里是host,数据库DATABASE是all表示所有数据库,用户USER是all表示所有用户,地址ADDRESS是0.0.0.0/0是表示所有的ip地址 认证方法METHOD是md5。在IPv4的第一行中是本地地址的,认证方法时trust表示不需要的密码。
文件中添加流复制的认证方法。
同样的方式添加以一行

host                     replication                   replica                     0.0.0.0/0                          trust

因为服务器都在同一个局域网内,用户地址是所有的IP地址,并且认证方法是免密码。但是用户是限定的。所以只要流复制账号不泄露,还是安全的。
当然严格来说,ADDRESS地址应该配置成备用用节点的IP,这里应该是192.168.50.57和192.168.50.58,并且需要密码验证MD5.

host              replication                   replica                           192.168.50.57/32              md5
host              replication                   replica                           192.168.50.58/32              md5


2.3.2配置postgresql.conf文件
修改文件postgresql.conf文档执行命令
vim postgresq.conf
在文件末尾添加如下图内容

描述:primary节点配置

图片:9.png

primary节点配置


2.3.3配置recovery.cof文件
要触发主备服务器之间进行故障转移,运行pg_ctl promote 或者创建一个触发器文件,这里用创建触发器文件,其文件名和路径由recovery.conf 中的trigger_file设置指定。通过vim修改文件在文件末尾添加如下内容。

描述:故障切换配置文件

图片:5.png

故障切换配置文件
主节点的recovery.conf文件名后缀是recovery.done
primary_conninfo表示主节点的连接信息,所以值是基础节点的连接信息。
trigger_file触发文件的全路径。

2.4备用节点standby

2.4.1配置pg_hba.conf文件
通过vim命令修改pg_hba.conf文件,同1.3.1小节的修改方式一样,在文件的IPv4小节下添加一行

host                        all                        all                           0.0.0.0/0                          md5


2.4.2配置postgresql.conf文件
在文件末尾添加如下图内容

描述:slave节点配置

图片:4.png

slave节点配置

2.4.3配置recovery.conf文件

描述:故障切换配置文件

图片:3.png

故障切换配置文件

在postgresql.conf文件中归档命令archive_command的目录/home/postgresql/pgsql/pg_archive权限值为700,拥有者和用户组都是postgres。数据目录data_directory的值是当前文件所在目录。
备用节点的连接数量要大于或等于主节点。

2.5启动/停止集群

启动集群postgresql命令
systemctl start postgresql-10
在每一个节点上都执行命令这个,先从主节点上启动再启动备用节点。

停止集群postgresql命令
systemctl stop postgresql-10
在集群的每一个节点执行该命令。


2.6集群测试
通过sql语句查看流复制的状态

描述:查看流复制状态

图片:6.png

查看流复制状态
可以看到有两个节点,并且是异步的。如果现在192.168.50.56(imp04)插入数据
insert into test1(name) values(‘ssss2’)

描述:连接pg并插入数据

图片:7.png

连接pg并插入数据
数据会异步同步到192.168.50.57(imp05)和192.168.50.58(imp06)如下图

描述:流复制同步

图片:8.png

流复制同步
 
三、pgpool集群
3.1介绍pgpool
pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:
连接池
pgpool-II 保持已经连接到 PostgreSQL 服务器的连接, 并在使用相同参数(例如:用户名,数据库,协议版本) 连接进来时重用它们。 它减少了连接开销,并增加了系统的总体吞吐量。
复制
pgpool-II 可以管理多个 PostgreSQL 服务器。 激活复制功能并使在2台或者更多 PostgreSQL 节点中建立一个实时备份成为可能, 这样,如果其中一台节点失效,服务可以不被中断继续运行。
负载均衡
如果数据库进行了复制(可能运行在复制模式或者主备模式下), 则在任何一台服务器中执行一个 SELECT 查询将返回相同的结果。 pgpool-II 利用了复制的功能以降低每台 PostgreSQL 服务器的负载。 它通过分发 SELECT 查询到所有可用的服务器中,增强了系统的整体吞吐量。 在理想的情况下,读性能应该和 PostgreSQL 服务器的数量成正比。 负载均衡功能在有大量用户同时执行很多只读查询的场景中工作的效果最好。
限制超过限度的连接
PostgreSQL 会限制当前的最大连接数,当到达这个数量时,新的连接将被拒绝。 增加这个最大连接数会增加资源消耗并且对系统的全局性能有一定的负面影响。 pgpoo-II 也支持限制最大连接数,但它的做法是将连接放入队列,而不是立即返回一个错误。
pgpool-II 使用 PostgreSQL 的前后台程序之间的协议,并且在前后台之间传递消息。 因此,一个(前端的)数据库应用程序认为 pgpool-II 就是实际的 PostgreSQL 数据库, 而后端的服务进程则认为 pgpool-II 是它的一个客户端。 因为 pgpool-II 对于服务器和客户端来说是透明的, 现有的数据库应用程序基本上可以不需要修改就可以使用 pgpool-II 了。
 

3.2节点分配

描述:pgpool-II节点分布

图片:13.png

pgpool-II节点分布
节点数量最好是奇数,多个节点解决了单点故障问题,这里配置了两个节点。

3.3下载及安装
下载安装的是3.6的大版本,这个小版本及和postgres的版本,自己可以选择,小版本之间是兼容的,最好版本一致。
选择在线安装,下载rpm包。链接地址如下:
http://www.pgpool.net/yum/rpms/3.6/redhat/rhel-7-x86_64/
打开页面选择pg版本是10,然后选择的pgpool的小版本是3.6.16版本。
所以选择下载安装:
pgpool-II-pg10-debuginfo, pgpool-II-pg10-devel, pgpool-II-pg10-extensions都是可选安装的。如果要安装把上面命令中的链接地址更换成相应的地址。

3.4配置
3.4.1配置pgpool.cof
Rpm安装的配置文件在/etc/pgpool-II目录中,配置文件说明:

描述:pgpool.conf样例

图片:14.png

pgpool.conf样例

根据需要,把上面的这些样例文件名修改成pgpool.conf再进行修改配置,也可以把默认的pgpool.conf文件复制一份进行配置。
例如:
# cd /usr/local/etc
# cp pgpool.conf.sample-stream pgpool.conf
备份默认的pgpool.conf文件,修改pgpool.conf文件,配置如下:

# CONNECTIONS
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898


# - Backend Connection Settings -

backend_hostname0 = 'imp04'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/home/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'imp05'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/home/pgsql/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'


#backend_hostname2 = 'imp06'
#backend_port2 = 5432
#backend_weight2 = 1
#backend_data_directory2 = '/home/pgsql/data'
#backend_flag2 = 'ALLOW_TO_FAILOVER'

# - Authentication -
enable_pool_hba = on
pool_passwd = 'pool_passwd'


#------------------------------------------------------------------------------
# POOLS
#------------------------------------------------------------------------------

# - Concurrent session and pool size -
num_init_children = 100
                                  # Number of concurrent sessions allowed
                                  # (change requires restart)
max_pool = 4
                                  # Number of connection pool caches per connection
                                  # (change requires restart)


# FILE LOCATIONS
pid_file_name = '/var/run/pgpool/pgpool.pid'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 5
sr_check_user = 'repuser'
sr_check_password = 'repuser'
sr_check_database = 'postgres'

#------------------------------------------------------------------------------
# HEALTH CHECK 健康检查
#------------------------------------------------------------------------------

health_check_period = 10 # Health check period
                                  # Disabled (0) by default
health_check_timeout = 20
                                  # Health check timeout
                                  # 0 means no timeout
health_check_user = 'repuser'
                                  # Health check user
health_check_password = 'repuser'    #数据库密码
                                  # Password for health check user
health_check_database = 'postgres'
#必须设置,否则primary数据库down了,pgpool不知道,不能及时切换。从库流复制还在连接数据,报连接失败。
#只有下次使用pgpool登录时,发现连接不上,然后报错,这时候,才知道挂了,pgpool进行切换。


#主备切换的命令行配置
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

failover_command = '/etc/pgpool-II/failover_stream.sh %d %H /tmp/trigger_file0'

#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------

# - Enabling -
use_watchdog = on
# - Watchdog communication Settings -

wd_hostname = 'imp04'
                                   # Host name or IP address of this watchdog
                                   # (change requires restart)
wd_port = 9000
                                   # port number for watchdog service
                                   # (change requires restart)
# - Virtual IP control Setting -

delegate_IP = '192.168.50.59'
                                   # delegate IP address
                                   # If this is empty, virtual IP never bring up.
                                   # (change requires restart)
if_cmd_path = '/sbin'
                                   # path to the directory where if_up/down_cmd
                                   # (change requires restart)
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
                                   # startup delegate IP command
                                   # (change requires restart)
if_down_cmd = 'ifconfig eth0:0 down'
                                   # shutdown delegate IP command
                                   # (change requires restart)
# -- heartbeat mode --

wd_heartbeat_port = 9694
                                   # Port number for receiving heartbeat signal
                                   # (change requires restart)
wd_heartbeat_keepalive = 2
                                   # Interval time of sending heartbeat signal (sec)
                                   # (change requires restart)
wd_heartbeat_deadtime = 30
                                   # Deadtime interval for heartbeat signal (sec)
                                   # (change requires restart)
heartbeat_destination0 = 'imp05'
                                   # Host name or IP address of destination 0
                                   # for sending heartbeat signal.
                                   # (change requires restart)
heartbeat_destination_port0 = 9694
                                   # Port number of destination 0 for sending
                                   # heartbeat signal. Usually this is the
                                   # same as wd_heartbeat_port.
                                   # (change requires restart)
heartbeat_device0 = 'eth0'
                                   # Name of NIC device (such like 'eth0')
                                   # used for sending/receiving heartbeat
                                   # signal to/from destination 0.
                                   # This works only when this is not empty
                                   # and pgpool has root privilege.
                                   # (change requires restart)
# - Other pgpool Connection Settings -

other_pgpool_hostname0 = 'imp05'        #对端
                                   # Host name or IP address to connect to for
                                   # (change requires restart)
other_pgpool_port0 = 9999
                                   # Port number for othet pgpool 0
                                   # (change requires restart)
other_wd_port0 = 9000
                                   # Port number for othet watchdog 0
                                   # (change requires restart)
#------------------------------------------------------------------------------
# LOGS
#------------------------------------------------------------------------------
log_destination = 'syslog,stderr'
log_line_prefix = '%t: pid %p: line %l: %u@%d/%a'  
syslog_facility = 'LOCAL0'




3.4.2配置pcp.conf
pgpool-II 有一个控制接口,管理员可以通过它远程收集 pgpool-II 的状态信息或者终止 pgpool-II 进程。 pcp.conf 是用于这个接口认证的用户/密码文件。 所有的模式都需要先设置 pcp.conf 文件。
在pcp.conf文件中空行或者以“#”开始的行将被认为是注释,会被忽略掉。一个用户名和对应的密码必须以以下的方式写成一行。
username:[password encrypted in md5]
[password encrypted in md5] 可以通过 $prefix/bin/pg_md5 命令生成。
pg_md5 -p
password: <your password>
或者
./pg_md5 foo
acbd18db4cc2f85cedef654fccc4a4d8
pcp.conf 对于在运行 pgpool-II的用户必须有可读权限。

3.4.3配置pool_hba.conf
由于在pg已经配置了认证方法是md5,所以有必要设置一下客户端认证方式连接postgres的节点。如果是用户rpm安装,pg_hba.conf文件在/etc/pgpool-II目录下面,pool_hba认证,默认是被禁用的,要设置为了enable_pool_hba = on 来启动它。
enable_pool_hba = on
pool_hba.conf文件的格式几乎和PostgreSQL’s的pg_hba.conf一样,配置pg_hba.conf用户认证方式是md5。
为了能够使用MD5认证,需要注册用户名和密码到pool_passwd。执行命令pg_md5 --md5auth
--username=<user name> <password>将用户名和加密的后密码注册到pool_passwd文件中。如果pool_passwd文件不存在,执行命令的时候会创建并写入需要注册的信息.。

3.5启动/停止集群

1. 启动命令
# systemctl start pgpool.service
pgpool [-c][-f config_file][-a hba_file][-F pcp_config_file][-n][-D][-d]
所有后端服务(postgresql)都必须在启动 pgpool-II 之前启动。
使用pgpool命令启动的参数解释如下:
-c   --clear-cache 删除 query cache
-f config_file      --config-file
config-file     指定 pgpool.conf
-a hba_file   --hba-file
hba_file      指定 pool_hba.conf
-F pcp_config_file     --pcp-password-file    指定 pcp.conf
-n   --no-daemon 非守护进程模式(不脱离终端运行)
-D  --discard-status    忽略 pgpool_status 文件且不恢复到先前的状态 V3.0 -
-C  --clear-oidmaps    忽略用于基于内存的查询缓存的 memqcache_oiddir 中的 oid 映射文件 (仅当 memqcache_method 为 'memcached'时有效), 如果是 shm,则总是忽略。 V3.2 -
-d   --debug  调试模式
-x   --debug-assertions      启用变量断言(assertion)检查,本功能用于调试
例如:
pgpool -n -d -D > /var/log/pgpool/pgpool.log 2>&1 &

2. 停止命令
# systemctl stop pgpool.service
或使用pgpool 命令。下面是使用 pgpool命令的示例。
pgpool [-f config_file][-F pcp_config_file] [-m {s[mart]|f[ast]|i[mmediate]}] stop
-m s[mart]    --mode
s[mart]     等待客户端断开连接,然后关闭(默认)
-m f[ast]       --mode
f[ast]        并不等待客户端; 立即关闭
-m i[mmediate]   --mode
i[mmediate]    等同于 '-m f'
例如:
pgpool -m fast stop

3.6 命令
这里只写一部分命令
pcp_watchdog_info --      displays the watchdog status of the Pgpool-II
pcp_watchdog_info --verbose -h 192.168.50.59 -p 9898 -U postgres
结果如下

描述:pgpool看门狗信息

图片:10.png

pgpool看门狗信息

四、 参考文档
PostgreSQL官网:https://www.postgresql.org/
PostgreSQL 10.1手册:http://www.postgres.cn/docs/10/
[舒忠国于2019-05-28 17:22编辑了帖子]
舒忠国
新手
新手
  • UID542
  • 粉丝0
  • 关注0
  • 发帖数4
沙发#
发布于:2019-05-27 13:11
如果帖子中有什么不对的地方,望大家多多指点,我在此先谢谢大家。
游客

返回顶部