Identica
Сеть

Несколько прокси

Используйте общие аккаунты, сессии и незавершённые входы на нескольких прокси через одну базу данных и Redis.

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

Что прокси используют совместно

Через чтоЧтоБез этого
сервер базы данныхаккаунты, привязки к провайдерам, пароли, ники, резервирования UUID, способы подтвержденияу каждого прокси свои аккаунты
Redisсессии, незавершённые входы, удержания ников, ограничения, блокировки Sentinel, распознаваниекаждый прокси знает только своих игроков; это состояние теряется при перезапуске прокси

Всем прокси сети нужна одна и та же база данных. Именно Redis заставляет сеть работать как единое целое: без него два прокси не знают, что аккаунт уже в сети через другой прокси.

Redis полезен и для одного прокси: незавершённые входы и ограничения переживают перезапуск прокси, пока не истечёт их срок действия.

Соедините прокси

Используйте один сервер базы данных

SQLite и H2 хранят свой файл в каталоге данных прокси, поэтому их нельзя использовать совместно. Укажите в persistence.yml каждого прокси одну и ту же базу данных MySQL, MariaDB или PostgreSQL:

type: "POSTGRES"
host: "db.internal"
port: 5432
database: "identica"
username: "identica"
credential: "secret"

См. База данных. Если несколько прокси используют одну базу данных, она обновляется один раз: это делает прокси, запустившийся первым, а остальные ждут.

Включите репликацию

Откройте replication.yml на каждом прокси:

enabled: true
serverId: "proxy-1"

redis:
  host: "redis.internal"
  port: 6379
  credential: ""
  ssl: false
  timeout: 5000
  • enabled: true подключает прокси к Redis при запуске.
  • serverId — имя прокси. Дайте каждому прокси собственное имя и не меняйте его: сгенерированное значение случайно, а сессия запоминает serverId прокси, через который подключён её игрок, поэтому вход через другой прокси отключает именно этого игрока.

Если при запуске прокси Redis недоступен, запуск прерывается, и прокси отказывает всем игрокам, пока Redis не станет доступен, а прокси не будет перезапущен. Неудачный запуск никогда не пускает игроков без входа.

Используйте одинаковые общие имена

Все прокси одной сети должны использовать одинаковые имена redis.channels и cache. Значения по умолчанию подходят; меняйте их, только чтобы запустить две отдельные сети на одном Redis, и только до того, как сеть заработает. Прокси с другими именами ведёт себя как прокси другой сети.

То же относится к именам репликации в настройках функций и провайдеров, например replication.state у Sentinel.

Настройте прокси одинаково

  • Используйте на каждом прокси одну и ту же версию Identica и её провайдеров.
  • Установите и включите одни и те же провайдеры с теми же идентификаторами. Аккаунт, привязанный к провайдеру, которого нет на другом прокси, не сможет войти там.
  • Используйте одинаковые identity/username/conflicts.yml, identity/addresses.yml, настройки функций и settings.yml, чтобы игрок обрабатывался одинаково на каждом прокси. При хешированных адресах другой secret в identity/addresses.yml заставляет каждый прокси учитывать только адреса своих игроков.

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

Когда прокси останавливается или падает

Прокси, остановленный штатно, закрывает свои сессии и освобождает ники своих игроков, которые находились в процессе входа. Упавший прокси этого сделать не может, поэтому его записи остаются в Redis, пока не пройдёт heartbeatTimeout, по умолчанию 30 секунд. До этого другие прокси:

  • показывают сессии его игроков в /identica admin session list,
  • отклоняют новый вход этих аккаунтов при REJECT_NEW,
  • отказывают игроку с другого адреса под ником, под которым шёл вход, с сообщением engine.usernameHeld.

Более короткий тайм-аут освобождает их быстрее, но требует больше команд Redis; цена описана у самой настройки.

Игрок на двух прокси одновременно

Один и тот же игрок может оказаться на двух прокси в один момент, например если переподключится, пока его вход на другом прокси ещё сохраняется. Identica сохраняет вход и сессию только поверх того, что прочитала, поэтому один прокси никогда не перезаписывает то, что тем временем сохранил другой. Прокси, оказавшийся вторым, отключает своего игрока с сообщением engine.concurrentChangeKick, которое просит переподключиться; при следующем подключении вход продолжится с того, что сохранил другой прокси.

Для этого Identica выполняет в Redis небольшие скрипты. Готовить для них ничего не нужно, но если для Identica заведён пользователь Redis ACL, ему должны быть разрешены команды evalsha и script.

Проверка

Зайдите через один прокси, а затем зайдите с тем же аккаунтом через другой:

  • при concurrencyPolicy: REPLACE_EXISTING первое подключение отключается с сообщением engine.concurrentLoginKick;
  • /identica admin session list на любом из прокси показывает сессию аккаунта.

Все настройки репликации описаны на странице replication.yml.

На этой странице