基础环境准备
yum本地源准备
从官方下载最新ISO库使用,推荐使用Everything,类别比较齐全。
CentOS-7-x86_64-Everything-2003.iso 阿里云镜像
需要注意的是,随着CentOS的版本迭代更新,可以到阿里云CentOS镜像总目录中取查看你感兴趣的版本
如果官方镜像下载过慢,也可考虑使用我的百*资源 ,提取码 tf51 。
下载完成后,可将iso文件拷贝到离线服务器中,例如存储在/opt位置,然后mount即可(等同于把光盘加载到光驱里)
# 创建一个用于挂载iso文件的文件夹,也可是挂载到一个其他的空文件夹上
mkdir /opt/iso
# 挂载iso文件
mount /opt/CCentOS-7-x86_64-Everything-2003.iso /opt/iso
挂载后,可能系统会警告read-only,不用关心,没有影响
接下来需要编辑一个yum repository的配置文件,指向本地yum仓库/opt/iso。例如,编辑文件/etc/yum.repos.d/local.repo,内容如下
[my-local-repository]
name=My Local Repository
baseurl=file:///opt/iso
gpgcheck=0
enabled=1
编辑完成后,以root用户执行以下命令,即可清除之前的yum索引,并新建基于本地Repository的库
yum clean all
yum makecache
注意,如果涉及到多台服务器安装,需要使用HTTP服务作为YUM私服的话,则需要安装createrepo库。可通过Nginx或者HTTPD作为HTTP服务提供者。 在本文中不是重点,不再赘述。
安装基础库
yum -y install zlib-devel readline-devel
创建postgres用户
以root用户执行以下命令
# 创建postgres用户
adduser postgres
# 给postgres用户设置密码
passwd postgres
PostgreSQL 12.2 编译安装
注意!!!以下编译安装的操作,都必须在postgres用户下进行,切换为postgres用户的方法如下
su - postgres
安装包下载
从官方下载PostgreSQL 12.2的压缩包。如果官方链接失效,可考虑从我的CSDN资源 PostgreSQL 12.2及校验下载
编译安装
下载完成后,将文件放在postgres的一个目录下,如/home/postgres/software中,则postgresql的路径为/home/postgres/software/postgresql-12.2.tar.gz,以下进行解压及编译预处理
# 切换为postgres用户
su - postgres
# 进入安装包所在文件夹
cd /home/postgres/software
# 解压安装包
tar xzvf postgresql-12.2.tar.gz
# 进入解压后的安装包
cd postgresql-12.2
# 进行编译检查
# 设置安装目录为/home/postgres/pg12
./configure --prefix=/home/postgres/pg12
注意,./configure步骤可能会出现错误,缺少包,则通过报错信息,在互联网上搜索缺少的包对应的包名,再用yum安装即可。 通常缺少的为*-devel形式的依赖包
./configure无误后,编译安装
make
make install
编译过程视机器性能有长短不同,如无报错信息,则安装完成。
环境变量配置
安装完成后,如果需要在任意环境下都能使用postgresql相关命令,则需要把$PGHOME/bin中的内容都加入PATH环境变量,编辑/etc/profile文件,如果只是在postgres用户下使用,则需要编辑/home/postgres/.bash_profile文件
export PGHOME=/home/postgres/pg12
export PATH=$PGHOME/bin:$PATH
# 如果需要设置一个单独的目录作为数据库目录,则需要明确指定PGDATA环境变量,且该文件夹的owner必须为postgres用户
# export PGDATA=/data/pgdata
若需要环境变量立即生效,则执行以下命令
source /etc/profile
source /home/postgres/.bash_profile
或者是退出当前SSH的Session,再重新登录即可
初始化数据库目录(单实例)
若配置好PG的bin目录为环境变量后,直接针对目标数据库执行以下命令(令数据库目录为/data/pgdata)
initdb -D /data/pgdata
若有调整WAL日志大小的需求(主要用于归档、主从配置的优化,一旦initdb初始化指定后,不可修改),则可以执行以下命令(非必要),–wal-segsize的单位为MB
initdb -D /data/pgdata --wal-segsize=128
若成功初始化以后,则需要编辑/data/pgdata/postgresql.conf文件调整数据库配置,关键配置如下
# 监听允许地址,安全要求不高的话,直接设置为*
listen_addresses = '*'
# 最大连接数
# 试机器性能和应用场景调整
max_connections = 500
# 服务端口,如有必要,可修改,默认为5432
port = 5432
# 共享区内存,调大以后,对于热点查询可以提升性能。 若服务器为独立的数据库服务器,建议这个值调整为系统的50%物理内存以上
shared_bufferes = 1024MB
编辑完成后,则可以启动数据库
pg_ctl start -D /data/pgdata -l postgresql.log
PostGIS 3.0.1编译安装
本部分内容大量参考了CentOS 7源码安装PostGIS(包含SFCGAL,PgRouting)
PostGIS和PostgreSQL的版本依赖矩阵详见UsersWikiPostgreSQLPostGIS
依赖包安装
依赖包下载
PostGIS依赖了大量的外部包,都需要编译安装,所需要的资源可以在PostGIS 3.0.1依赖包中下载,笔者已经确定版本无误,能够安装成功
或者,参考官方的PostGIS的依赖包版本关系,依次下载对应版本
GEOS编译安装
cd /root/software
tar xf geos-3.8.1.tar
cd geos-3.8.1
./configure
make && make install
PROJ编译安装
cd /root/software
tar xzf proj-6.2.1.tar.gz
cd proj-6.2.1
./configure
make && make install
执行./configure时,可能报错 No package ‘sqlite3’ found,执行yum -y install sqlite sqlite-devel即可
升级protobuf
cd /root/software
tar xzf protobuf-all-3.8.0.tar.gz
cd protobuf-3.8.0
./configure
make && make install
安装完成后,需要修改LD_LIBRARY_PATH和PKG_CONFIG_PATH环境变量,防止系统找不到新安装的protobuf。可编辑/etc/profile如下
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
正常情况下,/usr/local/lib/pkgconfig地址下应该有protobuf.pc文件,如果没有,则是安装异常。
安装protobuf-c
cd /root/software
tar xzf protobuf-c-1.3.2.tar.gz
cd protobuf-c-1.3.2
./configure
make && make install
安装成功后,执行命令protoc --version显示如下
libprotoc 3.8.0
安装json-c
cd /root/software
tar xzf json-c-json-c-0.13.1-20180305.tar.gz
cd json-c-json-c-0.13.1-20180305
./configure
make && make install
编译安装CMake(非必须,如果要装SFCGAL)
由于PostGIS对应的版本比较新,因此CentOS 7默认的CMake版本不足,需要编译安装新版本的CMake
CMake安装需要openssl相关库
yum -y install openssl openssl-devel
安装CMake
cd /root/software
tar xzf cmake-3.17.3.tar.gz
cd cmake-3.17.3
./bootstrap
gmake
make install
安装CGAL(非必须,如果要装SFCGAL)
CGAL存在一些系统依赖库要安装
yum -y install gmp-devel boost-devel mpfr-devel zlib-devel libxml2-devel
cd /root/software
unzip CGAL-4.14.3.zip
cd CGAL-4.14.3
mkdir build
cd build
cmake ..
make && make install
安装SFCGAL(非必须)
cd /root/software
tar xzf SFCGAL-1.3.7.tar.gc
cd SFCGAL-1.3.7
mkdir build
cd build
cmake ..
make && make install
安装完成后,需要配置软链接到libSFCGAL.so,防止后续gdal安装找不到
ln -s /usr/local/lib64/libSFCGAL.so /usr/local/lib/libSFCGAL.so
ln -s /usr/local/lib64/libSFCGAL.so.1 /usr/local/lib/libSFCGAL.so.1
安装GDAL
GDAL的安装,是整个安装步骤当中最慢的一步
cd /root/software
tar xzf gdal-3.0.4.tar.gc
cd gdal-3.0.4
./configure
make && make install
安装PostGIS
以下编译安装的操作,都必须在postgres用户下进行,切换为postgres用户的方法如下
su - postgres
PostGIS 3.0.1下载
PostGIS 3.0.1可以从官方渠道下载,也可以从笔者资源PostGIS 3.0.1及官方文档下载。
编译安装
令安装包资源路径为/home/postgres/software/postgis-3.0.1.tar.gz,执行操作如下
su - postgres
cd /home/postgres/software
tar xzf postgis-3.0.1.tar.gz
cd postgis-3.0.1
./configure
make && make install
测试PostGIS是否安装成功
连接本地PG库
psql -U postgres -h localhost -d postgres
postgres=# create database test;
CREATE DATABASE
postgres=# \c test;
You ar now conneted to database "test" as user "postgres"
postgres=# create extension postgis;
CREATE EXTENSION
如果操作结果如上述代码所示,则PostGIS安装正常
主从流复制配置
主从配置主要参考了博文 Postgresql12主从配置及切换。
需要注意的是,从PostgreSQL 12版本开始,不再使用recovery.conf的方式来配置主从流复制。使用postgresql.conf配置即可,且在从库数据目录中用standby.signal予以标识
具体步骤如下
主库IP为192.168.1.8,从库IP为192.168.1.9
主库修改配置
全部操作都以postgres用户进行
su - postgres
主库配置postgresql.conf信息
# 监听所有IP
listen_addresses = '*'
# 最大连接数,要少于从库的该值。 基础同步后修改从库配置即可
max_connections = 100
# 开启归档
archive_mode = on
# 归档时进行的操作。 高级使用场景里,可能需要对日志进行移动备份操作,若没有高级需求,简单命令即可
archive_command = '/bin/date'
# WAL级别设置
wal_level = replica
# 和WAL大小,共同决定备份的数量。
# initdb时默认WAL大小是16MB
# 注意这个WAL总的日志大小,如果过小,数据写入频繁,可能会导致主从同步失败
# 因为pg_basebackup结束之前,产生的数据量如果超过了WAL总日志大小,那么会导致主库的增量数据丢失,永远无法对齐主从库。
# 需要调大wal_keep_segments的量,重新pg_basebackup
wal_keep_segments = 16
wal_sender_timeout = 60s
主库设置完成后,需要重启PG服务才能使以上配置生效
# pg_ctl关闭数据库
pg_ctl stop -D /data/pgdata
# pg_ctl启动数据库
pg_ctl start -D /data/pgdata -l /var/log/postgresql.log
主库增加replica用户
任一用户名都可以,为了和主流博文一致,设置replica为流复制用户
CREATE ROLE replica login replication encrypted password 'replica';
主库增加replica信任访问(pg_hba.conf)
# 编辑$PGDATA/pg_hba.conf文件
# 如果是单一IP可用,掩码是32,例如192.168.1.9/32
# 如果是一个网段可用,掩码是24,例如192.168.1.0/24
host replication replica 192.168.1.9/32 trust
从库进行基础备份
以postgres用户操作
su - postgres
创建一个目录,postgres拥有权限
mkdir /data/pgdata
chown postgres:postgres /data/pgdata -R
启动基础备份
pg_basebackup -h 192.168.1.8 -p 5432 -U replica -Fp -Xs -Pv -D /data/pgdata
等待基础备份完成。 如果主库很大(例如上百GB),那么可能等待几个小时。
从库修改配置
从库基础备份完毕后,要进行若干操作。 先不要启动从库数据库
修改从库的postgresql.conf
listen_addresses = '*'
# 大于主节点连接数
max_connections = 100
primary_conninfo = 'host=192.168.1.8 port=5432 user=replica password=replica'
recovery_target_timeline = 'latest'
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
增加standby.signal文件
standby_mode = 'on'
从库设置完成后,需要启动PG服务,首次启动时间可能会很长,因为主从库需要对齐WAL日志记录的、在基础备份同步过程中主库增量的部分
# pg_ctl启动数据库
pg_ctl start -D /data/pgdata -l /var/log/postgresql.log
检查主从库同步状态
如果主从没有生效,主从库同步状态查不到任何信息
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
-------------+------------
192.168.1.9 | async
(1 row)
同时,验证也可以在主库上新建库表在从库里检查。从库启动以后,自动就是readonly状态,连接session中是只读无法修改的。