pgsql高可用配置文档
<h4>1. postgresql主从配置</h4>
<p>可参考carl的文档或者博客 <a href="https://www.cnblogs.com/sunshine-long/p/9059695.html">https://www.cnblogs.com/sunshine-long/p/9059695.html</a></p>
<h5>注意的点:</h5>
<ul>
<li>主备节点切换后,恢复挂掉的节点时需要修改postgresql.conf文件中的max_connections,要保证从节点的最大链接大于主的。</li>
<li>主→recovery.done,备→recovery.conf(参考文档中描述)</li>
<li>数据库 data文件夹权限为700,做初始备份最好不自己创建,由pg_basebackup命令执行自动创建。也可修改权限
<pre><code>1、修改 tmp 目录所属用户为 root,用户组为 root
chown -R root:root /tmp1
2、修改 tmp 目录为可写权限
chmod -R 777 /tmp</code></pre></li>
<li>判断主从关系的命令(在postgres用户下执行su- postgres):select pg_is_in_recovery(); --主库是false 备库是true</li>
</ul>
<h4>2.pgpool的安装配置</h4>
<ul>
<li>参考的博客(下面的配置没写清楚的可以看下博客):
<pre><code>https://blog.csdn.net/yaoqiancuo3276/article/details/80983201
https://my.oschina.net/Suregogo/blog/552765
https://www.jianshu.com/p/ef183d0a9213
http://www.pgpool.net/docs/pgpool-II-3.2.1/tutorial-zh_cn.html#start-shutdown</code></pre></li>
</ul>
<h5>- 介绍</h5>
<p><code>pgpool 主从模式中,pgpool对从节点没有限制,可以为1-127个,也可以没有从节点</code></p>
<p>(下面的操作最好在root用户下执行)</p>
<h5>服务器安装pgpool-Ⅱ</h5>
<ul>
<li>下载解压tar xf pgpool-II-3.7.3.tar.gz</li>
<li>编译检查到指定目录 /opt/pgpool-3</li>
</ul>
<p><code>./configure --prefix=/opt/pgpool-3</code></p>
<ul>
<li>
<p>编译安装
<code>make && make install</code></p>
</li>
<li>配置全局环境变量 export PATH=/opt/pgpool-3/bin:$PATH,重启
<pre><code>listen_addresses = '*'
backend_hostname0 = 'node1'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/home/ha/pgdb/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'node2'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/home/ha/pgdb/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
pid_file_name = '/home/ha/pgpool/pgpool.pid'
logdir = '/home/ha/pgpool/log'
health_check_period = 1
health_check_user = 'ha'
health_check_password = 'ha'
failover_command = '/home/ha/pgdb/fail.sh %H'
recovery_user = 'ha'
recovery_password = 'ha'</code></pre>
<p>pgpool如果不配置高可用的话,不用配置虚拟ip:delegate_IP和watchDog相关配置</p></li>
<li>创建上述配置的 PID目录和日志 目录、script目录
<pre><code>mkdir -p /opt/pgpool-3/run/pgpool
mkdir -p /opt/pgpool-3/script
mkdir -p /opt/pgpool-3/log/pgpool</code></pre></li>
<li>配置pgpool-Ⅱ pcp.conf 文件,该文件用于配置pcp命令管理用户认证文件
<pre><code>pg_md5 123456
e10adc3949ba59abbe56e057f20f883e
写入到配置文件: vim pcp.conf
postgres:e10adc3949ba59abbe56e057f20f883e</code></pre></li>
<li>配置pool_passwd文件,默认不存在,可通过以下命令自动生成,该文件配置哪些用户可以访问 pgpool
<pre><code>pg_md5 -p -m -u postgres pool_passwd
password: #此处密码为123456
tail -3 pool_passwd
postgres:md5a3556571e93b0d20722ba62be61e8c2d</code></pre></li>
<li>配置pgpool-Ⅱ 认证配置文件 pool_hba.conf,类似于 PostgreSQL pg_hba.conf 文件
<pre><code># vim pool_hba.conf
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 md5 # 此处trust修改为md5
host all all 0.0.0.0/0 md5
host all all ::1/128 trust</code></pre>
<p>上述本地配置trust 改为md5,防止访问本地pgpool-Ⅱ MD5 验证出错</p></li>
<li>启动 pgpool-Ⅱ(-D参数为忽略pgpool_status,不加会默认读取之前的启动状态)
<pre><code>pgpool -n -d > pgpool.log 2>&1 &</code></pre></li>
<li>停止pgpool服务
<pre><code>pgpool -m fast stop</code></pre></li>
<li>连接pgpool, 查看数据库状态(-h;如果配了虚拟IP,则为虚拟ip,否则为主机ip)
<pre><code>psql -h 10.10.56.87 -p 9999 -U postgres</code></pre></li>
<li>创建16服务器自动切换 failover.sh脚本,分配 755 权限
<pre><code>new_master=$1
/usr/bin/ssh -t $new_master "su - postgres -c '/usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data promote -m fast'"
exit 0;</code></pre>
<p>PS:pg_ctl promote命令为切换主备数据库的另一种方式,在9.1之前一直用的是trigger_file,这里建议用promote -m fast的方式。</p></li>
<li>配置服务器间互信(很重要)
<pre><code>ssh-keygen -t rsa
cat id_rsa.pub >> authorized_keys</code></pre></li>
<li>在主备切换时,修复节点并重启后,由于primary数据发生变化,或修复的节点数据发生变化再按照流复制模式加入集群,很可能报时间线不同步错误,解决方法:
<pre><code>1.停掉需要做同步的节点pg服务:pg_ctl stop
2.同步master节点上时间线
cd /usr/lib/postgresql/10/bin
./pg_rewind --target-pgdata=/var/lib/postgresql/10/main --source-server='host=192.168.1.15 port=5433 user=postgres dbname=cashbox password=postgres'
3 修改pg_hba.conf与 recovery.done文件
#pg_hba.conf与 recovery.done都是同步master上来的,要改成slave自己的
[postgres@slave ] cd $PGDATA
[postgres@slave data]$ mv recovery.done recovery.conf
[postgres@slave data]$ vi pg_hba.conf
#slave改成master(相当于slave的流复制对端)
host replication repuser master md5
[postgres@slave data]$ vi recovery.conf
#slave改成master(相当于slave的流复制对端)
primary_conninfo = 'host=master port=5432 user=repuser password=repuser'
4 重启pg服务
pg_ctl start
5 重新加入集群
#注意slave的node_id是1,所以-n 1
[postgres@slave data]$ pcp_attach_node -d -U postgres -h vip -p 9898 -n 1
6 查看集群节点状态
[postgres@slave data]$ psql -h vip -p 9999
Password:
psql (10beta1)
Type "help" for help.
postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay
---------+----------+------+--------+-----------+---------+------------+-------------------+-------------------
0 | master | 5432 | up | 0.500000 | primary | 0 | true | 0
1 | slave | 5432 | up | 0.500000 | standby | 0 | false | 0
(2 rows)</code></pre>
<p>常用的一些命令:</p>
<pre><code>启动pgsql:su - postgres -c "/usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data start"
停止pgsql:su - postgres -c "/usr/pgsql-11/bin/pg_ctl stop"
赋予权限:chown -R postgres:postgres /var/run/pgpool/*
pgpool启动后连接psql: psql -h 192.168.1.15 -p 9999 -U postgres
查看pgsql节点及状态:show pool_nodes;
修改postgres用户密码:ALTER USER postgres WITH PASSWORD 'postgres';
查看主备情况:select client_addr,application_name,sync_state from pg_stat_replication;
pgpool的安装目录:/opt/pgpool-3/</code></pre></li>
</ul>