Несколько прокси
Используйте общие аккаунты, сессии и незавершённые входы на нескольких прокси через одну базу данных и 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: 5000enabled: 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.
