Репликация Rails Postgresql через гем Octopus в разработке env
Очевидно, что при использовании Gem Octopus для репликации Postgres все должно быть подключено и работать. Однако я не могу понять, что я делаю неправильно.
Это мое config/shards.yml
octopus:
environments:
- development
replicated: true
development:
slave1:
adapter: postgresql
host: localhost
database: slaveapp_development
username: pguser
password: pgpass
Модель AR Provider
(Я создаю одни и те же таблицы в каждом приложении с помощью задач Rake). Я хочу синхронизировать / реплицировать на мое ведомое устройство:
class Provider < ActiveRecord::Base
has_many :products
replicated_model()
end
Я загружаю оба приложения через сервер Rails и захожу в консоль Masterapp и оттуда:
> Provider.using(:slave1).create({provider_params...})
#=> works! I get a new record in slave1's DB.
> Provider.using(:master).create({provider_params...})
#=> works partly. Creates record only in master's DB.
Проблема в том, что при звонке Provider.using(:master)...
Я ожидаю:
1 - Создать запись в базе данных мастера.
2 - Копировать ту же запись в БД slave1. <--- Этого не происходит.
2 ответа
Это не цель драгоценного камня Осьминога.
Он перенаправляет запросы к базе данных в зависимости от того, является ли это операцией чтения или записи. Таким образом, вы можете использовать свои модели Rails, не задумываясь о текущем соединении с базой данных и о том, соответствует ли оно предполагаемой операции.
Он не копирует данные на подчиненные.
Чтобы выполнить фактическую репликацию, то есть передачу данных от ведущего устройства к ведомым, вы должны настроить его самостоятельно.
Есть несколько вариантов с PostgreSQL. Если вы используете более новую версию (9.1+), вы можете использовать встроенную потоковую репликацию в режиме "горячего резерва". Есть инструкции по настройке, например
- http://www.rassoc.com/gregr/weblog/2013/02/16/zero-to-postgresql-streaming-replication-in-10-mins/
- http://prongs.org/blog/postgresql-replication
Если вы застряли в более старой версии PostgreSQL, взгляните на альтернативы.
Попробуйте добавить fully_replicated: false
после replicated: true
в вашем конфиге.