3 min read

Kylin v10 源码安装Postgres-13

Kylin v10 源码安装Postgres-13

背景

...

环境

  • OS: Kylin v10 SP2/SP3
  • PostgreSQL: 13.12
  • Platform: Amd64/Arm64

安装步骤

1、下载二进制包

# export version=13.12
# cd /usr/local/src
# wget https://ftp.postgresql.org/pub/source/v${version}/postgresql-${version}.tar.bz2

2、解压

# tar axvf postgresql-${version}.tar.bz2

3、安装依赖组件

# yum install readline-devel zlib-devel

4、创建用户

# groupadd -g 8848 postgres
# useradd -u 8848 -g postgres postgres
# passwd postgres

5、软件编译安装

# cd postgresql-${version}
#  ./configure --prefix=/usr/local/postgresql-${version} --with-pgport=5432
# make -j $(nproc --all)
# make install

//安装contrib 模块(可选)
# cd contrib && make && make install

# cd /usr/local/ && ln -svf postgresql-${version} postgresql

6、创建数据目录并分配权限

# install -d /data/pgsql/LOG /data/pgsql/DATA
# chown -R postgres:postgres /data/pgsql/LOG \
                             /data/pgsql/DATA \
                             /usr/local/postgresql-${version}
# chmod -R 0700 /data/pgsql/

7、初始化数据

# su - postgres
$ /usr/local/postgresql/bin/initdb -D /data/pgsql/DATA/

8、添加环境变量

  • 单用户
$ vim .bashrc
...
# Postgresql
export LD_LIBRARY_PATH=/usr/local/postgresql/lib:$LD_LIBRARY_PATH
export PATH=/usr/local/postgresql/bin/:$PATH
  • 全局
# cat > /etc/profile.d/postgresql.sh<<EOF
export LD_LIBRARY_PATH=/usr/local/postgresql/lib:\$LD_LIBRARY_PATH
export PATH=/usr/local/postgresql/bin/:\$PATH
EOF

9、创建systemd 服务文件

cat >/etc/systemd/system/postgresql.service<<EOF
[Unit]
Description=PostgreSQL database server
After=network.target

[Service]
Type=forking
User=postgres
Group=postgres
LimitNOFILE=1024000
Environment=PGSTARTTIMEOUT=270
Environment=PGLOG=/data/pgsql/LOG/startup.log
Environment=PGDATA=/data/pgsql/DATA
ExecStart=/usr/local/postgresql/bin/pg_ctl start -w -D \$PGDATA -l \$PGLOG
ExecStop=/usr/local/postgresql/bin/pg_ctl stop -m fast -w -D \$PGDATA
ExecReload=/usr/local/postgresql/bin/pg_ctl reload -D \$PGDATA
TimeoutSec=300

[Install]
WantedBy=multi-user.target
EOF

10、基本配置

# vim /data/pgsql/DATA/postgresql.conf
listen_addresses = '*'
port = 5432
max_connections = 8848
shared_buffers = 4096MB
effective_cache_size = 8GB

# vim pg_hba.conf
host    all             all             0.0.0.0/0               scram-sha-256
host    replication     all             ...                     trust

11、服务启动

# systemctl enable postgresql.service --now

12、使用psql 命令测试

$ psql
psql (13.12)
Type "help" for help.

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(3 rows)

流复制配置

1、创建复制专属账号 repl_user

# su - postgres
$ createuser --replication -P repl_user

2、配置ACL

# vim pg_hba.conf
...
host    replication     repl_user        从节点IP            scram-sha-256
...

// 使用以下方法使其生效
# su - postgres
$ psql
> SELECT pg_reload_conf()

3、登陆到从节点,执行以下命令

$ pg_basebackup -R -h 主节点IP -U repl_user -D /data/pgsql/data -P
提示:如若数据过大,可以加上-c fast参数 。

4、完成后启动服务器即可

# systemctl enable postgresql --now

5、使用以下方法来验证主从状态

$ psql -c "select usename, application_name, client_addr, state, sync_priority, sync_state from pg_stat_replication;"
提示:上述命令在主节点中运行。

备节点独立

某种原因,需要将数据集群中的备节点独立出来。

1、确认当前节点集群角色

postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
------------------
t
(1 row)
提示: 返回 t,说明该节点为从节点!

2、 从集群中独立出来
使用pg_ctl promote 工具向 PostgreSQL 的主进程(postmaster)发送 SIGUSR1 信号,触发从节点的提升操作,使其从恢复模式切换到读写模式,成为主节点:

$ pg_ctl promote -D /data/pgsql/DATA
waiting for server to promote.... done
server promoted


3、再次校验角色是否切换成功

再次运行 SELECT pg_is_in_recovery();

postgres=# SELECT pg_is_in_recovery();
pg_is_in_recovery
------------------
f
(1 row)
提示: 若返回 f,则表示提升成功,当前节点已为主节点。