PostgreSQL 主备数据宕机恢复测试

主节点宕机数据,备库数据恢复
背 景

在从节点停止服务,然后往主库不断写入数据,然后把主机宕机掉,启动从库,把主库宕机期间的增量wal日志复制到从库的archive目录下, 执行恢复脚本,则会把主机宕机后的增量数据追加到数据库。

  • 环境
服务器角色
10.10.56.16master
10.10.56.18slave

- 配置16 master 的 pg_hba,conf 文件

host    all             all             10.10.56.0/0            md5
host    replication     all             10.10.56.0/0            trust
"pg_hba.conf" 96L, 4652C                                                  
  • 配置16 master的 postgresql.conf
listen_addresses = '*'
max_connections = 1000 
wal_level = logical 
archive_mode = on  
archive_command = '/bin/true' 
log_destination = 'csvlog'
logging_collector = on 
log_filename = 'postgresql-%Y-%m-%d.log' 
log_rotation_size = 20MB 
log_statement = 'mod'
log_replication_commands = on
deadlock_timeout = 100ms 
  • 配置18 slave,初始化数据库从master pg_basebackup
 /opt/pgsql-10/bin/pg_basebackup -h 10.10.56.16 -U repl -W -Fp -Pv -Xs -R -D /pgdata/10/poc/data/
  • 配置18的 recovery.conf ,从归档目录恢复数据
#standby_mode = 'on'
#primary_conninfo = 'user=repl password=123456 host=10.10.56.16 port=5432 sslmode=disable sslcompression=1 target_session_attrs=any'
restore_command = 'cp /pgdata/10/archive/%f %p'

以上就实现了主从异步流复制

启动16查询 为 f 表示为 主库

pocdb=# select pg_is_in_recovery();
 pg_is_in_recovery
-------------------
 f
(1 row)

Time: 0.786 ms
pocdb=#
  • 在16 创建用户 repl 、创建表、略

  • 主库16正常时,p表数据为

pocdb=# select max(id) from p;
   max
---------
 3774121
(1 row)
  • 从库18 p表数据
pocdb=# select max(id) from p;
   max
---------
 3774121
(1 row)
  • 主库宕机前(16)
pocdb=# select max(id) from p;
   max
---------
 4005263
(1 row)

主库(16)宕机后,从库进行恢复后,数据已经追加:

postgres@clw-db3:/pgdata/10/poc/data> /opt/pgsql-10/bin/psql pocdb
psql (10.3)
Type "help" for help.

pocdb=# select max(id) from p;
   max
---------
 4005263
(1 row)
首先,您需要在两台服务器上安装Docker和Docker Compose。然后,您可以按照以下步骤在两台服务器上安装postgresql主备: 1. 在两台服务器上创建一个文件夹,用于存放docker-compose.yml文件和postgresql数据。 2. 创建docker-compose.yml文件,配置两个postgresql容器,并将它们连接成一个主备模式。下面是一个示例docker-compose.yml文件: ``` version: '3' services: master: image: postgres:latest restart: always environment: POSTGRES_PASSWORD: example volumes: - ./master_data:/var/lib/postgresql/data networks: - postgresql_network slave: image: postgres:latest restart: always environment: POSTGRES_PASSWORD: example POSTGRES_SLAVE: "true" POSTGRES_MASTER_HOST: master POSTGRES_MASTER_PORT: 5432 volumes: - ./slave_data:/var/lib/postgresql/data depends_on: - master networks: - postgresql_network networks: postgresql_network: ``` 在这个文件中,我们定义了两个postgresql容器,一个是主容器,另一个是备容器。主容器被命名为master,备容器被命名为slave。我们还定义了POSTGRES_SLAVE环境变量来指示备容器是从容器,并且必须连接到主容器。我们还定义了POSTGRES_MASTER_HOST和POSTGRES_MASTER_PORT环境变量来指定主容器的地址和端口。 3. 在两台服务器上运行以下命令,以启动postgresql容器: ``` docker-compose up -d ``` 这将启动两个容器,一个是主容器,另一个是备容器。 4. 配置主容器以允许从备容器复制数据。在主容器中的postgresql.conf文件中添加以下配置: ``` listen_addresses = '*' wal_level = replica max_wal_senders = 10 ``` 5. 配置备容器以连接到主容器并复制数据。在备容器中的recovery.conf文件中添加以下配置: ``` standby_mode = on primary_conninfo = 'host=master port=5432 user=postgres password=example' trigger_file = '/var/lib/postgresql/data/failover.trigger' ``` 这将使备容器连接到主容器并复制数据。如果主容器无法正常工作,则会在failover.trigger文件中创建一个标志文件,并且备容器将自动接管为主容器。 6. 在两台服务器上启动postgresql服务: ``` docker exec -it <container-name> /bin/bash service postgresql start ``` 在这里,<container-name>是您的postgresql容器名称。 现在您已经成功地安装了postgresql主备模式。您可以测试它是否正常工作,例如在主节点创建一个表,然后在备节点上查询该表是否存在。如果主节点无法正常工作,则备节点将自动接管并成为新的主节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值