Вопрос

Каков наилучший способ работы с разделенной базой данных в Rails?Должно ли сегментирование обрабатываться на уровне приложения, уровне активной записи, уровне драйвера базы данных, уровне прокси-сервера или на чем-то еще в целом?Каковы плюсы и минусы каждого из них?

Это было полезно?

Решение

У пяти рунов есть драгоценный камень с именем База данных это выполняет сегментирование на уровне приложения и репликацию master / slave.Возможно, это стоит проверить.

Другие советы

Я предполагаю, что с осколками мы говорим о горизонтальном разбиении, а не о вертикальном (вот различия в Википедии).

Во-первых, растягивание вертикальной перегородки насколько это возможно, прежде чем рассматривать горизонтальное разбиение.В Rails легко настроить разные модели, указывающие на разные машины, и для большинства сайтов Rails этого будет достаточно.

Для горизонтального разбиения, в идеальном мире, это было бы сделано на прикладной уровень в Рельсах.Но хотя это несложно, в Rails это нетривиально, и к тому времени, когда вам это нужно, обычно ваше приложение выходит за рамки того, что это возможно, поскольку у вас повсюду разбросаны вызовы ActiveRecord.И никому, ни разработчикам, ни руководству, не нравится работать над этим до того, как вам это понадобится, поскольку все предпочитают работать над функциями, которые пользователи будут использовать сейчас, а не над разделением, которое может не сработать в течение многих лет после того, как ваш трафик резко возрастет.

Слой ActiveRecord...судя по тому, что я вижу, это нелегко.Потребовалось бы много обезьяньих исправлений во внутренних элементах Rails.

В Спок в итоге мы справились с этим, используя пользовательский прокси-сервер MySQL и откройте исходный код на SourceForge как Прокси - сервер Спока.ActiveRecord думает, что он разговаривает с одной машиной базы данных MySQL, когда на самом деле он разговаривает с прокси, который затем взаимодействует с одной или несколькими базами данных MySQL, объединяет / сортирует результаты и возвращает их в ActiveRecord.Требуется всего несколько изменений в вашем коде Rails.Взгляните на страницу Spock Proxy SourceForge для получения более подробной информации и объяснения причин, по которым мы выбрали этот маршрут.

Для тех из вас, как я, кто не слышал о шардинге:

http://highscalability.com/unorthodox-approach-database-design-coming-shard

Подключение Rails к нескольким базам данных не имеет большого значения - у вас просто есть подкласс ActiveRecord для каждого сегмента, который переопределяет свойство connection.Это делает задачу довольно простой, если вам нужно выполнять вызовы с перекрестными сегментами.Затем вам просто нужно написать небольшой код, когда вам нужно совершать вызовы между сегментами.

Мне не нравится идея Хэнка о разделении экземпляров rails, потому что кажется сложным вызывать код между экземплярами, если у вас нет большой разделяемой библиотеки.

Также вам следует подумать о том, чтобы сделать что-то вроде Мазохизм прежде чем вы начнете шардинг.

Чтобы rails работал с реплицируемой средой, я бы предложил использовать плагин my_replication, который помогает переключать подключение к базе данных на одно из подчиненных устройств во время выполнения

https://github.com/minhnghivn/my_replication

На мой взгляд, самый простой способ - поддерживать соотношение 1: 1 между экземплярами rails и фрагментами базы данных.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top