Как создать таблицу_референции из другой базы данных (не postgres)?

#citus

#citus

Вопрос:

Я пытаюсь создать новую базу данных, когда в ней есть таблицы, затем сделать их распределенными, но не могу использовать create_reference_table() в новой базе данных (она не найдена). Если я попытаюсь запустить create_reference_table(‘newbie.schema.new_table) Я получу сообщение об ошибке «ОШИБКА: ссылки между базами данных не реализованы»:

 CREATE DATABASE newbie;
SELECT * from master_add_node('citus-worker1', 5432);
SELECT * from master_add_node('citus-worker2', 5432);
SELECT run_command_on_workers('CREATE DATABASE newbie;');

c newbie

create table new_table
SELECT create_reference_table('schema.new_table');
  

приводит к
ОШИБКА: функция create_reference_table (неизвестна) не существует
похоже на порочный круг (

Ответ №1:

Вам нужно выполнить CREATE EXTENSION Citus для всех баз данных отдельно (если вы хотите распространить некоторые таблицы в этих базах данных, конечно). Citus хранит метаданные распределенного объекта внутри соответствующей базы данных.

Эти шаги должны сработать:

 c newbie
CREATE EXTENSION Citus;
CREATE SCHEMA s;
CREATE TABLE s.new_table(id int);
SELECT create_reference_table('s.new_table');
  

Если вы запустите CREATE DATABASE ... , когда расширение Citus включено, вы сможете увидеть справочные сообщения:

 postgres=# create database new_db;
NOTICE:  Citus partially supports CREATE DATABASE for distributed databases
DETAIL:  Citus does not propagate CREATE DATABASE command to workers
HINT:  You can manually create a database and its extensions on workers.
  

Также не забудьте запустить master_add_node() , чтобы добавить рабочие узлы в новую базу данных. Метаданные worker также хранятся в связанной базе данных.

Комментарии:

1. Спасибо! Это работает. С docker было немного сложнее: мне пришлось создать отдельные файлы Dockerfile для master и workers, чтобы запустить CREATE DATABASE … и СОЗДАТЬ РАСШИРЕНИЕ Citus; на workers и то же самое плюс создание таблиц на master. Но это стало работать невероятно медленно — запрос к трем распределенным таблицам с объединениями занимает 5-7 секунд

2. Вы должны запускать эти вызовы CREATE EXTENSION Citus и master_add_node() только один раз для каждой базы данных, и после этого все должно быть так же быстро, как при настройке с одной базой данных на каждом узле. Существует много дискуссий о плюсах и минусах наличия нескольких баз данных на одном сервере PostgreSQL, и я лично предпочитаю иметь несколько схем в одной базе данных на компьютере. Вы можете найти одно из таких обсуждений здесь

3. хорошо, спасибо, к сожалению, мне не разрешено принимать решения об архитектуре БД в этом проекте. Медленное выполнение запроса было вызвано тем, что я сделал запрос в таблицу, не расположенную рядом ( .