由于Redhat或CentOS等发行版本自带postgresql数据库版本为9.2,由于gitlab 9+版本以上需要 postgresq 9.6版本,因此本文档安装(postgresql-10.1)。PostgreSQL是一个功能强大,开源对象关系型数据库系统。
配置一主二从(master 192.168.117.129,slave 192.168.117.130,192.168.117.131)

在这三台机器上分别安装Postgresql

按照Postgresql部署文档在这三台机器上安装Postgresql

配置PostgreSQL Master节点

i)设置replication用户

1
2
3
4
5
6
su - postgres
cd /usr/local/pgsql/bin
./psql
CREATE ROLE repluser WITH REPLICATION PASSWORD 'postgres' LOGIN;
\q
exit

ii)停止postgresql服务

1
systemctl stop postgresql

iii)修改postgresql配置,内容如下

1
2
3
4
5
6
vim /usr/local/pgsql/data/postgresql.conf
wal_level = hot_standby
max_wal_senders = 5
wal_keep_segments = 32
archive_mode = on
archive_command = 'cp %p /usr/local/pgsql/archive/%f'

iv)创建归档目录

1
2
mkdir /usr/local/pgsql/archive
chown -R postgres:postgres /usr/local/pgsql/archive

v)允许replication连接数据库

1
vim /usr/local/pgsql/data/pg_hba.conf

添加如下内容:

1
2
3
host    replication     repluser        192.168.117.0/24        md5
host all repluser 192.168.117.0/24 trust
host all all 0.0.0.0/0 md5

vi)启动postgresql数据库服务

1
systemctl start postgresql

配置PostgreSQL Slave节点

i)停止postgresql数据库

1
systemctl stop postgresql

ii)清空数据目录

1
rm -rf /usr/local/pgsql/data/*

iii)初始化备分数据库

1
/usr/local/pgsql/bin/pg_basebackup -h 192.168.117.129 -D /usr/local/pgsql/data -P -U repluser -X stream

iv)修改配置

1
vim /usr/local/pgsql/data/postgresql.conf

修改项为:hot_standby = on
v)创建恢复配置

1
2
3
4
5
6
 cp /usr/local/pgsql/share/recovery.conf.sample /usr/local/pgsql/data/recovery.conf
vim /usr/local/pgsql/data/recovery.conf
standby_mode = 'on'
primary_conninfo = 'host=92.168.117.129 port=5432 user=repluser password=postgres'
trigger_file = '/usr/local/pgsql/trigger'
restore_command = 'cp /usr/local/pgsql/archive/%f %p'

vi)启动数据库

1
systemctl restart postgresql

若果用上述命令,不报错,但查不到postgresql的进程,则试着使用下述命令

1
service postgresql start

若出现下述问题
image

1
chown -R postgres:postgres /usr/local/pgsql/data/

重新执行即可查看到postgresql进程(ps:不知道为什么systemctl start postgresql和service postgresql start不能起到相同的效果)

测试

–主库查看

1
2
3
4
su - postgres
cd /usr/local/pgsql/bin
./psql
select client_addr,sync_state from pg_stat_replication;

image

1
postgres=# select * from pg_stat_replication;

image
–主库创建一个数据库

1
2
3
postgres=# create database test;
CREATE DATABASE
postgres=# \l // 查看当前所有数据库

image

–查看从库中是否已经同步

1
2
3
4
su - postgres
cd /usr/local/pgsql/bin
./psql
postgres=# \l

image

Linux 服务管理两种方式service和systemctl比较

i)service命令
service命令其实是去/etc/init.d目录下,去执行相关程序。其中脚本需要我们自己编写。
ii)systemctl命令
systemd是Linux系统最新的初始化系统(init),作用是提高系统的启动速度,尽可能启动较少的进程,尽可能更多进程并发启动。
systemd对应的进程管理命令是systemctl
1)systemctl命令兼容了service
即systemctl也会去/etc/init.d目录下,查看,执行相关程序
2)systemctl命令管理systemd的资源Unit
systemd的Unit放在目录/usr/lib/systemd/system(Centos)或/etc/systemd/system(Ubuntu)