Twitter меняется, и многие пользователи переходят на Mastodon. С этим увеличением нагрузки пришлось масштабировать свою базу данных:

<br /> @Gargron<br /> От 8 до 36 вычислительных ядер, давайте посмотрим, как выдержит новый сервер базы данных.  Надеюсь, теперь все будет намного быстрее, но это также должно дать мне немного больше возможностей для горизонтального масштабирования.<br />» loading=»lazy» width=»880″ height=»544″/></a></p><p>Не проще ли масштабировать?  мастодонт использует <strong>PostgreSQL</strong>так что давайте попробуем <strong>ЮгабайтДБ</strong>которая представляет собой распределенную базу данных SQL с открытым исходным кодом, совместимую с Postgres.</p><p>Мой тест доступен здесь и готов к запуску на GitPod: <a rel=


Изменения для ЮгабайтДБ

я раздвоился это и изменил базовое изображение с gitpod/workspace-postgresql к gitpod/workspace-yugabytedb.

В качестве порта по умолчанию для YSQL используется конечная точка YugabyteDB, совместимая с PostgreSQL. 5433 Я изменил параметры БД в .env.production.example к:

DB_HOST=127.0.0.1
DB_PORT=5433
DB_NAME=mastodon
DB_USER=yugabyte
DB_PASS=
Войти в полноэкранный режим

Выйти из полноэкранного режима

Конечная точка YSQL становится доступной через несколько секунд, затем я жду, когда она будет доступна, и создаю mastodon база данных:

      # wait until YSQL is available, create the database and utility function
      until ysqlsh <<<'
       create database mastodon;\c mastodon
       ' ; do sleep 1 ; done 2>/dev/null
      # create the database
      RAILS_ENV=production rails --trace db:setup
Войти в полноэкранный режим

Выйти из полноэкранного режима

Не удалось создать базу данных при создании двух индексов:

CREATE UNIQUE INDEX index_ip_blocks_on_ip ON public.ip_blocks USING btree (ip);

NOTICE:  index method "btree" was replaced with "lsm" in YugabyteDB
ERROR:  INDEX on column of type 'INET' not yet supported
Войти в полноэкранный режим

Выйти из полноэкранного режима

Я не буду создавать этот индекс. Если это требуется по соображениям производительности, есть несколько альтернатив (используйте text вместо inet datatype), и можно открыть git issue для его поддержки в Yugabyte.

CREATE UNIQUE INDEX index_unique_conversations ON public.account_conversations USING btree (account_id, conversation_id, participant_account_ids);

NOTICE:  index method "btree" was replaced with "lsm" in YugabyteDB
ERROR:  INDEX on column of type 'user_defined_type' not yet supported
Войти в полноэкранный режим

Выйти из полноэкранного режима

participant_account_ids является bigint[]. Я не уверен, как это имеет смысл в уникальном индексе, потому что массивы с одинаковыми элементами в разном порядке будут считаться разными.
Затем я создам энергонезависимую функцию, которая сортирует элементы и возвращает их как text:

       create or replace function array_signature(a bigint[])
       returns text as $$
       select array_agg(unnest order by unnest)::text
       from unnest(a);
       $$ immutable language sql;
Войти в полноэкранный режим

Выйти из полноэкранного режима

и создайте индекс как:

 CREATE UNIQUE INDEX index_unique_conversations ON public.account_conversations 
       (account_id, conversation_id, (array_signature(participant_account_ids)));
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это быстрый обходной путь. Если вы хотите запустить Mastodon с YugabyteDB в производственной среде, свяжитесь с сообществом Yugabyte:

Чтобы иметь возможность создать базу данных, я удалил индексы из определения схемы:

      # remove indexes that are not supported
      sed -e " -i db/schema.rb
      sed -e " -i db/schema.rb
Войти в полноэкранный режим

Выйти из полноэкранного режима

затем запустите создание:

      # create the database
      RAILS_ENV=production rails --trace db:setup
Войти в полноэкранный режим

Выйти из полноэкранного режима

Это работает:
<br /> Теперь вы подключены к базе данных "мастодонт" как пользователь "yugabyte".<br /> ** Вызов db:setup (первый_время)<br /> ** Вызов db:create (первый_время)<br /> ** Вызов db:load_config (первый_время)<br /> ** Вызов среды (первый_время)<br /> ** Выполнить среду<br /> ** Выполнить db:load_config<br /> ** Выполнить db:create<br /> База данных ‘mastodon’ уже существует<br /> ** Вызвать среду <br /> ** Выполнить db:schema:load ( first_time)<br /> ** Вызов db:load_config <br /> ** Вызов db:check_protected_environments (first_time)<br /> ** Вызов db:load_config <br /> ** Выполнение db:check_protected_environments<br /> ** Выполнение db:schema :нагрузка» loading=»lazy» width=»880″ height=»484″/></a><br />Если вас беспокоит производительность DDL, есть способы ее улучшить (например, CREATE INDEX NONCONCURRENTLY).</p><p>Затем, после создания, я создаю уникальный индекс с функцией в массиве:</p><div class=

      # add indexes with DDL (this may be done from schema.rb)
      ysqlsh -e -c "
       create or replace function array_signature(a bigint[])
       returns text as '
       select array_agg(unnest order by unnest)::text
       from unnest(a);
       ' immutable language sql;
      " -c '
       CREATE UNIQUE INDEX index_unique_conversations ON public.account_conversations 
       (account_id, conversation_id, (array_signature(participant_account_ids)));
       ' mastodon
      # end modifications for YugabyteDB


Тестирование

В журналах отображаются созданные пользователи и пароли:
Описание изображения

Я создаю несколько диалогов:
Описание изображения

И посмотрите на account_conversations; таблицу, чтобы убедиться, что все в порядке:
Описание изображения


В заключение

Я люблю: Gitpod, Mastodon, PostgreSQL и YugabyteDB. Если у вас есть приложение на PostgreSQL, вы можете получить High Availability (устойчивость к сбоям и последовательное обновление) и Elasticity (масштабирование и уменьшение без простоя приложения) с YugabyteDB. Если что-то не поддерживается, пожалуйста, откройте git issue или попросите обходной путь, всегда есть много возможностей. При переходе от монолитной к распределенной базе данных также важно проверить индексы (хэширование и сегментирование диапазона) и протестировать производительность.