Docker部署dify实现数据库同步


docker部署的dify实现两套数据互相同步

  1. 修改配置文件 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'
  1. 修改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
  1. 以上配置两台服务器都需要配置,并重启服务
docker-compose restart
  1. 登录两台服务器的数据库
-- 两台服务器同时,启用pglogical
CREATE EXTENSION IF NOT EXISTS pglogical;
  1. 再重启服务
docker-compose restart
  1. 创建复制节点

    -- 节点复制为库级操作,要给多个数据库创建复制节点,需要修改切换数据库,修改数据库名称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');
  2. 关联节点

    -- 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 := '{}'
    );
    
  3. 查看运行状态

    SELECT * FROM pglogical.show_subscription_status();
  4. 如果出现问题,可以查看错误日志,删除订阅

    -- 1. 先禁用订阅
    SELECT pglogical.alter_subscription_disable('sub_node1');
    
    -- 2. 再删除
    SELECT pglogical.drop_subscription('sub_node1');
  5. 其他命令

    SELECT * FROM pg_available_extensions WHERE name = 'pglogical';
    
    -- 查看当前数据库是否已有 node
    SELECT * FROM pglogical.node;
    
    -- 删除当前节点(会清除所有订阅、复制集等配置!)
    SELECT pglogical.drop_node(node_name := 'node1', ifexists := true);

文章作者: 花舞流觞
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 花舞流觞 !
  目录