postgresql集的搭建
⽬录
架构图
部署详情
postgresql的安装与配置
pgpool的安装与配置
写在安装前
postgresql是⼀款很强⼤的数据库,具体有多强⼤呢,请⾕歌。。。
⽹上的相关资料不是很多,参考了⼤神们的⽂档,结合⾃⼰趟了的坑,写了pg集的安装⽂档。可能有⼀些参数没有配置好,希望⼤神们指出,谢谢。参照本⽂档,基本能实现pg的⾼可⽤,稍后会写出测试⽂档。
架构图
部署详情
ip host系统vip部署
192.168.123.180master CentOS 6.8192.168.123.183postgresql、pgpool
192.168.123.181slave1CentOS 6.8192.168.123.183postgresql、pgpool
192.168.123.182slave2CentOS 6.8192.168.123.183postgresql
postgresql的安装
1、安装
2、安装:
yum install -y postgresql95-libs-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-contrib-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-server-9.5.8-1PGDG.rhel6.x86_64.rpm
3、初始化db:
service postgresql-9.5 initdb
4、设置为开机启动:
chkconfig postgresql-9.5 on
5、安装的⽬录:
/var/lib/pgsql/9.5
配置⽩名单与流复制
1、 master的配置
PostgreSQL流复制默认是异步的。在主服务器上提交事务和从服务器上变化可见之间有⼀个⼩的延迟,这个延迟远⼩于基于⽂件⽇志传送,通常1秒能完成。如果主服务器突然崩溃,可能会有少量数据丢失。
同步复制必须等主服务器和从服务器都写完WAL后才能提交事务。这样在⼀定程度上会增加事务的响应时间。
配置同步复制仅需要⼀个额外的配置步骤: synchronous_standby_names必须设置为⼀个⾮空值。synchronous_commit也必须设置为on。这⾥部署的是异步的流复制
1.2、配置⽩名单:
vim /var/lib/pgsql/9.5/data/f
在配置⽂件最后加上:
host  all            all              192.168.123.180/32      trust
host  all            all              192.168.123.181/32      trust
host  all            all              192.168.123.182/32      trust
host  replication      replica          192.168.123.181/32      trust
host  replication      replica          192.168.123.182/32      trust
保存退出
我这⾥由于是内⽹,全部⽤的trust,如果要⽤密码,请修改为passwd
1.3、修改配置⽂件:
vim /var/lib/pgsql/9.5/f
data_directory = '/app/pgsql/data'                            #⾃定义data⽬录
listen_addresses = '*'                                      #监听所有ip
archive_mode = on                                        #允许归档
archive_command = 'cp %p /app/pgsql/pg_archive/%f'          #使⽤命令归档
wal_level = hot_standby                                    #选择热备
max_wal_senders = 16                                    #最多多少个流复制链接
wal_keep_segments = 256                                  #流复制保留最多的xlog数
wal_sender_timeout = 60s                              #流复制主机发送数据超时时间
max_connections = 99                                  #从库的max_connections必须⼤于主库的
1.4、创建data⽬录,赋权并修改启动⽂件
mkdir -p /app/pgsql/data && chown postgres:postgres /app/pgsql/data
mkdir -p /app/pgsql/pg_archive && chown postgres:postgres /app/pgsql/pg_archive
cd /app/pgsql && chmod 700 data
cd /app/pgsql && chmod 700 pg_archive
1.5、修改启动⽂件
vim /etc/init.d/postgresql-9.5
PGDATA=/app/pgsql/data
1.6、把原data⽬录下的⽂件copy到新的data的⽬录下,并改变属组:
cp -r /var/lib/pgsql/9.5/data/* /app/pgsql/data/
cd /app/pgsql && chown -R postgres:postgres data
1.7、启动
service postgresql-9.5 start
以后修改配置⽂件就在/app/pgsql/data下⾯修改
1.8、创建⼀个数据库⽤户进⾏主从同步。创建⽤户replica,并赋予登录和复制的权限登陆到数据库⾥:
su postgres
psql
CREATE ROLE replica login replication encrypted password 'replica';
防⽕墙开放5432端⼝
在从库上:
psql -h 192.168.123.180 -U postgrescentos安装vim命令
登陆主库成功
2、从库的配置
2.1、⾃定义data⽬录:
mkdir -p /app/pgsql/data/&&chmod 700 /app/pgsql/data/
chown -R  postgres:postgres pgsql
mkdir /app/pgsql/pg_archive
cd /app/pgsql
chmod 700 pg_archive && chown postgres:postgres pg_archive/
2.2、切换⽤户:
su – postgres
2.3、备份数据:
pg_basebackup -h 192.168.123.180 -U replica -D /app/pgsql/data -X stream –P
2.4、修改启动⽂件:
vim /etc/init.d/postgresql-9.5
PGDATA=/app/pgsql/data
2.5、配置f
su postgres
cp /usr/pgsql-9.5/f.sample /app/pgsql/f
vim /app/pgsql/f
standby_mode = on        \#该节点为从
primary_conninfo = 'host=192.168.123.180 port=5432 user=replica password=replica'
\#主服务器的ip、user
recovery_target_timeline = 'latest'
trigger_file = '/tmp/trigger_file0'
2.6、配置f
vim /app/pgsql/f
max_connections = 999    #⼤于主的连接数
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
2.7、重启服务:
service postgresql-9.5 restart
验证流复制
3.1、在master上登陆psql
查看状态:
select client_addr,sync_state from pg_stat_replication;
3.2、创建test库
Create database test;
3.3、slave上登陆psql
查看库
playboy => \l
发现已同步。
pgpool的安装
pgpool-II是PostgreSQL服务器之间⼀种有效的中间件和PostgreSQL数据库客户端。它提供了以下功能。
连接池
pgpool-II保存到PostgreSQL服务器的连接,当⼀个相同新连接(如⽤户名、数据库、协议版本)进来时,重⽤他们。它减少了连接开销,提⾼了系统的整体吞吐量。
复制
pgpool-II可以管理多个PostgreSQL服务器。使⽤复制功能可以使2个或更多的物理磁盘上创建⼀个实时备份,这样服务不会因服务器的磁盘故障⽽中断。
负载平衡
如果数据库是复制的,在任何服务器上执⾏⼀个SELECT查询会返回相同的结果。pgpool-II复制特性的优势在于减少每个PostgreSQL服务器上的负载,因为它可以使⽤分布在多个服务器之间进⾏SELECT查询,从⽽提⾼系统的整体吞吐量。最好是查询和PostgreSQL服务器数量成⼀定⽐例,多⽤户同时执⾏多查询达到负载均衡最好的效果。
限制连接数
PostgreSQL的最⼤并发连接数有⼀定限制的,当超过限制的连接数后,连接会被拒绝。然⽽,设置增加最⼤连接数⼜会增加资源消耗,影响系统性能。pgpool-II也有最⼤连接数限制,但超过的连接进来时是进⾏⽴即排队,⽽不是返回⼀个错误。
pgpool-II交互PostgreSQL的后端和前端协议时,起着继电器的作⽤。因此,数据库应⽤程序(前端)认为pgpool-II是真实的PostgreSQL服务器,服务器(后端)认为pgpool-II是它的客户端之⼀。因为pgpool-II在服务器和客户端是透明的,所以pgpool-II可以使⽤现有的数据库应⽤程序⽽做到⼏乎不修改它们。
版本:3.6
机器:192.168.123.180
192.168.123.181
4.1、免密码登陆
安装之前先配置密钥使master和slave1这两台虚拟机的postgres⽤户能免密连接
先修改postgres的密码,在root⽤户下
passwd postgres
新密码123456
Master到slave1的免密码登陆:
在master上切换⾄postgres⽤户,⽣成密钥
su postgres ssh-keygen -t rsa
然后全输⼊回车
切换到postgres⽤户:
su postgres ssh-copy-id -i /var/lib/pgsql/.ssh/id_rsa 192.168.123.181
然后ssh 192.168.123.181 成功,实现master到slave1的免密码登陆安装:
yum install pgpool-II-pg95-3.6.0-1pgdg.rhel6.x86_64.rpm
4.3、配置
Master的配置:
配置⽩名单:
要和f登陆权限⼀致,这⾥由于是私有云,都⽤trust vim /etc/pgpool-II/f
在最后改成:
配置pcp管理⼯具密码:
pg_md5 pwd
密码加密
vim /etc/f
把刚才加密的密码粘贴到⽂件⾥
配置系统命令权限:
Root⽤户下:
chmod u+s /sbin/ifconfig &&chmod u+s /usr/sbin
配置中间件配置⽂件:
vim /etc/f
# CONNECTIONS
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898
# - Backend Connection Settings -
backend_hostname0 = 'master'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ' /app/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'slave'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ' /app/pgsql/data''
backend_flag1 = 'ALLOW_TO_FAILOVER'
# - Authentication -
enable_pool_hba = off
pool_passwd = 'pool_passwd'
# FILE LOCATIONS
pid_file_name = '/opt/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 = ' /opt/pgpool/failover_stream.sh %d %H /tmp/trigger_file0 '
#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------
# - Enabling -
use_watchdog = on
# - Watchdog communication Settings -
wd_hostname = 'master'
# 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.123.183 '
# 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 = 'slave1'
# 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'

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。