docker部署的dify实现两套数据互相同步
- 修改配置文件 docker-compose.yaml
# 编辑文件修改db的镜像
vim docker-compose.yaml
# 找到db 将postgres:15-alpine 修改为 timescale/timescaledb-ha:pg15-all
# timescale/timescaledb-ha:pg15-all镜像包含pglogical插件,可以实现数据库同步
# 并且将数据库运行用户设置为root,timescale/timescaledb-ha:pg15-all镜像默认不是root用户
# 对外开放5432端口实现数据库访问
db:
image: timescale/timescaledb-ha:pg15-all #postgres:15-alpine
restart: always
user: root
ports:
- '5432:5432'
- 修改PostgreSQL配置文件,在dify的docker/volumes/db/data/pgdata目录下
# 跳转目录
cd volumes/db/data/pgdata
# 修改postgresql.conf
vim postgresql.conf
# 增加pglogical相关配置并启用
wal_level = logical
max_worker_processes = 10
max_replication_slots = 10
max_wal_senders = 10
shared_preload_libraries = 'pglogical'
track_commit_timestamp = on
pglogical.conflict_resolution = 'last_update_wins'
listen_addresses = '*'
# 修改vim pg_hba.conf
vim vim pg_hba.conf
# 增加如下配置,支持指定ip段可以进行拷贝访问
local all all trust
host all all 0.0.0.0/0 scram-sha-256
host replication appuser 192.168.122.0/24 scram-sha-256
host all postgres 192.168.122.0/24 scram-sha-256
host replication postgres 192.168.122.0/24 scram-sha-256
- 以上配置两台服务器都需要配置,并重启服务
docker-compose restart
- 登录两台服务器的数据库
-- 两台服务器同时,启用pglogical
CREATE EXTENSION IF NOT EXISTS pglogical;
- 再重启服务
docker-compose restart
创建复制节点
-- 节点复制为库级操作,要给多个数据库创建复制节点,需要修改切换数据库,修改数据库名称dbname -- 110上运行 SELECT pglogical.create_node( node_name := 'node1', dsn := 'host=192.168.122.110 port=5432 dbname=dify user=postgres password=difyai123456' ); -- 111上运行 SELECT pglogical.create_node( node_name := 'node2', dsn := 'host=192.168.122.111 port=5432 dbname=dify user=postgres password=difyai123456' ); -- 将所有表格都添加到复制节点中 -- 两台机器上一起运行 SELECT pglogical.replication_set_add_all_tables('default', ARRAY['public']); SELECT pglogical.replication_set_add_all_sequences('default', ARRAY['public'], true); -- 如果报错,查看日志是否存在隐藏库,如果存在将库从节点中去掉 SELECT pglogical.replication_set_remove_table('default', 'alembic_version');关联节点
-- 110上运行 SELECT pglogical.create_subscription( subscription_name := 'sub_node1', provider_dsn := 'host=192.168.122.111 port=5432 dbname=dify user=postgres password=difyai123456', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' ); -- 111上运行 SELECT pglogical.create_subscription( subscription_name := 'sub_node2', provider_dsn := 'host=192.168.122.110 port=5432 dbname=dify user=postgres password=difyai123456', replication_sets := ARRAY['default'], synchronize_data := true, forward_origins := '{}' );查看运行状态
SELECT * FROM pglogical.show_subscription_status();如果出现问题,可以查看错误日志,删除订阅
-- 1. 先禁用订阅 SELECT pglogical.alter_subscription_disable('sub_node1'); -- 2. 再删除 SELECT pglogical.drop_subscription('sub_node1');其他命令
SELECT * FROM pg_available_extensions WHERE name = 'pglogical'; -- 查看当前数据库是否已有 node SELECT * FROM pglogical.node; -- 删除当前节点(会清除所有订阅、复制集等配置!) SELECT pglogical.drop_node(node_name := 'node1', ifexists := true);