pgpool-ii 安装手册 基于Centos7.3
Posted dbalightyear
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pgpool-ii 安装手册 基于Centos7.3相关的知识,希望对你有一定的参考价值。
http://www.bkjia.com/jQuery/1173582.html
地址被占用pgpool启动失败
Nov 15 02:33:56 node3 pgpool: 2016-11-15 02:33:56: pid 3868: FATAL: failed to bind a socket: "/tmp/.s.PGSQL.9999"Nov 15 02:33:56 node3 pgpool: 2016-11-15 02:33:56: pid 3868: DETAIL: bind socket failed with error: "Address already in use"
由于上次没有正常关闭导致,处理方法:
rm -f /tmp/.s.PGSQL.9999
pgpool的master断网后,连接阻塞
切换pgpool的master节点(node1)的网络后,通过pgpool的连接阻塞,剩余节点的pgpool重新协商出新的Master,但阻塞继续,包括新建连接,也没有发生切换。
-------------------------挂载离线yum源---------------------------
在每个节点上都执行
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.bak
mv CentOS-Debuginfo.repo CentOS-Debuginfo.repo.bak
mv CentOS-Vault.repo CentOS-Vault.repo.bak
mv CentOS-CR.repo CentOS-CR.repo.bak
mv CentOS-fasttrack.repo CentOS-fasttrack.repo.bak
mv CentOS-Sources.repo CentOS-Sources.repo.bak
mv CentOS-Media.repo CentOS-Media.repo.bak
cp CentOS-Media.repo.bak CentOS-Media.repo
vi CentOS-Media.repo
name=CentOS-$releasever - Media
baseurl=file:///media/yumpackage/
gpgcheck=0 # 设置gpgcheck=1会让yum检查每个下载的RPM的GnuPG签名。这么做是因为你需要适当的GnuPG key注册到您的RPM数据库。可以防止被欺骗,如:非法入侵发行版网站,木马导入软件包,使不知情用户下载
enabled=1 # 是否启用这个仓库,1为起用,0为禁用
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
mkdir /media/yumpackage/
mount /dev/cdrom /media/yumpackage/
yum的基本命令
以下命令行可以获取当前系统有效的repolist,
# yum repolist
以下命令获取当前有效repolist中所能安装的所有rpm包列表,(很长,慎重)
# yum list
1 安装
yum install 全部安装
yum install package1 安装指定的安装包package1
yum groupinsall group1 安装程序组group1
2 更新和升级
yum update 全部更新
yum update package1 更新指定程序包package1
yum check-update 检查可更新的程序
yum upgrade package1 升级指定程序包package1
yum groupupdate group1 升级程序组group1
3 查找和显示
yum info package1 显示安装包信息package1
yum list 显示所有已经安装和可以安装的程序包
yum list package1 显示指定程序包安装情况package1
yum groupinfo group1 显示程序组group1信息yum search string 根据关键字string查找安装包
4 删除程序
yum remove | erase package1 删除程序包package1
yum groupremove group1 删除程序组group1
yum deplist package1 查看程序package1依赖情况
5 清除缓存
yum clean packages 清除缓存目录下的软件包
yum clean headers 清除缓存目录下的 headers
yum clean oldheaders 清除缓存目录下旧的 headers
yum clean, yum clean all (= yum clean packages; yum clean oldheaders) 清除缓存目录下的软件包及旧的headers
-----------------------------------------------------------------------------------------------------------------------------------------------------
yum安装所需软件包
rpm --import /etc/pki/rpm-gpg/RPM* --非必须执行,在安装下面包出错时运行
rm -f /var/run/yum.pid
yum install -y binutils-* compat-libstdc++-33-* elfutils-libelf-* elfutils-libelf-devel-* gcc-* gcc-c++-* glibc-* glibc-common-* glibc-devel-* glibc-headers-* ksh-* libaio-* libgcc-* libstdc++-*
yum install -y make-* sysstat-* unixODBC-* unixODBC-devel-* compat-libcap* flex-* readline-devel zlib-devel readline
yum install -y openssl-devel
yum -y install uuid uuid-devel
yum install -y bison bison-devel
yum -y install -y readline-devel
yum install lrzsz
------------------------------------------------------------------------------------------------------------
su - root root用户登录
mkdir /opt/soft_bak 新建目录
cd /opt/soft_bak 切换目录
上传
pgfincore-1.0.gz
pgpool-II-3.3.12.tar.gz
postgresql-9.6.3.tar.bz2
uuid-1.6.1.tar.gz
安装uuid包
tar -zxvf uuid-1.6.1.tar.gz
cd uuid-1.6.1
./configure
make
make install
------------------------------------------------------------------------------------------------------------
在pgtouter1/2/3节点上传软件包
tar -jxvf postgresql-9.6.3.tar.bz2
cd postgresql-9.6.3/
make distclean 命令是将先前configure 生成的文件全部删除掉,包括Makefile。在 configure 操作前先执行了下 "make distclean" , 之后编译就没报错了。
./configure --prefix=/opt/pgsql963 --with-openssl --with-ossp-uuid --with-wal-blocksize=16 --with-blocksize=16 设定postgresql数据库管理系统安装位置
gmake world 编译源码
gmake install-world 安装源码
---------------------------------------------------------------------------------------------------------------
添加用户
useradd pg96 添加安装启动管理数据库的普通用户
passwd pg96 设置密码hytera1993
配置环境变量 --router1 2000 router 2000 router 2000
vi /home/pg96/.bash_profile 设置环境变量,添加内容如下:
export PGPORT=2000
export PGDATA=/home/pg96/pg_root
export LANG=en_US.utf8
export PGHOME=/opt/pgsql963
export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:$LD_LIBRARY_PATH
export DATE=`date +"%Y%m%d%H%M"`
export PATH=$PGHOME/bin:/opt/pgpool365/bin:$PATH:.
export MANPATH=$PGHOME/share/man:$MANPATH
export PGUSER=postgres
export PGHOST=$PGDATA
alias rm=‘rm -i‘
alias ll=‘ls -lh‘
export PGDATABASE=postgresql
设置目录目录权限
chmod 755 /home/ 设置目录权限,这里不允许设置777,否则Linux互信不好使
chmod 755 /home/pg96/ 设置目录权限,这里不允许设置777,否则Linux互信不好使
检测数据库管理系统
su - pg96
which psql 检查psql数据库管理系统是否安装正常
psql -V 检查psql数据库管理系统是否安装正常
echo $PGDATA 检查psql数据库管理系统是否安装正常
echo $PGHOME 检查psql数据库管理系统是否安装正常
初始化数据库
initdb -D $PGDATA -E UTF8 --locale=C -U postgres -W 初始化数据库
超级管理员密码设置为hytera1993
修改系统变量
su - root
vi /etc/sysctl.conf
kernel.shmmni = 4096
kernel.sem = 50100 64128000 50100 1280
fs.file-max = 7672460
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 1048576
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
net.core.somaxconn = 256
设置区域大小
vi /etc/security/limits.conf
soft nofile 131072
hard nofile 131072
soft nproc 131072
hard nproc 131072
soft core unlimited
hard core unlimited
soft memlock 50000000
hard memlock 50000000
关闭防火墙
Centos6.x适用
chkconfig iptables off
service iptables stop
Centos7.x适用
systemctl start firewalld.service #启动firewall
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
要同时修改所有三个主机名:静态、瞬态和灵活主机名:
hostnamectl set-hostname <host-name>
--------------------------------------------------------------------------------------------------------------------------------------------
https://yq.aliyun.com/articles/214
postgresql配置
su - pg96
cd $PGDATA
vi pg_hba.conf 添加内容如下:
host all all 0.0.0.0/0 md5
vi postgresql.conf添加内容如下:
listen_addresses = ‘0.0.0.0‘
port = 2000
max_connections = 1000
superuser_reserved_connections = 20
shared_buffers = 410MB
wal_buffers = 120MB
unix_socket_directories = ‘.‘
unix_socket_permissions = 0700
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10
vacuum_cost_delay = 10
bgwriter_delay = 10ms
synchronous_commit = off
wal_writer_delay = 10ms
log_destination = ‘csvlog‘
logging_collector = on
log_directory = ‘pg_log‘
log_filename = ‘postgresql-%Y-%m-%d_%H%M%S.log‘
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
*******************************************************************
最大允许1000个连接.
max_connections = 1000
为超级用户保留3个可用连接.
superuser_reserved_connections = 13
默认的unix socket文件放在/tmp, 修改为$PGDATA, 以确保安全.
unix_socket_directory = ‘.‘
默认的访问权限是0777, 修改为0700更安全.
unix_socket_permissions = 0700
Linux下面默认是2小时. tcp的keepalives包发送间隔以及重试次数. 如果你的网络环境中有设备自动断开空闲会话,那么建议你设置心跳时间小于网络设备的断链接阈值。
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 6
大的shared_buffers需要大的checkpoint_segments,同时需要申请更多的System V共享内存资源.
这个值不需要设的太大, 因为PostgreSQL还依赖操作系统的cache来提高读性能, 另外, 写操作频繁的数据库这个设太大反而会增加checkpoint压力(除非你使用了SSD或者IOPS能力很好的存储).
建议设置为内存大小的20%
shared_buffers = 1GB
注意现在的PG版本已经支持大页了,如果需要的共享内存很多,建议使用大页。
需要在系统操作中开启大页支持。 cat /proc/meminfo |grep Hugepagesize 得到 2048 kB , 如果需要8G shared buffer, 输入 echo "vm.nr_hugepages=4096" (也可以略大)
这个值越大, VACUUM, CREATE INDEX的操作越快, 当然大到一定程度瓶颈就不在内存了, 可能是CPU例如创建索引.
这个值是一个操作的内存使用上限, 而不是一次性分配出去的. 并且需要注意如果开启了autovacuum, 最大可能有autovacuum_max_workers*maintenance_work_mem的内存被系统消耗掉.
maintenance_work_mem = 512MB
建议防止暴力破解, 密码复杂度检测, 开启pg_stat_statements, 开启auto_explain, 参考 http://blog.163.com/[email protected]/blog/static/16387704020149852941586
shared_preload_libraries = ‘auth_delay,passwordcheck,pg_stat_statements,auto_explain‘
一般设置为比系统限制的略少,ulimit -a : stack size (kbytes, -s) 10240
max_stack_depth = 8MB
手动执行vacuum操作时, 默认是没有停顿执行到底的, 为了防止VACUUM操作消耗太多数据库服务器硬件资源, 这个值是指vacuum在消耗多少资源后停顿多少时间,以便其他的操作可以使用更多的硬件资源.
vacuum_cost_delay = 10ms
#vacuum_cost_page_hit = 1 # 0-10000 credits
#vacuum_cost_page_miss = 10 # 0-10000 credits
#vacuum_cost_page_dirty = 20 # 0-10000 credits
vacuum_cost_limit = 10000 # 1-10000 credits
默认bgwriter进程执行一次后会停顿200ms再被唤醒执行下一次操作, 当数据库的写操作很频繁的时候, 200ms可能太长, 导致其他进程需要花费过多的时间来进行bgwriter的操作.
bgwriter_delay = 10ms
如果需要做数据库WAL日志备份的话至少需要设置成archive级别, 如果需要做hot_standby那么需要设置成hot_standby, 由于这个值修改需要重启数据库, 所以先设置成hot_standby比较好. 当然hot_standby意味着WAL记录得更详细, 如果没有打算做hot_standby设置得越低性能越好.
wal_level = hot_standby
PostgreSQL 9.4已经支持逻辑复制了。如果是9.4,建议设置为logical。
# wal_level = logical # 如果将来打算使用logical复制, 最后先配置好, 不需要停机再改.
wal buffers默认是-1 根据shared_buffers的设置自动调整shared_buffers*3% .最大限制是XLOG的segment_size.
wal_buffers = 16MB
多少个xlog file产生后开始checkpoint操作, 这个值越大, 允许shared_buffer中的被频繁访问的脏数据存储得更久. 一定程度上可以提高数据库性能. 但是太大的话会导致在数据库发生checkpoint的时候需要处理更多的脏数据带来长时间的IO开销. 太小的话会导致产生更多的WAL文件(因为full page writes=on,CHECKPOINT后的第一次块的改变要写全块, checkpoint越频繁, 越多的数据更新要写全块导致产生更多WAL).
建议设置为shared_buffers除以单个XLOG文件的大小。
checkpoint_segments = 64
这个和checkpoint_segments的效果是一样的, 只是触发的条件是时间条件.
checkpoint_timeout = 5min
归档参数的修改也需要重启数据库, 所以就先打开吧.
archive_mode = on
这个是归档调用的命令, 我这里用date代替, 所以归档的时候调用的是输出时间而不是拷贝wal文件.
archive_command = ‘/bin/date‘
如果要做hot standby这个必须大于0, 并且修改之后要重启数据库所以先设置为32.
max_wal_senders = 32
这是个standby 数据库参数, 为了方便角色切换, 我一般是所有的数据库都把他设置为on 的.
hot_standby = on
这个参数是说数据库中随机的PAGE访问的开销占seq_page_cost的多少倍 , seq_page_cost默认是1. 其他的开销都是seq_page_cost的倍数. 这些都用于基于成本的执行计划选择.
random_page_cost = 2.0
和上一个参数一样, 用于基于成本的执行计划选择. 不是说会用多少cache, 它只是个度量值. 表示系统有多少内存可以作为操作系统的cache. 越大的话, 数据库越倾向使用index这种适合random访问的执行计划.
建议设置为内存的80%
effective_cache_size = 10GB
下面是日志输出的配置.
log_destination = ‘csvlog‘
logging_collector = on
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB
这个参数调整的是记录执行时间超过1秒的SQL到日志中, 一般用于跟踪哪些SQL执行时间长.
log_min_duration_statement = 1000ms
记录每一次checkpoint到日志中.
log_checkpoints = on
记录连接和断开连接
log_connections = on
log_disconnections = on
log_error_verbosity = verbose # 在日志中输出代码位置
记录锁等待超过1秒的操作, 一般用于排查业务逻辑上的问题.
log_lock_waits = on
deadlock_timeout = 1s
记录DDL语句, 一般用于跟踪数据库中的危险操作.
log_statement = ‘ddl‘
这个原本是1024表示跟踪的SQL在1024的地方截断, 超过1024将无法显示全SQL. 修改为2048会消耗更多的内存(基本可以忽略), 不过可以显示更长的SQL.
track_activity_query_size = 2048
默认autovacuum就是打开的, log_autovacuum_min_duration = 0记录所有的autovacuum操作.
autovacuum = on
log_autovacuum_min_duration = 0
这个模块用于记录数据库中的最近的1000条SQL以及这些SQL的统计信息, 如执行了多少次, 总共耗时是多少. 一般用于发现业务上最频繁调用的SQL是什么, 有针对性的进行SQL优化.
shared_preload_libraries = ‘pg_stat_statements‘
现在的版本不需要设置custom_variable_classes
custom_variable_classes = ‘pg_stat_statements‘
auth_delay.milliseconds = 5000 # 认证失败, 延迟多少毫秒反馈
auto_explain.log_min_duration = 5000 # 记录超过多少毫秒的SQL当时的执行计划
auto_explain.log_analyze = true
auto_explain.log_verbose = true
auto_explain.log_buffers = true
auto_explain.log_nested_statements = true
pg_stat_statements.track_utility=off
pg_stat_statements.max = 1000
pg_stat_statements.track = all
*******************************************************************
PostgreSQL 9.5 以前的版本, 通过checkpoint_segments 来触发基于XLOG个数的检查点,
通过 " (2 + checkpoint_completion_target) * checkpoint_segments + 1 " 这个公式来技术保留的XLOG个数.
PostgreSQL 9.5 将废弃checkpoint_segments 参数, 并引入max_wal_size 和 min_wal_size 参数, 通过max_wal_size和checkpoint_completion_target 参数来控制产生多少个XLOG后触发检查点,
通过min_wal_size和max_wal_size参数来控制哪些XLOG可以循环使用.
那么PostgreSQL 9.5如何计算什么时候触发检查点呢?
通过CalculateCheckpointSegments函数来计算, 依赖max_wal_size和CheckPointCompletionTarget
target = (double ) max_wal_size / (2.0 + CheckPointCompletionTarget);
--------------------------------------------------------------------------------------------------------------------------------------------
测试数据库是否安装成功
su - pg96
pg_ctl start 启动数据库
pg_ctl -m fast stop 停止数据库
pg_ctl restart 重启数据库
Linux下执行:
ps -ef | grep postgres 数据库服务是否正常启动
psql -h 127.0.0.1 -p 2000 -U postgres postgres 节点1登录数据库
psql -h 127.0.0.1 -p 2000 -U postgres postgres 节点2
psql -h 127.0.0.1 -p 2000 -U postgres postgres 节点3
安装uuid插件
create extension "uuid-ossp";
安装postgres_fdw插件
CREATE EXTENSION postgres_fdw;
------------------------------------------------------------------------------------------------------------------------------------------------
1333
fugo
rwx
421
-------------------------------------------------------------------------------------------------------------------------------------------------
配置级联流复制主备
主节点配置
cd $PGDATA
编辑vi pg_hba.conf文件,添加如下内容:
host replication replica 127.0.0.1/32 md5
host replication replica 0.0.0.0/0 md5
编辑vi postgresql.conf文件,添加如下内容:
wal_level = hot_standby
archive_mode = on
archive_command = ‘/bin/date‘
max_wal_senders = 10
wal_keep_segments = 256
synchronous_standby_names = ‘*‘
hot_standby = on
max_standby_archive_delay = 300s
max_standby_streaming_delay = 300s
wal_receiver_status_interval = 1s
hot_standby_feedback = on
wal_receiver_timeout = 60s
synchronous_commit = off #当从节点宕机时off模式 主节点不受影响,on模式 主节点将不能提交事务。
su - pg96 切换用户
psql -h 127.0.0.1 -p 2000 -U postgres postgres 登录数据库
create role replica login replication encrypted password ‘replica‘; 创建用户
配置密码文件
cd /home/pg96
vi .pgpass
数据库IP:数据库端口号:replication:replica:replica
172.16.0.186:2000:replication:replica:replica
172.16.0.187:2000:replication:replica:replica
172.16.0.188:2000:replication:replica:replica
chmod 400 .pgpass
配置主从切换文件
cd $PGDATA
cp /opt/pgsql963/share/recovery.conf.sample recovery.done
vi recovery.done 添加如下内容
standby_mode = ‘on‘
recovery_target_timeline = ‘latest‘
primary_conninfo = ‘host=172.16.0.186 port=2000 user=replica password=replica‘
trigger_file = ‘/tmp/trigger_file‘
配置open-ssl实现 fips140-2加密标准
cd $PGDATA
openssl req -new -text -out server.req
hytera1993
hytera1993
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
openssl req -x509 -in server.req -text -key server.key -out server.crt
chmod og-rwx server.key
vi postgresql.conf
新增内容
ssl=on
重启数据库
pg_ctl -m f stop
pg_ctl start
***************************************************************************************************************************
http://www.postgres.cn/docs/9.6/ssl-tcp.html
用 SSL 进行安全的 TCP/IP 连接
PostgreSQL有一个对使用SSL连接加密客户端/服务器通讯的本地支持,它可以增加安全性。这个特性要求在客户端和服务器端都安装OpenSSL并且在编译PostgreSQL的时候打开这个支持(见第 16 章)。
当SSL支持被编译在PostgreSQL中时,可以通过将postgresql.conf中的 ssl设置为on让PostgreSQL服务器带着SSL支持被启动。 服务器在同一个 TCP 端口监听普通连接和SSL连接,并且将与任何正在连接的客户端协商是否使用SSL。默认情况下,这是客户端的选项,关于如何设置服务器来要求某些或者所有连接使用SSL请见第 20.1 节。
PostgreSQL读取系统范围的OpenSSL配置文件。默认情况下,这个文件名为openssl.cnf并且被放置在openssl version -d所报告的目录中。通过设置环境变量OPENSSL_CONF指定你想要的配置文件名可以覆盖此默认配置。
OpenSSL支持范围广泛的密码和认证算法。而在OpenSSL配置文件可以指定一个密码列表, 你可以通过在postgresql.conf中修改ssl_ciphers来指定数据库服务器使用的专用密码。
注意: 使用NULL-SHA或NULL-MD5可以得到身份验证但没有加密开销。不过,中间人能够读取和传递客户端和服务器之间的通信。此外,加密开销相比身份认证的开销是最小的。出于这些原因,我们建议不要使用 NULL 密码。
要SSL模式中启动服务器,包含服务器证书和私钥的文件必须存在。默认情况下,这些文件应该分别被命名为server.crt和server.key并且被放在服务器的数据目录中,但是可以通过配置参数ssl_cert_file和ssl_key_file指定其他名称和位置。
在 Unix 系统上,server.key上的权限必须不允许所有人或组的任何访问,通过命令chmod 0600 server.key可以做到。或者,该文件可以由 root 所拥有并且具有组读访问(也就是0640权限)。这种设置适用于由操作系统管理证书和密钥文件的安装。用于运行PostgreSQL服务器的用户应该被作为能够访问那些证书和密钥文件的组成员。
如果私钥被一个密码保护着,服务器将提示要求这个密码,并且在它被输入前不会启动。
在有些情况下,服务器证书可能由一个"中间" 证书颁发机构签名,而不是直接由客户端信任的证书颁发 机构直接签名。要使用这样的证书,请追加该签发权的证书到server.crt文件,然后追加其父签发权的证书,以此类推一直到一个被客户端所信任的"根"或"中间"颁发机构,即由一个位于客户端root.crt文件中的证书签发。
18.9.1. 使用客户端证书
要求客户端提供受信任的证书,把你信任的证书颁发机构(CA)的证书放置在数据目录的文件root.crt中。并且修改postgresql.conf中的参数ssl_ca_file为root.crt,还要把认证选项clientcert=1加入到pg_hba.conf文件中合适的hostssl行上。然后将在 SSL 连接启动时从客户端请求该证书(一段对于如何在客户端设置证书的描述请见第 32.18 节)。服务器将验证客户端的证书是由受信任的证书颁发机构之一签名。
如果中间CA出现在root.crt中,该文件必须也包含到它们的根CA的证书链。如果参数ssl_crl_file被设置,证书撤销列表(CRL)项也要被检查(显示 SSL 证书用法的图标见http://h71000.www7.hp.com/doc/83final/ba554_90007/ch04s02.html)。
clientcert认证选项适用于所有的认证方法,但仅适用于pg_hba.conf中用hostssl指定的行。 当clientcert没有指定或设置为 0时,如果配置了 CA 文件,服务器将仍然会根据它验证任何提交的客户端证书 — 但是它将不会坚持要求出示一个客户端证书。
请注意服务器的root.crt列出了顶级的 CA,它们对客户端证书的签名被认为是可信的。 原则上不需要列出签名服务器证书的 CA,然而在大多数情况下,这些 CA 对于客户端证书也是可信的。
如果你在设置客户端证书,你可能希望用cert认证方法,这样证书控制用户认证以及提供连接安全。详见第 20.3.9 节(在使用cert认证方法时,没有必要显式地指定clientcert=1)。
18.9.2. SSL 服务器文件用法
表 18-2总结了与服务器上 SSL 配置有关的文件(显示的文件名是默认的或者是经典名称。本地配置的名称可能会不同)。
表 18-2. SSL 服务器文件用法
文件 内容 效果
ssl_cert_file ($PGDATA/server.crt) 服务器证书 发送给客户端来说明服务器的身份
ssl_key_file ($PGDATA/server.key) 服务器私钥 证明服务器证书是其所有者发送的,并不说明证书所有者是值得信任的
ssl_ca_file ($PGDATA/root.crt) 可信的证书颁发机构 检查客户端证书是由一个可信的证书颁发机构签名的
ssl_crl_file ($PGDATA/root.crl) 被证书授权机构撤销的证书 客户端证书不能出现在这个列表上
文件server.key、server.crt、root.crt和root.crl(或者被配置的其他名字)只在服务器启动期间被检查,所以要使对它们的修改生效,你必须重启服务器。
18.9.3. 创建自签名的证书
要为服务器创建一个快速的自签名的证书,可以使用下面的OpenSSL命令:
openssl req -new -text -out server.req
填充那些openssl要求的信息。确保把本地主机名当做"Common Name"输入;挑战密码可以留空。 该程序将生成一个用口令保护的密钥,它不会接受小于四字符的口令。要移去密钥(如果你想自动启动服务器就必须这样),运行下面的命令:
openssl rsa -in privkey.pem -out server.key
rm privkey.pem
输入旧口令解锁现有密钥。然后:
openssl req -x509 -in server.req -text -key server.key -out server.crt
将一个证书变成自签名的证书并复制密钥和证书到服务器将要查找它们的地方。最后执行:
chmod og-rwx server.key
如果文件的权限比这个更自由,服务器将拒绝该文件。要了解更多关于如何创建你的服务器私钥和证书的细节, 请参考OpenSSL文档。
自签名的证书可以被用于测试,但由证书颁发机构(CA)(要么是全局CA中的一个或者一个本地 CA)签名的证书应该被用在生产中,这样客户端可以验证服务器的身份。如果对于组织来说所有的客户端都是本地的,建议使用本地CA。
***************************************************************************************************************************
----------------------------------------------------------------------------------------------------------------------------
级联从节点配置
su - pg96
pg_ctl stop -m fast 关闭备数据库
cd /home/pg96
配置密码文件
vi .pgpass
本节点上级节点IP:本节点上级节点端口:replication:replica:replica
chmod 400 .pgpass
备节点和主节点同步。
su - pg93
cd ~
rm -rf pg_root
pg_basebackup -F p -D $PGDATA -h 本节点上级节点IP -p 本节点上级节点端口 -U replica
配置备库配置文件
cd $PGDATA
vi recovery.conf或者cp recovery.done recovery.conf
修改一下内容
primary_conninfo = ‘host=本节点上级节点IP port=本节点上级节点端口 user=replica password=replica‘
启动备数据库 pg_ctl start
检验双机热备配置情况
su - pg93
psql -h 数据库IP -p 数据库端口 -U postgres postgres
select * from pg_stat_replication; 查询主从节点状态
---------------------------------------------------------------------------------------------------------------------------------
配置pg96用户 使用sudo命令
su - root
chmod u+w /etc/sudoers
vi /etc/sudoers
pg96 ALL=(ALL) ALL
%pg96 ALL=(ALL) ALL
pg96 ALL=(ALL) NOPASSWD: ALL
%pg96 ALL=(ALL) NOPASSWD: ALL
---------------------------------------------------------------------------------------------------------------------------------
pgpool-ii集群中间件安装
注:集群代理程序和主数据库节点安装在一台机器上。
su - root
mkdir -p /opt/pgpool365 创建pgpool安装目录
cd /opt/soft_bak/
上传 pgpool-II-3.6.5.tar.gz
tar zxvf pgpool-II-3.6.5.tar.gz
cd pgpool-II-3.6.5/
./configure -prefix=/opt/
pgpool365 -with-pgsql=path -with-pgsql=/opt/pgsql963
make
make install
---------------------------------------------------------------------------------------------------------------------------------
以下操作分别在主节点和备节点同时执行:
su - root
cd /root/.ssh
rm -rf *
root用户配置两台数据库服务器之间的信任关系
su - root
ssh-keygen
ssh-copy-id [email protected]备节点IP 主节点执行
ssh-copy-id [email protected]主节点IP 备节点执行
---------------------------------------------------------------------------------------------------------------------------------
以下操作分别在主节点和备节点同时执行:
su - pg96
cd /home/pg96/.ssh/
rm -rf *
pg96配置两台数据库服务器之间的信任关系
su - pg96
ssh-keygen
ssh-copy-id [email protected]备节点IP 主节点执行
ssh-copy-id [email protected]主节点IP 备节点执行
yes
pg96用户密码
chown pg96 /home/pg96/.ssh/
chown pg96 /home/pg96/.ssh/*
chmod 600 /home/pg96/.ssh/*
chmod 700 /home/pg96/.ssh/
ssh 授信IP地址 测试是否可以免密码登录
配置pgpool-ii代理的归属权限
su - root
chown -R pg96:pg96 /opt/pgpool365
mkdir /var/run/pgpool
cd /var/run/pgpool
vi pgpool.pid 添加内容123456
chown -R pg96:pg96 /var/run/pgpool
复制pgpool代理,配置文件
su - pg96
cd /opt/pgpool365/etc/
cp pcp.conf.sample pcp.conf
cp pgpool.conf.sample-stream pgpool.conf
cp pool_hba.conf.sample pool_hba.conf
编辑vi pool_hba.conf文件,添加如下内容:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
配置pgpool管理密码
cd /opt/pgpool365/bin
pg_md5 cuipeng #复制md5值
cd /opt/pgpool365/etc
vi pcp.conf
postgres:4da80f53678a7a6e837c3e5cdd60477d (pg_md5 cuipeng 生成的密码)
登录主节点 执行
psql -h 主数据库IP -p 主数据库端口 -U postgres postgres
create role srcheck nosuperuser login encrypted password ‘SRCHECK‘;
digoal=# select rolname,rolpassword from pg_authid;
rolname | rolpassword
----------+-------------------------------------
postgres | md53175bce1d3201d16594cebf9d7eb3f9d
digoal | md5462f71c79368ccf422f8a773ef40074d
srcheck | md5662c10f61b27a9ab38ce69157186b25f
添加,pgpool连接数据库的用户和密码
cd /opt/pgpool/etc
vi pool_passwd
postgres:md59555230865286916a9015b1d070a74c7 (从上一步查询中获取)
配置pgpool主配置文件
参考pgpool.conf样例
特别说明
load_balance_mode = on
ignore_leading_white_space = on
database_redirect_preference_list = ‘postgres:standby,postgres:1,postgres:2‘
这里必须这么配!才能实现负载均衡和读写分离功能
postgres:standby,postgres:1,postgres:2
postgres根据实际系统所用数据库名填写
standby 查询select都会被分发到备节点上,不会被发送到主节点上
postgres:1,postgres:2 1和2是配置节点时候配置项上的1或者2 可以有多个
postgres:standby这里如果standby配置成primary的话全部select都会发送到主节点,将无法提供读负载均衡
backend_hostname1 = ‘主库ip‘
backend_port1 = 主库端口
backend_weight1 = 1
backend_data_directory0 = ‘数据库PGDATA路径‘
backend_flag1 = ‘ALLOW_TO_FAILOVER‘
backend_hostname2 = ‘备库ip‘
backend_port2 = 备库端口
backend_weight2 = 1
backend_data_directory2 = ‘数据库PGDATA路径‘
backend_flag2 = ‘ALLOW_TO_FAILOVER‘
注:pgpool的读负载均衡是会话session一级的,一个会话连接pgpool后该会话发出的select查询会被分配到一个备节点上,另一个会话连接后也同样发出的查询select被发到另一个备节点上执行,而DML操作都发到主节点上操作,主从节点数据同步通过流复制实现,
如果写负载大的时候可以通过postgres_fdw扩展postgresql数据分片,使每个数据库存储一部分数据。主节点只负责DML操作的请求转发。
--------------------------------------------------------------------------------------------------------------------------------------
登录集群
su - pg96
psql -h 127.0.0.1 -p 9999 -U postgres postgres
cuipeng 密码
pool_status, 获取配置
pool_nodes, 获取节点信息
pool_processes, 获取pgPool-II 进程信息
pool_pools, 获取pgPool-II 所有的连接池信息
pool_version, 获取pgPool_II 版本信息
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay
0 | 172.16.0.186 | 2000 | up | 0.333333 | primary | 20 | true | 0
select_cnt该节点分配到查询任务的次数
------------------------------------------------------------------------------------------------------------------------------------
http://francs3.blog.163.com/blog/static/4057672720149285445881/
http://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html
pgpool-ii代理集群配置
每个节点都配置
vi /etc/hots
172.16.0.186 pgrouter1
172.16.0.187 pgrouter2
172.16.0.188 pgrouter3
vi pgpool.conf
具体配置信息参考
pgpool.conf示例配置文件,pgpool-ii 一主两备
su - root
chmod u+s /sbin/ifconfig
chmod u+s /usr/sbin/
su - root
cd ~
vi .bash_profile
export PATH=/opt/pgpool365/bin:$PATH:.
source .bash_profile
在root用户下启动pgpool,否则 添加/删除虚拟IP命令无效
pgpool -nd
添加/删除虚拟IP测试命令
ip addr add 172.16.0.185/24 dev eno16777728 label eno16777728:0
ip addr del 172.16.0.185/24 dev eno16777728
-------------------------------------------------------------------------------------------------------------------------------------
安装OS缓存插件
每个节点都执行
su - root
cd /opt/soft_bak
tar -zxvf pgfincore-1.0.gz
cd pgfincore-b2b53de
export PATH=/opt/pgsql963/bin:$PATH
which pg_config
gmake clean
gmake
gmake install
登录主数据库
psql -h 127.0.0.1 -p 2000 -U postgres postgres
create extension pgfincore
df pgfad*
create table user_info(id int primary key, info text, crt_time timestamp);
insert into user_info select generate_series(1,500000), md5(random()::text), clock_timestamp();
select pg_total_relation_size(‘user_info‘);
select pg_total_relation_size(‘user_info‘)/1024/1024 MB
pgbench测试脚本
vi test.sql
set id random(1,1000000)
select * from user_info where id=:id;
pgbench -M prepared -n -r -f test.sql -c 16 -j 4 -T 10 postgres
select pgfadvise_willneed(‘user_info‘::regclass);
select pgfadvise_willneed(‘user_info_pkey‘::regclass);
-------------------------------------------------------------------------------------------------------------------------------------
配置故障自动切换
每个节点 都需要配置
su - root
cd /opt/pgsql963/bin
rz failover_stream.sh
chmod 755 failover_stream.sh
su - pg96
cd /opt/pgpool365/etc/
vi pgpool.conf
failover_command = ‘/opt/pgsql963/bin/failover_stream.sh %d %H /tmp/trigger_file‘
psql -h 172.16.0.185 -p 9999 -U postgres postgres
pool_status, 获取配置
pool_nodes, 获取节点信息
pool_processes, 获取pgPool-II 进程信息
pool_pools, 获取pgPool-II 所有的连接池信息
pool_version, 获取pgPool_II 版本信息
-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------
http://softlab.sdut.edu.cn/blog/subaochen/2013/08/postgresql-9-1%E7%9A%84failover%E9%85%8D%E7%BD%AE%E5%8F%8A%E5%85%B6%E7%AE%A1%E7%90%86/
故障恢复
1.修改数据库
su - pg96
cd ~
rm -rf pg_root
pg_basebackup -F p -D $PGDATA -h 本节点上级节点IP -p 本节点上级节点端口 -U replica
cd /home/pg96/pg_root
mv recovery.done recovery.conf
vi recovery.conf 修改为上级节点IP地址
su - root
rm -f /tmp/trigger_file
su - pg96
pg_ctl start
故障恢复步骤
a.恢复故障主节点
b.重新配置数据节点间的主备关系,恢复最初的主备关系
c.重新将之前失败的主节点提升为主节点
2.拉起down状态节点,登录当前主pgpool所在的linux服务器
节点编号 用show pool_nodes查询
pcp_attach_node -d -U [数据库账号] -h [主pgpool地址] -p 9898 -n [节点编号]
例子
pcp_attach_node -d -U postgres -h 172.16.0.185 -p 9898 -n 0 加入集群
pcp_promote_node -d -U postgres -h 172.16.0.185 -p 9898 -n 0 提升为主节点
根据新的主备关系修改
需要修改每个节点中pgpool.conf配置文件
修改每个节点中的 failover_stream.sh文件
并删除/tmp/trigger_file每个节点中的这个文件
有一些所有 PCP 命令都会用到的参数。它们大部分都是用于认证,其他则用于细节模式和调试消息等。
例如) $ pcp_node_count -h localhost -p 9898 -u postgres -w -d -v
-h hostname, --host=hostname
服务运行的主机名。如果以反斜杠开始,则被当做 Unix 域套接字的目录使用。
-p port, --port=port
PCP 端口号(默认为 "9898")。
-u username, --username=username
用于 PCP 认证的用户名(默认为当前登录的操作系统用户名)。
-w, --no-password
不提示输入密码。如果 .pcppass 文件中没有提供密码,则连接失败。这个选项可以用于不方便输入密码的批处理任务以及脚本。
-W, --password
强制提示输入密码(默认自动发生)。
-d, --debug
启用调试消息。
-v, --verbose
启用详细信息输出。
-V, --version
打印命令的版本,然后退出。
-?, --help
显示命令行参数的帮助,然后退出。
-------------------------------------------------------------------------------------------------------------------------------------
开机自启动postgresql
-------------------------------------------------------------------------------------------------------------------------------------
开机自启动pgpool
-------------------------------------------------------------------------------------------------------------------------------------
**************有问题 需要继续研究******************************************************************************************************
配置pgpool运行日志打印位置
Centos7
查看 日志输出设备编号
vi /etc/rsyslog.conf
找到如下信息 确定输出设备编号
# Save boot messages also to boot.log
local7.* /var/log/boot.log
local7.* 为设备名
配置pgpool-ii
su - pg96
cd /opt/pgpool365/etc
vi pgpool.conf
# - Where to log -
log_destination = ‘syslog‘
# Where to log
# Valid values are combinations of stderr,
# and syslog. Default to stderr.
# - What to log -
log_line_prefix = ‘%t: pid %p: ‘ # printf-style string to output at beginning of each log line.
log_connections = off
# Log connections
log_hostname = off
# Hostname will be shown in ps status
# and in logs if connections are logged
log_statement = off
# Log all statements
log_per_node_statement = off
# Log all statements
# with node and backend informations
log_standby_delay = ‘if_over_threshold‘
# Log standby delay
# Valid values are combinations of always,
# if_over_threshold, none
# - Syslog specific -
syslog_facility = ‘LOCAL7‘ #这里改为上一步查到的设备编号
# Syslog local facility. Default to LOCAL0
syslog_ident = ‘pgpool‘
# Syslog program identification string
# Default to ‘pgpool‘
# - Debug -
log_error_verbosity = terse # terse, default, or verbose messages
client_min_messages = error # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# log
# notice
# warning
# error
log_min_messages = panic # values in order of decreasing detail:
# debug5
# debug4
# debug3
# debug2
# debug1
# info
# notice
# warning
# error
# log
# fatal
# panic
启动pgpool
su - root
pgpool -nd
查看日志 cat /var/log/boot.log
注:删除/var/log/boot.log这个文件后,需要重启service rsyslog stop 、service rsyslog start服务 否则日志信息将不在像该文件中打印。
---------------------------------------------------------------------------------------------------------------------------------------------------------------
以上是关于pgpool-ii 安装手册 基于Centos7.3的主要内容,如果未能解决你的问题,请参考以下文章
pgpool-ii4.1.2 高可用集群[主备切换]配置部分