#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. хорошо, спасибо, к сожалению, мне не разрешено принимать решения об архитектуре БД в этом проекте. Медленное выполнение запроса было вызвано тем, что я сделал запрос в таблицу, не расположенную рядом ( .