赞
踩
环境说明:
Linux系统:Ubuntu 22
主节点:192.168.56.100
从节点:192.168.56.102
ubuntu use the apt repository 官方文档地址:
https://www.postgresql.org/download/linux/ubuntu/
- # Create the file repository configuration:
- sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
-
- # Import the repository signing key:
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- # Update the package lists:
- sudo apt-get update
-
- # Install the latest version of PostgreSQL.
- # If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
- sudo apt-get -y install postgresql-12
注意:apt repository安装PG12后默认开机启动服务对应数据目录是/var/lib/postgresql/12/main,可以禁用服务systemctl disable postgresql,后续在启动pg服务时指定库文件目录pg_ctl start -D /库文件目录。也可以修改启动的service;
安装后PG的各文件目录:
配置文件路径: /etc/postgresql-common/createcluster.conf
bin目录:/usr/lib/postgresql/12/bin
systemd的服务软连接: /etc/systemd/system/multi-user.target.wants/postgresql.service → /lib/systemd/system/postgresql.service
数据目录: /var/lib/postgresql/12/main
日志文件: /var/log/postgresql/postgresql-12-main.log
数据库用户: postgres
查看安装目录:whereis postgresql
新建数据目录/data/pg12并在新建目录初始化库:
如需修改postgres 的linux账户密码或者数据库账户密码参考:
CSDNhttps://mp.csdn.net/mp_blog/creation/editor/134453141注:initdb,pg_ctl,psql需切到 postgres 账户执行。
- mkdir /data/pg12 #创建数据目录
- chown postgres:postgres /data/pg12 #修改目录owner
- su - postgres #切到postgres用户执行下面命令初始化库,启动数据库服务
- /usr/lib/postgresql/12/bin/initdb -D /data/pg12
- /usr/lib/postgresql/12/bin/pg_ctl -D /data/pg12 -l logfile start
-
- #使用psql命令连接postgres数据库,\l 查看实例上库列表如下图。(god为自建库名称)
- psql
启动主节点数据库服务,运行psql
在psql命令行中执行,注意用户名只能是小写字母:
CREATE USER replica REPLICATION LOGIN CONNECTION LIMIT 6 ENCRYPTED PASSWORD 'abc123';
修改保存后,select pg_reload_conf(); reload一下配置文件生效
注:方便后续主从切换可以将主节点IP也加进去
- #允许访问的IP白名单,0.0.0.0/0为不限制登录。生产可以根据需要网段设置。
- host all all 0.0.0.0/0 md5
-
- #设置流复制账户访问权限,主节点上配置的是从节点IP。
- #对应后续从节点上IP需要调整为主节点(后续测试主从切换时莫忘记从节点该文件需要调整IP)
- host replication replica 192.168.56.102/32 trust
- host replication replica 192.168.56.100/32 trust
- #PG12默认即为replica
- wal_level=replica
-
-
- #指定pg_wal目录中保存的历史的wal文件最小数量。防止主库生成WAL日志过快流复制还没发送到standby就被覆盖,一个WAL日志文件的大小是16M应适当调大。
- wal_keep_segments = 64
-
- hot_standby=on
-
- #默认只监听本机,* 为监听所有地址。
- listen_addresses = '*'
-
- # 为超级用户保留的连接数
- superuser_reserved_connections = 10
-
- #开启归档,默认为off。
- archive_mode = on
- #存在active_archive文件时才真正进行保存归档日志,不想保存时只需删除该文件。如此开关归档不需重启服务。
- #归档日志执行shell命令,可以按日期保存归档目录以及清理超期日志
- archive_command = 'test ! -f /data/archive_wals/active_archive || /bin/bash /data/archive_wals/pg_archivelog.sh %p %f'
上面归档archive_command调用的shell脚本:
- #!/bin/bash
-
- DATE=`date +%Y%m%d`
- DIR="/data/archive_wals/$DATE"
- BACK="/data/archive_wals/"`date -d '-2 day' +%Y%m%d`
- if [ -d "$BACK" ]; then
- rm -rf $BACK
- echo `date "+%F %T"`" success rm $BACK" > /data/archive_wals/sh.log
- fi
- (test -d $DIR || mkdir -p $DIR) && cp $1 $DIR/$2
开启归档等一些参数调整后需重启数据库服务
- su - postgres #切到postgres用户执行下面命令初始化库,重启数据库服务
- /usr/lib/postgresql/12/bin/pg_ctl -D /data/pg12 start
新建数据目录/data/pg12,不初始化库:
- mkdir /data/pg12 #创建数据目录
- chown postgres:postgres /data/pg12 #修改目录owner
在slave节点192.168.56.102,保证$PGDATA目录为空,否则pg_basebackup过程会报错pg_basebackup: directory “/XX” exists but is not empty
- #切到postgresq用户下执行
- /usr/lib/postgresql/12/bin/pg_basebackup -h192.168.56.100 -D/data/pg12 -U replica -v -P -R
- #启动前调整权限,否则可能报
- #waiting for server to start....2019-10-11 23:30:21.030 CST [6538] FATAL: data directory #"/data/pg12" has invalid permissions
- #2019-10-11 23:30:21.030 CST [6538] DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).
- chmod 0750 /data/pg12
-
- /usr/lib/postgresql/12/bin/pg_ctl start -D /data/pg12
select * from pg_stat_replication;
仅主节点有查询结果
client_addr:主备同步客户端IP地址
sync_state:有三种状态:sync(同步),async(异步),potential(现在是异步模式,有可能升级到同步模式)。注意:主备模式下,备库为只读
state:同步状态:startup(连接中)、catchup(同步中)、streaming(同步)
默认情况搭建的主备是异步模式(sync_state: async)。
备节点查看日志接收情况:
select * from pg_stat_wal_receiver;
仅备节点有查询结果。
在主节点新建库,并新建表后插入数据:
- --新建库
- create database cc;
- --切换到cc库
- use cc
- --创建表
- create table cc_test(id int not null,names varchar(200));
- --表内插入数据
- insert into cc_test(id,names)
- values (1,'cc'),(2,'bb');
登录从节点,确定上面新建库表同步到从节点。
- #从节点(102)登录pg命令行客户端
- psql
- #\l列出库列表
- \l
- #切换到cc库
- use cc;
- #查询表内数据
- select * from cc_test;
- #主节点执行,停止pg服务
- /usr/lib/postgresql/12/bin/pg_ctl stop -D /data/pg12
- #从节点切换到postgres账户执行
- su - postgres
-
- /usr/lib/postgresql/12/bin/pg_ctl promote
waiting for server to promote.... done
server promoted
执行完成后,/data/pg12目录下standby.signal文件被清除。
- su - postgres
- /usr/lib/postgresql/12/bin/pg_ctl stop -D /data/pg12
原主节点的postgresql.auto.conf 没有自动生成 primary_conninfo ,需要手动设置。
- su - postgres
- psql
- alter system set primary_conninfo ='host=192.168.56.102 port=5432 user=replica passowrd=abc123';
重启原主库:
- su postgres
- /usr/lib/postgresql/12/bin/pg_ctl start -D /data/pg12
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。