一、PostgreSQL离线部署(单机部署)

1、准备

操作系统: CentOS 7 64位操作系统 安装程序:

  • postgresql11-libs-11.6-1PGDG.rhel7.x86_64.rpm
  • postgresql11-11.6-1PGDG.rhel7.x86_64.rpm
  • postgresql11-server-11.6-1PGDG.rhel7.x86_64.rpm
  • libicu-50.2-3.el7.x86_64.rpm(已安装请忽略)

程序版本:v11.6.1

注意:安装postgres需要root权限,但启动、重启操作postgres不能用root权限的用户!

将如上安装包通过FTP、SFTP等方式(自行选择)导入到目标机器的 /sourcecode/soft/postgresql_pkg目录下,如果该目录不存在则创建该目录。
执行如下命令,创建目录:

  1. > mkdir -p /sourcecode/soft/postgresql_pkg
  2. > cd /sourcecode/soft/postgresql_pkg

该路径为本教程起始路径。

2、安装

1)检查环境

首先检查系统是否安装了libicu-50.2-3.el7.x86_64.rpm ,这个是CentOS7系统专用的版本。
执行如下命令,检查libicu是否已经安装:

# 检查libicu是否已经安装
> rpm -qa | grep libicu
# 如果什么都没返回或者返回的列表中不包含 libicu-50.2-3.el7.x86_64 则需要执行如下命令进行安装
> rpm -ivh libicu-50.2-3.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:libicu-50.2-3.el7                ################################# [100%]

然后在安装PostgreSQL之前需要检查当前的系统是否已经安装了PostgreSQL(此处以rpm安装为例,其他方式自行处理)。
执行如下命令,检查PostgreSQL是否已经安装:

# 检查PostgreSQL 是否已经安装
> rpm -qa | grep postgres
# 检查PostgreSQL 安装位置
> rpm -qal | grep postgres

如果发现已经安装了其他版本的PostgreSQL数据库,那么可以根据需要进行卸载处理。
执行如下命令,卸载已经安装的PostgreSQL:

# 结合上面的检查PostgreSQL是否已经安装的执行命令,rpm -qa | grep postgres 的结果进行卸载。
> rpm -qa | grep postgres
postgresql11-server-11.4-1PGDG.rhel7.x86_64
postgresql11-11.4-1PGDG.rhel7.x86_64
postgresql11-libs-11.4-1PGDG.rhel7.x86_64
# 此处以PostgreSQL11.4位例,如果返回上面的内容则代表已经安装了PostgreSQL11.4版本,需要卸载处理
# 需要注意,在卸载过程中请按照如下顺序进行卸载,否则会报错并且卸载失败
> rpm -e postgresql11-server-11.4-1PGDG.rhel7.x86_64
> rpm -e postgresql11-11.4-1PGDG.rhel7.x86_64
> rpm -e postgresql11-libs-11.4-1PGDG.rhel7.x86_64

2)程序安装

(1)创建用户

需要注意的是 PostgreSQL是禁止使用超级管理员来运行服务启动命令的,所以我们需要创建一个账号来进行后续的PostgreSQL的安装。
我们创建一个用户组(组名为postgres),向刚创建的用户组中添加一个用户账号(用户名为:postgres),并给该用户创建密码。
执行命令:

> groupadd postgres
> useradd -g postgres postgres
> passwd postgres
# 输入两次密码

(2)安装

如果严格安装上面来处理,那么你当前的路径就应该是 /sourcecode/soft/postgresql_pkg 下,那么准备通过上传好的rpm安装包进行程序安装。
执行如下命令,安装PostgreSQL11.6:

# 通过rpm -ivh命令安装PostgreSQL的安装包,此处的安装顺序是有要求的,请按照如下顺序进行安装。
> rpm -ivh postgresql11-libs-11.6-1PGDG.rhel7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:postgresql11-libs-11.6-1PGDG.rhel################################# [100%]
> rpm -ivh postgresql11-11.6-1PGDG.rhel7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:postgresql11-11.6-1PGDG.rhel7    ################################# [100%]
> rpm -ivh postgresql11-server-11.6-1PGDG.rhel7.x86_64.rpm
准备中...                          ################################# [100%]
正在升级/安装...
   1:postgresql11-server-11.6-1PGDG.rh################################# [100%]

在安装时如果报错

> rpm -ivh postgresql11-libs-11.6-1PGDG.rhel7.x86_64.rpm
warning: postgresql11-libs-11.6-1PGDG.rhel7.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID 442df0f8: NOKEY
error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)

提示问题权限不足,切换为root用户才可进行安装
> sudu root
Password: 
查询当前用户
> whoami
root

如果在安装过程中遇到依赖问题,则可以在网上自行下载依赖包进行安装解决依赖问题。

(3)初始化

将PostgreSQL安装好之后,如果是初始化安装就需要进行PostgrepSQL数据库的初始化操作。如果是升级安装(以前已经初始化过数据库并且在适应)则不需要记性此步骤操作。
执行如下命令,进行PostgreSQL数据库初始化:

# 执行初始化命令进行PostgreSQL数据库初始化
>  /usr/pgsql-11/bin/postgresql-11-setup initdb
Initializing database ... OK
# 如果初始化过程中提示 Data directory is not empty! 则表示,以前已经初始化过PostgreSQL数据库
# 如果是升级PostgreSQL数据库版本而不需要重置原有的数据,则忽略此步骤。
# 如果希望不保存原有数据,可以清空数据库则进行如下操作。
# 需要注意的是,下面的命令属于危险操作,请慎重操作。
> rm -rf /var/lib/pgsql/11/data/*
> /usr/pgsql-11/bin/postgresql-11-setup initdb

(4)配置

完成PostgreSQL的安装之后,需要对PostgreSQL的访问权限等进行配置。
注意:重新初始化以后需重新配置。
执行如下命令,编辑PostgreSQL访问权限:

# 配置文件都保存在PostgreSQL数据库初始化时使用的路径 /var/lib/pgsql/11/data 下
> vim /var/lib/pgsql/11/data/pg_hba.conf
# 在打开的文件中最下方加入如下内容
# 加入后格式自行对齐,非强迫症患者可以不用管。
host all all 0.0.0.0/0 trust

注意:CentOS 使用vim 指令,根据环境不同可使用 vi
执行如下命令,编辑PostgreSQL的端口、访问权限等信息:

# 配置PostgreSQL的端口号、监听地址等配置信息
> vim /var/lib/pgsql/11/data/postgresql.conf
# 在打开的文件中添加如下配置
listen_addresses = '*'
unix_socket_directories = '.'
port = 5432

(5)防火墙配置

检查当前系统是否开启了防火墙,如果开启了防火墙则需要打开PostgreSQL的端口。
执行如下命令,检查并设置防火墙:

# 查看当前防火墙是否打开
> firewall-cmd --stat
# 如果防火墙正在运行则执行如下命令,否则可以不用执行
> firewall-cmd --zone=public --add-port=5432/tcp --permanent
> firewall-cmd --reload
# 查看已开放的端口
> firewall-cmd --list-ports

(6)启动

执行如下命令,设置开机自启和启动服务:

# 设置PostgreSQL11开机自启
> systemctl enable postgresql-11
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.
# 启动PostgreSQL11启动
> systemctl start postgresql-11
# 如果有需要重启服务执行
> systemctl restart postgresql-11

(7)PostgreSQL数据配置

需要使用PostgreSQL时需要切换到postgres账户,在postgres账户下进行PostgreSQL数据库操作。
执行如下命令,切换postgres账户并进行账户和数据库操作:

# 将账户从root切换到postgres账户
> su - postgres
# 开启PostgreSQL的命令行, -h 后面是PostgreSQL所在服务器的IP地址
> psql -h 192.168.0.1
# 进入到PostgreSQL命令行中,进行命令操作
postgres=# ALTER USER postgres WITH encrypted PASSWORD 'postgres';
postgres=# ALTER ROLE postgres SUPERUSER;
postgres=# quit
# 退出PostgreSQL后,如果需要退回到root账户下,则执行退出命令
> exit

到此PostgreSQL离线安装完成。

二、PostgreSQL主从(流复制)部署

1、准备

  • 部署PostgreSQL主从需要先安装PostgreSQL数据库,详见目录1.1、PostgreSQL离线部署(单机部署)。
  • 此处注意,只需要安装好服务即可。初始化数据库部分暂时不用做,如果从库已经进行了initdb操作了则需要删除data目录。

2、安装

1)主库配置

(1)初始化&启动

按照《PostgreSQL离线部署(单机部署)》章节安装好PostgreSQL后,对主库的数据库进行初始化并启动。
执行如下命令,初始化数据库并启动PostgreSQL服务:

# 主库初始化数据库,如果已经执行过初始化操作,则不需要进行此步骤
> /usr/pgsql-11/bin/postgresql-11-setup initdb
# 初始化数据库结束后,直接启动服务
> systemctl start postgresql-11

(2)创建同步账号

主库启动之后,进入postgres系统账户,进入PostgreSQL命令行创建用于同步的账号进行主从同步使用。
执行如下命令,创建用于数据同步的账号:

# 将系统账号从root切换到postgres账户
> su - postgres
# 切换完账户之后,进入PostgreSQL命令行,注意 -h 后面是需要登录的IP地址。缺失可能报错。
> psql -h 192.168.0.1
postgres=# create role repl login replication encrypted password '123456';
CREATE ROLE
# 创建结束之后,退出PostgreSQL命令行。并切换回root账户
postgres=# \q
> exit

(3)配置访问控制

配置从库能够访问主库的控制权限。如果是多台从库则配置多个。
执行如下命令,修改主库配置文件:

# 打开PostgreSQL控制访问权限的配置文件
> vim /var/lib/pgsql/11/data/pg_hba.conf
#只需要台添加下面两行,repl是用来做备份的用户。后面的192.168.63.0/24是该网段内从库的的IP地址
host    replication     repl            192.168.63.0/24         md5
host    all             repl            192.168.63.0/24         trust

(4)配置主库的主从配置

执行如下命令,修改主库配置文件:

# 打开PostgreSQL数据库的配置文件,进行主从配置
> vim /var/lib/pgsql/11/data/postgresql.conf
# 在配置文件中找到如下配置项,并进行修改。在文件非INSERT状态下,输入'/需要搜索的文本'进行搜索
# 要监听的IP地址
listen_addresses = '*'  
# 服务端口号(重启后生效)
port = 5432
# 最大连接数(重启后生效)
max_connections = 512
# 分片缓存,最小128KB
shared_buffers = 128MB 
# 动态分片内存类型:posix(共享内存)
dynamic_shared_memory_type = posix
# 预写日志系统级别:hot_standby(热备)
wal_level = hot_standby
# 是否打开存档模式
archive_mode = on
# 用于归档日志文件的命令
archive_command = 'cp %p /var/lib/pgsql/11/data/pg_archive/%f'
# 最大预写日志系统发送者个数
max_wal_senders = 6 
# 预写日志系统日志分段大小,默认每个16MB,如果为0则禁用分段
wal_keep_segments = 10240
# 预写日志系统发送超时时间,单位:毫秒。0位禁用
wal_sender_timeout = 60s
# 写入日志文件的目录
log_directory = 'log'

(5)创建存放归档日志的目录&进行权限变更

执行如下命令,创建 postgresql.conf 配置文件内归档日志文件命令项中的路径&修改权限:

# 创建/var/lib/pgsql/11/data/pg_archive目录。
> mkdir /var/lib/pgsql/11/data/pg_archive
# 给系统用户postgres分配操作 /var/lib/pgsql/11/data 目录的权限
> chown -R postgres.postgres /var/lib/pgsql/11/data

(6)重启PostgreSQL服务

执行如下命令,重新启动PostgreSQL服务:

# 重启服务
> systemctl restart postgresql-11

2)从库配置

(1)初始化

从库安装完成后,不进行初始化操作。如果已经进行了初始化操作,则需要删除data目录。
从库的data目录不需要自己进行初始化生成,而是直接从主库拷贝过来。
执行如下命令,将data目录从主库拷贝过来:

# 把主节点所有的数据文件都会拷贝过来,需要输入的口令为主库创建的repl账户的密码
> pg_basebackup -h 192.168.63.134 -U repl -D /var/lib/pgsql/11/data/ -X stream -P
口令:(输入密码)
25312/25312 kB (100%), 1/1 表空间
# 执行结束后,查看data目录下是否已经从主库拷贝数据过来
> ls /var/lib/pgsql/11/data
backup_label.old  global      pg_commit_ts  pg_ident.conf  pg_notify    pg_snapshots  pg_subtrans  PG_VERSION  postgresql.auto.conf  postmaster.pid
base              log         pg_dynshmem   pg_logical     pg_replslot  pg_stat       pg_tblspc    pg_wal      postgresql.conf       recovery.conf
current_logfiles  pg_archive  pg_hba.conf   pg_multixact   pg_serial    pg_stat_tmp   pg_twophase  pg_xact     postmaster.opts

(2)配置从库的主从配置

执行如下命令,进行从库配置:

# 编辑从库的配置文件
> vim /var/lib/pgsql/11/data/postgresql.conf
# 要监听的IP地址
listen_addresses = '*'  
# 服务端口号(重启后生效)
port = 5432
# 最大连接数(重启后生效)
max_connections = 1000
# 分片缓存,最小128KB
shared_buffers = 128MB 
# 动态分片内存类型:posix(共享内存)
dynamic_shared_memory_type = posix
# 预写日志系统级别:replica(复制)
wal_level = replica
# 是否打开存档模式
archive_mode = on
# 用于归档日志文件的命令
archive_command = 'cp %p /var/lib/pgsql/11/data/pg_archive/%f'
# 最大预写日志系统发送者个数
max_wal_senders = 6 
# 预写日志系统日志分段大小,默认每个16MB,如果为0则禁用分段
wal_keep_segments = 10240
# 预写日志系统发送超时时间,单位:毫秒。0位禁用
wal_sender_timeout = 60s
# 热备是否在恢复数据期间准许查询
hot_standby = on
# 最大待机流延迟,取消查询之前的最大延迟时间
max_standby_streaming_delay = 30s
# 预写日志系统接受者状态间隔
wal_receiver_status_interval = 10s
# 热备反馈
hot_standby_feedback = on
# 写入日志文件的目录
log_directory = 'log'

(3)给从库的归档日志目录赋权给postgres账户

由于存库的data目录是从主库远程拷贝过来的,所以从库中也会存在存放归档日志目录 pg_archive ,但是在从库系统中没有将该目录赋权给postgres用户。如果不进行授权,则会导致从库无法正常启动。
执行如下命令,进行赋权操作:

# 给系统用户postgres分配操作 /var/lib/pgsql/11/data 目录的权限
> chown -R postgres.postgres /var/lib/pgsql/11/data

(4)创建恢复文件

创建恢复文件recovery.conf,用于恢复与主库的链接和恢复数据同步。
执行如下命令,拷贝恢复文件模板到执行目录并进行配置:

# 拷贝恢复配置文件模板到执行目录,并重命名
> cp /usr/pgsql-11/share/recovery.conf.sample /var/lib/pgsql/11/data/recovery.conf
# 修改恢复配置文件
> vim /var/lib/pgsql/11/data/recovery.conf
#同步到最新数据
ecovery_target_timeline = 'latest'
#指明从库身份
standby_mode = on
trigger_file = 'failover.now'
# #连接到主库信息,host为主库的IP地址,port为主库端口,账户密码为主库创建的用于同步的账密
primary_conninfo = 'host=192.168.63.134 port=5432 user=repl password=123456'

(5)启动从库PostgreSQL服务

执行如下命令,启动从库PostgreSQL服务:

# 启动从库服务
> systemctl start postgresql-11

(6)验证是否已经成功启动主从

到主库中,进入PostgreSQL命令号中,执行命令查看从库IP。
执行如下命令,验证主从是否配置成功:

> su - postgres
> psql -h 192.168.0.1
postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr   | sync_state 
----------------+------------
 192.168.0.2 | async

3)PostgreSQL主从配置注意事项

  • PostgreSQL流复制默认是异步的。如果主服务器崩溃,则某些已被提交的事务可能还没有被复制到后备服务器,这会导致数据丢失。数据的丢失量与故障转移时的复制延迟成比例。
  • 同步复制能够保证一个事务的所有修改都能被传送到一台或者多台同步后备服务器。这扩大了由一次事务提交所提供的标准持久化级别。在计算机科学理论中这种保护级别被称为 2-safe 复制。而当synchronous_commit被设置为remote_write时,则是 group-1-safe (group-safe 和 1-safe)。
  • 在请求同步复制时,一个写事务的每次提交将一直等待,直到收到一个确认表明该提交在主服务器和后备服务器上都已经被写入到磁盘上的预写式日志中。数据会被丢失的唯一可能性是主服务器和后备服务器在同一时间都崩溃。这可以提供更高级别的持久性,尽管只有系统管理员要关系两台服务器的放置和管理。等待确认提高了用户对于修改不会丢失的信心,但是同时也不必要地增加了对请求事务的响应时间。最小等待时间是在主服务器和后备服务器之间的来回时间。
  • 只读事务和事务回滚不需要等待后备服务器的回复。子事务提交也不需要等待后备服务器的响应,只有顶层提交才需要等待。长时间运行的动作(如数据载入或索引构建)不会等待最后的提交消息。所有两阶段提交动作要求提交等待,包括预备和提交。
  • 同步后备可以是物理复制后备或者是逻辑复制订阅者。它还可以是任何其他物理或者逻辑WAL复制流的消费者,它懂得如何发送恰当的反馈消息。除内建的物理和逻辑复制系统之外,还包括pg_receivewalpg_recvlogical之类的特殊程序,以及一些第三方复制系统和定制程序。同步复制支持的细节请查看相应的文档。