通过repmgr实现PostgreSql主从数据同步

通过repmgr实现PostgreSql主从数据同步

  • 一、centos7 安装 postgresql
    • 1、下载安装 postgresql-14
    • 2、修改配置文件
      • 2.1设置监听地址和端口号
      • 2.2添加ipv4连接地址,设置MD5加密(需要输入密码)
      • 2.3重启postgresql-14服务
    • 3、修改postgres用户密码(postgres用户安装自动创建,默认无密码)
    • 4、关闭防火墙
  • 二、postgresql-14 主从流复制(使用Repmgr可忽略二)
    • 1、主库配置
      • 1.1、修改`主库`参数文件 `postgresql.conf ` (这里我们只修改一些必须的参数,非生产环境最优化的设置)
      • 1.2、在主库中创建一个用于复制的账号,用户名密码均为`repl`
      • 1.3、修改配置文件
      • 1.4、重启服务
    • 2、从库配置
      • 2.1、停止从库服务
      • 2.2、删除数据库主目录`data`
      • 2.3、使用pg_basebackup命令同步数据库
      • 2.4、重新为 postgres 用户授权,启动服务
  • 三、基于 Repmgr 的 PostgreSQL 集群配置
    • 1、Repmgr 安装前配置
      • 1.1、修改配置文件`/etc/hosts`,每台节点配置 ip 及别名的对应关系,添加映射关系
      • 1.2、在root用户下添加新建的角色权限
      • 1.3、每台节点中,在 root 用户下修改 postgres 用户的密码为 postgres
      • 1.4、配置ssh 免密登录,以 node1 节点为例
      • 1.5、开启 pubkey 验证
      • 1.6、修改存放密钥的文件夹的权限
      • 1.7、重新手动启动一个 ssh 服务
      • 1.8、切换 root 重新启动 ssh 服务,并测试是否可以远程无密连接
    • 2、安装 repmgr
      • 2.1、在每个节点执行 repmer 的安装,其版本应对应 pg 库的版本,依次执行下列语句
      • 2.2、每个节点添加repmgr环境变量
    • 3、主库配置(node1)
      • 3.1、修改配置文件`/var/lib/pgsql/14/data/postgresql.conf`,将下述属性进行配置
      • 3.2、配置数据库的连接,在末尾处新增
      • 3.3、对 repmgr 的配置文件进行设置:`/etc/repmgr/14/repmgr.conf`,在末尾处添加
      • 3.4、切换到 postgres 用户,新建 repmgr 用户以及 repmgr 数据库
      • 3.5、使用 postgres 用户连接数据库,修改 repmgr 用户的密码为 repmgr
      • 3.6、在 postgres 用户下执行主数据库节点的集群注册
    • 4、从库配置(node2/node3)
      • 4.1、从库若初始化,需要清空data文件,位置(`/var/lib/pgsql/14/data`)
      • 4.2、测试从库可以连接到主库,以 node2 为例
      • 4.3、修改 repmgr 配置文件:`/etc/repmgr/14/repmgr.conf`,在末尾处添加
      • 4.4、使用`--dry-run`参数尝试克隆服务器,并进行克隆
      • 4.5、对 node2 和 node3 进行集群注册
    • 5、启动守护进程 repmgrd

一、centos7 安装 postgresql

1、下载安装 postgresql-14

# Install the repository RPM:
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# Install PostgreSQL:
sudo yum install -y postgresql14-server

# Optionally initialize the database and enable automatic start:
sudo /usr/pgsql-14/bin/postgresql-14-setup initdb

2、修改配置文件

2.1设置监听地址和端口号

vim /var/lib/pgsql/14/data/postgresql.conf
listen_addresses = '*'        # what IP address(es) to listen on;
                    # comma-separated list of addresses;
                    # defaults to 'localhost'; use '*' for all
                    # (change requires restart)
port = 5432                # (change requires restart)

2.2添加ipv4连接地址,设置MD5加密(需要输入密码)

vim /var/lib/pgsql/14/data/pg_hba.conf
# IPv4 local connections:
host    all             all             127.0.0.1/32            scram-sha-256
host    all             all             0.0.0.0/0               md5

2.3重启postgresql-14服务

重启命令:systemctl restart postgresql-14
#下列了解不用操作
启动命令:systemctl start postgresql-14
停止命令:systemctl stop postgresql-14

3、修改postgres用户密码(postgres用户安装自动创建,默认无密码)

[root@localhost ~]# su - postgres
-bash-4.2$ psql
psql (14.5)
输入 "help" 来获取帮助信息.

postgres=# ALTER USER postgres ENCRYPTED PASSWORD 'postgres';
ALTER ROLE
postgres=# \q   #按ctrl+d即可退出(下同)
-bash-4.2$ logout
登出

4、关闭防火墙

#关闭防火墙
systemctl stop firewalld.service
#设置开机禁用
systemctl disable firewalld.service

至此postgresql安装完成,可以测试连接

二、postgresql-14 主从流复制(使用Repmgr可忽略二)

主库 从库1 从库2
192.20.48.146 192.20.48.147 192.20.48.148

1、主库配置

1.1、修改主库参数文件 postgresql.conf (这里我们只修改一些必须的参数,非生产环境最优化的设置)

vim /var/lib/pgsql/14/data/postgresql.conf
wal_level = replica            # minimal, replica, or logical
                               # (change requires restart)

1.2、在主库中创建一个用于复制的账号,用户名密码均为repl

[root@localhost ~]# su - postgres
上一次登录:一 4月 17 10:37:34 CST 2023pts/0 上
-bash-4.2$ psql
psql (14.5)
输入 "help" 来获取帮助信息.

postgres=# create role repl login replication encrypted password 'repl';
CREATE ROLE
postgres=# \q
-bash-4.2$ logout
登出

1.3、修改配置文件

vim /var/lib/pgsql/14/data/pg_hba.conf
#ip是两个从节点的ip
host    replication     repl            192.20.48.147/32        md5
host    replication     repl            192.20.48.148/32        md5

1.4、重启服务

systemctl restart postgresql-14

2、从库配置

2.1、停止从库服务

systemctl stop postgresql-14

2.2、删除数据库主目录data

[root@localhost ~]# cd /var/lib/pgsql/14
[root@localhost 14]# rm -rf data

2.3、使用pg_basebackup命令同步数据库

注意此处同步的ip是主库的ip

[root@localhost 14]# pg_basebackup -h 192.20.48.146 -p 5432 -U repl -R -F p -P -D data

参数说明:
选项    说明
-p    主库数据库端口
-U    流复制用户
-W    使用密码验证,要用replica的密码
-Fp   备份输出正常的数据库目录
-Xs   使用流复制的方式进行复制
-Pv   输出复制过程的详细信息
-R    为备库创建recovery.conf文件。但是pgsql 10以后的新版本的pgsql不需要这个文件了。
-D    指定创建的备库的数据库目录

2.4、重新为 postgres 用户授权,启动服务

[root@localhost 14]# chown -R  postgres:postgres /var/lib/pgsql/14/data
[root@localhost 14]# systemctl start postgresql-14

至此简单的主从流复制配置完成,可连接数据库进行操作进行检验,从库为只读库,可以在主库执行下列命令查询从库相关信息

select pid,state,client_addr,sync_priority,sync_state,sent_lsn,write_lsn from pg_stat_replication;

三、基于 Repmgr 的 PostgreSQL 集群配置

1、Repmgr 安装前配置

1.1、修改配置文件/etc/hosts,每台节点配置 ip 及别名的对应关系,添加映射关系

vim /etc/hosts
192.20.48.146 node1
192.20.48.147 node2
192.20.48.148 node3

1.2、在root用户下添加新建的角色权限

#切换到root用户下
su root
#输入visudo指令
visudo
#在文件中新增
postgres ALL=(ALL) NOPASSWD:ALL

1.3、每台节点中,在 root 用户下修改 postgres 用户的密码为 postgres

[root@node1 ~]# passwd postgres
更改用户 postgres 的密码 。
新的 密码:
无效的密码: 密码包含用户名在某些地方
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

1.4、配置ssh 免密登录,以 node1 节点为例

su postgres # 切换到 postgres 用户
ssh-keygen # 生成密钥-公钥对
ssh-copy-id node1 # 将公钥保存到 node1 节点
ssh-copy-id node2 # 将公钥保存到 node2 节点
ssh-copy-id node3 # 将公钥保存到 node3 节点

1.5、开启 pubkey 验证

修改 ssh 配置文件:etc/ssh/sshd_config

vim etc/ssh/sshd_config
#开启或修改为yes
PubkeyAuthentication yes

1.6、修改存放密钥的文件夹的权限

文件夹需归属于 postgres 用户,且 ssh 对文件夹权限有要求

chown -R postgres:postgres /var/lib/pgsql
chmod 700 /var/lib/pgsql/.ssh
chmod 600 /var/lib/pgsql/.ssh/authorized_keys

1.7、重新手动启动一个 ssh 服务

原因: .ssh 目录没有 ssh_home_t 标签,通过下列命令重置

restorecon -r -vv /var/lib/pgsql/.ssh

1.8、切换 root 重新启动 ssh 服务,并测试是否可以远程无密连接

systemctl restart sshd
#切换至 postgres 用户
su - postgres
#进行远程连接测试
ssh node1
ssh node2
ssh node3

2、安装 repmgr

2.1、在每个节点执行 repmer 的安装,其版本应对应 pg 库的版本,依次执行下列语句

curl https://dl.2ndquadrant.com/default/release/get/14/rpm | sudo bash
yum install repmgr14
yum install -y rsync

2.2、每个节点添加repmgr环境变量

 vim /etc/profile
 
 #最后一行添加
 export PATH=/usr/pgsql-14/bin:$PATH
 
 #重新加载配置文件
 source /etc/profile

3、主库配置(node1)

3.1、修改配置文件/var/lib/pgsql/14/data/postgresql.conf,将下述属性进行配置

vim /var/lib/pgsql/14/data/postgresql.conf
listen_addresses = '*'

max_wal_senders = 10

max_replication_slots = 10

wal_level = hot_standby

hot_standby = on

archive_mode = always

archive_command = '/bin/true'

shared_preload_libraries = 'repmgr'

3.2、配置数据库的连接,在末尾处新增

修改配置文件/var/lib/pgsql/14/data/pg_hba.conf

vim /var/lib/pgsql/14/data/pg_hba.conf
local   all             postgres                                peer
local   replication     repmgr                                  trust
host    replication     repmgr          127.0.0.1/32            trust
host    replication     repmgr          192.20.48.0/24          trust
local   repmgr          repmgr                                  trust
host    repmgr          repmgr          127.0.0.1/32            trust
host    repmgr          repmgr          192.20.48.0/24          trust
#重启数据库
systemctl restart postgresql-14

3.3、对 repmgr 的配置文件进行设置:/etc/repmgr/14/repmgr.conf,在末尾处添加

vim /etc/repmgr/14/repmgr.conf
node_id=1

node_name='node1'

conninfo='host=node1 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr'

data_directory='/var/lib/pgsql/14/data'

failover=automatic

promote_command='/usr/pgsql-14/bin/repmgr standby promote -f /etc/repmgr/14/repmgr.conf --log-to-file'

follow_command='/usr/pgsql-14/bin/repmgr standby follow -f /etc/repmgr/14/repmgr.conf --log-to-file --upstream-node-id=%n'

service_start_command  = 'sudo systemctl start postgresql-14'

service_stop_command    = 'sudo systemctl stop postgresql-14'

service_restart_command = 'sudo systemctl restart postgresql-14'

service_reload_command  = 'sudo systemctl reload postgresql-14'

repmgrd_pid_file='/tmp/repmgrd.pid'

log_file='/tmp/repmgrd.log'

priority=100

3.4、切换到 postgres 用户,新建 repmgr 用户以及 repmgr 数据库

su - postgers
createuser -s repmgr
createdb repmgr -O repmgr

3.5、使用 postgres 用户连接数据库,修改 repmgr 用户的密码为 repmgr

[root@localhost ~]# su - postgres
-bash-4.2$ psql
psql (14.5)
输入 "help" 来获取帮助信息.

postgres=# ALTER USER repmgr ENCRYPTED PASSWORD 'repmgr';
ALTER ROLE
postgres=# \q
-bash-4.2$ exit
登出

3.6、在 postgres 用户下执行主数据库节点的集群注册

su - postgres
#注册主节点
-bash-4.2$ repmgr primary register
#查看主节点
-bash-4.2$ repmgr cluster show

若未配置环境变量,需到对应文件夹下执行相关操作

-bash-4.2$ cd /usr/pgsql-14/bin/
-bash-4.2$ ./repmgr -f /etc/repmgr/14/repmgr.conf primary register

注册完成后主机配置结束,可以查看注册结果

-bash-4.2$ ./repmgr cluster show -f /etc/repmgr/14/repmgr.conf
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string
----+-------+---------+-----------+----------+----------+----------+----------+------------------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 1        | host=node1 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr

至此主节点注册完成

4、从库配置(node2/node3)

4.1、从库若初始化,需要清空data文件,位置(/var/lib/pgsql/14/data)

4.2、测试从库可以连接到主库,以 node2 为例

[root@node3 ~]# su - postgres
上一次登录:一 4月 17 11:37:48 CST 2023pts/0 上-bash-4.2$ psql 'host=node1 user=repmgr dbname=repmgr connect_timeout=2'
#密码为repmgr
用户 repmgr 的口令:
psql (14.5)
输入 "help" 来获取帮助信息.

repmgr=#

4.3、修改 repmgr 配置文件:/etc/repmgr/14/repmgr.conf,在末尾处添加

vim /etc/repmgr/14/repmgr.conf
node_id=3

node_name='node3'

conninfo='host=node3 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr'

data_directory='/var/lib/pgsql/14/data'

failover=automatic

promote_command='/usr/pgsql-14/bin/repmgr standby promote -f /etc/repmgr/14/repmgr.conf --log-to-file'

follow_command='/usr/pgsql-14/bin/repmgr standby follow -f /etc/repmgr/14/repmgr.conf --log-to-file --upstream-node-id=%n'

service_start_command  = 'sudo systemctl start postgresql-14'

service_stop_command    = 'sudo systemctl stop postgresql-14'

service_restart_command = 'sudo systemctl restart postgresql-14'

service_reload_command  = 'sudo systemctl reload postgresql-14'

repmgrd_pid_file='/tmp/repmgrd.pid'

log_file='/tmp/repmgrd.log'

priority=100

4.4、使用--dry-run参数尝试克隆服务器,并进行克隆

cd /usr/pgsql-14/bin/
./repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr/14/repmgr.conf standby clone --dry-run

报错信息提示未提供密码

-bash-4.2$ cd /usr/pgsql-14/bin/
-bash-4.2$ ./repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr/14/repmgr.conf standby clone --dry-run
NOTICE: destination directory "/var/lib/pgsql/14/data" provided
INFO: connecting to source node
DETAIL: connection string is: host=node1 user=repmgr dbname=repmgr
ERROR: connection to database failed
DETAIL:
connection to server at "node1" (192.20.48.146), port 5432 failed: fe_sendauth: no password supplied

解决方法:在对应的家目录下新建 .pgpass 文件配置密码

cd ~
touch .pgpass
vim ~/.pgpass

#在新建的文件中写入配置
#hostname:port:database:username:password
node1:5432:repmgr:repmgr:repmgr

#文件权限设置
chmod 0600 ~/.pgpass

#在 repmgr 配置文件中新增密码文件的路径配置
vim /etc/repmgr/14/repmgr.conf
passfile='/var/lib/pgsql/.pgpass'

重新进行尝试

cd /usr/pgsql-14/bin/
./repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr/14/repmgr.conf standby clone --dry-run

测试无异常报错,则可实际执行克隆操作

./repmgr -h node1 -U repmgr -d repmgr -f /etc/repmgr/14/repmgr.conf standby clone

4.5、对 node2 和 node3 进行集群注册

启动 pg 数据库服务

sudo systemctl start postgresql-14

以 standby 的身份注册集群

./repmgr -f /etc/repmgr/14/repmgr.conf standby register

分别按上述流程对 node2 和 node3 进行集群注册,注册成功后,检查集群状态

-bash-4.2$ repmgr cluster show
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                                     
----+-------+---------+-----------+----------+----------+----------+----------+------------------------------------------------------------------------
 1  | node1 | primary | * running |          | default  | 100      | 1        | host=node1 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr
 2  | node2 | standby |   running | node1    | default  | 100      | 1        | host=node2 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr
 3  | node3 | standby |   running | node1    | default  | 100      | 1        | host=node3 user=repmgr dbname=repmgr connect_timeout=2 password=repmgr

对主库进行数据库操作,查看到从库实现数据同步

5、启动守护进程 repmgrd

repmgrd 是一个守护进程,它主动监视复制集群中的服务器并支持以下任务:

  • 监控和记录复制集群信息
  • 故障检测、故障转移
  • 集群中事件的通知(需要自定义脚本接受通知)

分别在三个节点处启动守护进程 repmgrd

su - postgres
cd /usr/pgsql-14/bin/
./repmgrd -f /etc/repmgr/14/repmgr.conf

你可能感兴趣的:(postgresql,postgresql,数据库)