• OpenEuler22.03安装PostgreSQL15.5并配置一主二从


    环境准备

    序号 IP 标识(hostname) CPU/内存配置 系统盘 数据盘
    1 192.168.8.190 pg01 8C+16G 80G 500G
    2 192.168.8.191 pg02 8C+16G 80G 500G
    3 192.168.8.192 pg03 8C+16G 80G 500G

    规划的文件夹目录(所有主机):

    ## 以下目录为本文规划的目录,可以提前创建,也可以跟着说明一步步创建。
    ## 可以根据各自情况自行规划,注意更改后替换后文里面对应的路径。
    # app目录为数据盘挂载目录,将所有程序和数据保存在该目录下
    /app
    # postgresql应用的安装目录
    /app/pg15
    # 保存解压后的应用源代码
    /app/source
    # 存储临时文件(如下载的应用压缩包)
    /app/temp-files
    #保存应用数据
    /app/appdata
    # postgresql15的数据目录 即是环境变量$PGDATA (建议用postgres用户创建或创建后给postgres授权)
    /app/appdata/pg15/data
    # postgresql15的日志 即是环境变量$PGLOG(建议用postgres用户创建或创建后给postgres授权)
    /app/appdata/pg15/logs

    系统和组件版本(所有主机):

    # 操作系统:
    OpenEuler:22.03 (LTS-SP2)
    # 数据库:
    postgresql:15.5

    系统环境状态(所有主机):

    # SeLinux(cat /etc/selinux/config)变更需重启系统
    SELINUX=permissive
    # Firewalld 防火墙保持开启状态(systemctl status/start/stop/restart firewalld)
    active

    更新系统并安装必备组件

    *(如无特殊说明代表所有主机

    # 查看系统版本
    [root@pg01 ~]$ cat /etc/os-release
    NAME="openEuler"
    VERSION="22.03 (LTS-SP2)"
    ID="openEuler"
    VERSION_ID="22.03"
    PRETTY_NAME="openEuler 22.03 (LTS-SP2)"
    ANSI_COLOR="0;31"
    # 更新系统
    [root@pg01 ~]$ dnf upgrade -y

    关于“dnf update” 和“dnf upgrade”的说明:

    update:更新源里的软件列表。一般指量的变化,侧重更新的意思,主要是为原有的东西增加新功能,或者对已有的部分做出更改等。更新数据源。

    upgrade:升级你系统里的软件。一般指质的变化,侧重升级的意思,是指从较低级版本升级到高级的版本,这种升级往往伴有新功能的增加,因此也有update的意思。

    1. 更新资源

      sudo dnf update

    2. 软件更新升级,包括升级语言包等

      sudo dnf upgrade

    #安装缺失组件,OpenEuler默认最小化安装
    #不同系统安装镜像默认安装的基础组件可能不一样,根据情况安装(gcc、make有的镜像安装时默认安装,有的镜像则没有默认安装)
    [root@pg01 ~]$ dnf install gcc make tar readline-devel zlib-devel

    挂载数据盘

    #查看磁盘情况
    [root@pg01 ~]$ fdisk -l

    #给“/dev/vdb分区”
    [root@pg01 ~]$ fdisk /dev/vdb

    输入指令如下:

    # 再次查看分区情况
    [root@pg01 ~]$ fdisk -l
    # 显示结果已创建vdb1分区
    Device Boot Start End Sectors Size Id Type
    /dev/vdb1 2048 1048575999 1048573952 500G 83 Linux
    # 格式化分区
    [root@pg01 ~]$ mkfs.ext4 /dev/vdb1
    # 根目录下创建data挂载目录
    [root@pg01 ~]$ mkdir /app
    # 挂载/vdb1分区到/app
    [root@pg01 ~]$ mount /dev/vdb1 /app
    # 查看挂载情况
    [root@pg01 ~]$ df -lh
    # 将挂载添加到启动项,否则挂载在重启后失效
    [root@pg01 ~]$ vi /etc/fstab
    # 末尾添加一行
    /dev/vdb1 /app ext4 defaults 0 0

    保存关闭fstab文件,数据盘挂载完毕。

    PostgreSQL安装

    下载PostgreSQL 15.5

    PostgreSQL官方下载地址:PostgreSQL: File Browser

    #下载PostgreSQL15.5版本
    [root@pg01 ~]$ cd /app/temp-files/
    [root@pg01 temp-files]$ wget https://ftp.postgresql.org/pub/source/v15.5/postgresql-15.5.tar.gz

    编译安装

    #解压源码包
    [root@pg01 temp-files]$ tar -xzvf postgresql-15.5.tar.gz
    # 将解压后的文件夹(postgresql-15.5)移动到规划的source目录
    [root@pg01 temp-files]$ mv postgresql-15.5 ../source/
    # 切换到postgresql-14.10文件夹(系统当前在root用户根目录下)
    [root@pg01 temp-files]$ cd ../source/postgresql-15.5
    # 配置安装目录:
    [root@pg01 postgresql-15.5]$ ./configure --prefix=/app/pg15
    # 编译(耗时较长,耐心等待)
    [root@pg01 postgresql-15.5]$ make
    # 安装
    [root@pg01 postgresql-15.5]$ make install
    # 创建PostgreSQL数据存放目录(可根据实际情况自行配置数据存储路径)
    [root@pg01 postgresql-15.5]$ mkdir -p /app/appdata/pg15/data
    # 创建PostgreSQL日志存放目录(可根据实际情况自行配置日志存储路径)
    [root@pg01 postgresql-15.5]$ mkdir -p /app/appdata/pg15/logs
    # 创建postgres用户
    [root@pg01 postgresql-15.5]$ adduser postgres
    # 给postgres用户授权访问data和logs目录
    [root@pg01 postgresql-15.5]$ chown postgres /app/appdata/pg15/data
    [root@pg01 postgresql-15.5]$ chown postgres /app/appdata/pg15/logs
    # 切换到postgres用户(数据库操作不允许使用root用户)
    [root@pg01 postgresql-15.5]$ su - postgres
    # 创建日志文件【postgres用户】
    [postgres@pg01 ~]$ touch /app/appdata/pg15/logs/server.log
    # 初始化数据库【postgres用户】
    [postgres@pg01 ~]$ /app/pg15/bin/initdb -D /app/appdata/pg15/data
    # 启动数据库【postgres用户】
    [postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log start
    # 创建test数据库【postgres用户】
    [postgres@pg01 ~]$ /app/pg15/bin/createdb test ##创建test数据库
    # 连接test数据库【postgres用户】
    [postgres@pg01 ~]$ /app/pg15/bin/psql test ##连接test数据库

    配置PostgreSQL

    以下操作如无特殊说明,均采用postgres用户(指操作系统普通用户)操作命令。

    修改数据库密码

    # 我们从外部采用工具连接该数据库,需要知道数据库用户和对应的密码
    # 连接默认postgres数据库;
    [postgres@pg01 ~]$ /app/pg15/bin/psql
    # 修改数据库用户postgres的密码为postgres;
    postgres=# ALTER USER postgres WITH PASSWORD 'postgres';

    修改配置文件以支持远程连接

    需要修改的文件存放于postgresql的数据存储目录(/app/appdata/pg15/data)。

    # pg_hba.conf 文件
    # 待修改的行:
    host all all 127.0.0.1/32 trust
    # 修改为
    host all all 0.0.0.0/0 md5
    # postgresql.conf文件
    # 待修改的行
    #listen_addresses = 'localhost'
    #移除前方的“#”,并将localhost修改为*
    listen_addresses = '*'

    重启postgresql

    #重启postgresql
    [postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log restart

    操作系统配置

    防火墙放行5432端口

    root用户操作。

    # 配置防火墙放行5432端口
    sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent
    #防火墙重新加载配置文件
    sudo firewall-cmd --reload

    环境变量配置

    我们想在安装postgresql的服务器使用psql或其他提供的工具连接数据库,就必须输入psql的全路径“/app/pg15/bin/psql",环境变量配置完毕后,我们可以以postgres用户在任意位置输入psql来使用psql工具。

    postgres用户操作。

    # 切换用户目录
    [postgres@pg01 ~]$ cd ~
    # 编辑用户环境变量文件
    [postgres@pg01 ~]$ vi .bash_profile
    # 将下面两行代码添加文件末尾后保存退出
    PATH=/app/pg15/bin:$PATH
    export PATH
    # 使配置文件生效
    [postgres@pg01 ~]$ source .bash_profile
    # 此时postgres用户就可以直接输入psql调用了

    开机启动配置

    root用户操作。

    PostgreSQL的开机自启动配置模板在源码目录的“contrib/start-scripts”目录下,其中linux文件为linux环境下的开机自启动脚本模板,将其拷贝到“/etc/init.d”目录下,并改名为postgresql:

    # 切换至源码开机脚本模版目录
    cd postgresql-15.5/contrib/start-scripts/
    # 拷贝linux脚本拷贝至启动目录修改名称为pgsql
    cp linux /etc/init.d/pgsql
    # 编辑启动脚本
    vi /etc/init.d/pgsql
    # 在Selinux开启Enforcing的情况,开启仍然无法启动,我们需要修复pgsql文件的安全上下文
    # restorecon [选项】 文件或目录
    # -R:递归.当前目录和目录下所有的子文件同时恢复;
    # -V:把恢复过程显示到屏幕上;
    # 执行如下命令即可 (本文环境将selinux修改为宽容模式,不需要进行修复)
    # restorecon /etc/init.d/pgsql
    # 给启动脚本增加文件执行权限
    chmod a+x /etc/init.d/pgsql
    #添加至开机启动
    chkconfig --add /etc/init.d/pgsql

    “/etc/init.d/pgsql”需要编辑的内容如下:

    # 安装位置,根据实际情况修改
    prefix=/app/pg15
    # Postgresql数据目录,根据实际情况修改
    PGDATA="/app/appdata/pg15/data"
    # Who to run the postmaster as, usually "postgres". (NOT "root")
    # 将启动用户修改为实际用户,这里使用postgres,所以不变。
    PGUSER=postgres
    # Postgresql日志文件位置,根据实际情况修改
    PGLOG="/app/appdata/pg15/logs/server.log"

    重启验证即可。

    创建一主二从

    主库配置:

    # 创建同步账号 psql下执行:
    postgres=# CREATE ROLE replica login replication encrypted password 'replica';
    CREATE ROLE
    # 修改postgresql.conf文件,添加同步参数
    wal_level = replica
    max_wal_senders = 8
    wal_keep_size = 500
    wal_sender_timeout = 60s
    max_connections = 100
    # pg_hba.conf 文件增加备库访问控制
    # 文件末尾增加允许复制的从机
    host replication replica 192.168.8.191/32 md5
    host replication replica 192.168.8.192/32 md5
    # 重启主库服务
    [postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log restart
    # 从库验证是否可以连接主库
    # 返回输入密码即表示可访问
    [postgres@pg02 ~]$ psql -h 192.168.8.190 -U postgres
    Password for user postgres:

    从库配置[pg02/03主机配置相同]

    # 停掉从库
    [postgres@pg02 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log stop
    # 清空从库数据文件
    [postgres@pg02 ~]$ rm -rf /app/appdata/pg15/data/*
    [postgres@pg02 ~]$ ll /app/appdata/pg15/data
    total 0
    # 拉取主库文件
    [postgres@pg02 ~]$ pg_basebackup -h 192.168.8.80 -D /app/appdata/pg15/data -p 5432 -U replica -Fp -Xs -Pv -R --checkpoint=fast
    Password:
    pg_basebackup: initiating base backup, waiting for checkpoint to complete
    pg_basebackup: checkpoint completed
    pg_basebackup: write-ahead log start point: 0/D000028 on timeline 1
    pg_basebackup: starting background WAL receiver
    pg_basebackup: created temporary replication slot "pg_basebackup_17064"
    50729/50729 kB (100%), 1/1 tablespace
    pg_basebackup: write-ahead log end point: 0/D000100
    pg_basebackup: waiting for background process to finish streaming ...
    pg_basebackup: syncing data to disk ...
    pg_basebackup: base backup completed
    [postgres@dj data]$ ll /app/appdata/pg15/data
    total 128
    -rw-------. 1 postgres postgres 224 Jul 12 03:43 backup_label
    drwx------. 7 postgres postgres 4096 Jul 12 03:43 base
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 global
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_commit_ts
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_dynshmem
    -rw-------. 1 postgres postgres 4886 Jul 12 03:43 pg_hba.conf
    -rw-------. 1 postgres postgres 1636 Jul 12 03:43 pg_ident.conf
    drwx------. 4 postgres postgres 4096 Jul 12 03:43 pg_logical
    drwx------. 4 postgres postgres 4096 Jul 12 03:43 pg_multixact
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_notify
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_replslot
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_serial
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_snapshots
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_stat
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_stat_tmp
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_subtrans
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_tblspc
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_twophase
    -rw-------. 1 postgres postgres 3 Jul 12 03:43 PG_VERSION
    drwx------. 3 postgres postgres 4096 Jul 12 03:43 pg_wal
    drwx------. 5 postgres postgres 4096 Jul 12 03:43 pg_walminer
    drwx------. 2 postgres postgres 4096 Jul 12 03:43 pg_xact
    -rw-------. 1 postgres postgres 267 Jul 12 03:43 postgresql.auto.conf
    -rw-------. 1 postgres postgres 27115 Jul 12 03:43 postgresql.conf
    -rw-------. 1 postgres postgres 30 Jul 12 03:43 postmaster.opts.bak
    -rw-------. 1 postgres postgres 0 Jul 12 03:43 standby.signal

    修改postgresql.conf配置:

    # 从库postgresql.conf修改
    [postgres@pg02 ~]$ vi /app/appdata/pg15/data/postgresql.conf
    # 1.注释一下参数,即是在前面加#
    #wal_level = replica
    #max_wal_senders = 8
    #wal_keep_size = 500
    #wal_sender_timeout = 60s
    # 2.添加和修改一下参数
    primary_conninfo = 'host=192.168.8.80 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
    max_connections = 200 #大于主节点
    max_worker_processes = 20
    # 3.保存退出

    重新启动从库:

    # 启动从库
    [postgres@pg02 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log start

    主从同步验证

    将Pg02、Pg03主机都配置完成并启动postgresql后,在主库pg01上用postgres用户进入psql,输入如下查询sql验证同步状态:

    # 主库PSQL查询
    postgres=# select client_addr,usename,backend_start,application_name,sync_state,sync_priority FROM pg_stat_replication;
    client_addr | usename | backend_start | application_name | sync_state | sync_priority
    -----------------+---------+-------------------------------+------------------+------------+---------------
    192.168.8.191 | replica | 2023-12-22 18:52:32.45571+08 | walreceiver | async | 0
    192.168.8.192 | replica | 2023-12-22 19:04:32.92774+08 | walreceiver | async | 0
    # 测试创建删除数据库观察从库是否同步
    postgres=# create database test;
    postgres=# drop database test;
    # 在主库上创建、删除后可到从库上查看是否一致。psql 输入‘\l’可查看所有的数据库。
    postgres=# \l

    至此,Postgresql 15.5的安装和一主两从配置结束。

    开启归档模式

    主机pg01操作修改postgresql.conf文件

    #调整如下两个参数
    archive_mode='on'
    archive_command='test ! -f /app/appdata/pg15/archive/%f && cp %p /app/appdata/pg15/archive/%f'

    同步在主库(pg01)以及其他从他从库(pg02/pg03)创建归档目录:

    # 创建归档目录
    mkdir -p /app/appdata/pg15/archive
    # 给postgres用户授权
    chown -R postgres /app/appdata/pg15/archive

    然后重启主库pg服务即可。

    其他参考命令:

    # 查询归档参数SQL
    select * from pg_settings where name in ('wal_level','archive_mode','archive_command');
    # 查询归档文件状态
    select * from pg_stat_get_archiver();

    本文作者: Mr Liu
    本文链接: https://it-liupp.gitee.io/2023/12/23/openeuler-install-pgsql14/
    博客园链接:https://www.cnblogs.com/boyliupan/p/17935733.html
    版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!

  • 相关阅读:
    Python 通过adb传输文件到手机
    深入理解MyBatis一级缓存和二级缓存【超详细源码解析】
    数字全息干涉偏振相移实验经验总结
    SpingBoot:整合Mybatis-plus+Druid+mysql
    基于BP神经网络进行手写体识别(Matlab代码实现)
    【Go语言入门教程】Go语言简介
    eachers地图的配置
    【机器学习基础】机器学习的模型评估(评估方法及性能度量原理及主要公式)
    快速幂_first
    数据同步工具—sqoop 2.x
  • 原文地址:https://www.cnblogs.com/boyliupan/p/17935733.html