понедельник, сентября 29, 2014

"Пропавшие" ключи на Redis Slaves

Если вы используете ключи со сроком действия в Redis, вы можете сильно удивиться, как только добавите новый Redis slave к своему master серверу: на вашем slave сервере может не хватать до 25% ключей. Это особенно часто случается, если у вас есть большое количество ключей со сроком действия.

На slave сервере потерялись ключи? Данные утеряны? Короткий ответ - "нет". Тем не менее, было бы полезно понять, почему, собственно, ваш slave показывает меньшее количество ключей, даже если вы не потеряли никаких данных. Причина в двух деталях реализации - как Redis работает с ключами, чей срок жизни истёк и как мастер Redis посылает данные для новых slave серверов.

Как в Redis заканчивается срок жизни для ключей?

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

  1. Когда вы пытаетесь читать или писать, сервер Redis сначала проверяет, существует ли этот ключ и имеет ли он срок действия. Если он существует и просрочен, Redis удаляет его из оперативной памяти до выполнения операции.
  2. Чтобы избежать ситуации, в которой ключи останутся в памяти навсегда, если к ключам не обращались, Redis использует простой пассивный алгоритм: каждые 10 миллисекунд, он берёт 100 случайных ключи со сроком жизни и сразу удаляет любые ключи, срок жизни которых уже истёк. Если удалось удались 25 или более ключей, Redis берёт еще 100 ключей и т.д.
Понимание того, как работает второй метод очень важно, т.к. это означает, что до 25% из ваших ключей могут быть уже просрочены, но еще не были удалены из памяти. При этом Redis будет по прежнему их учитывать и в "ключах" и в "истекает" при выводе INFO, пока они не будут исключены из памяти.

Как Redis шлёт данные на slave сервер?

Когда новый slave подключатся к master, мастер создает RDB снимок своего набора ключей  и отправляет его в slave. А когда Redis создает RDB снимки, он не включает в него просроченные ключи, даже если они еще не удалены из памяти.

Так почему же на slave меньше ключей, чем на master?

При подключении, slave к Redis серверу он получает набор данных, который не включает в себя ключи с истёкшим сроком жизни, даже если они еще ​​не были удалены из памяти. И поскольку до 25% от вашего общего количества ключей, могут быть ключи срок жизни которых уже истёк, твой slave может показывать количество ключей до 25% ниже, чем у мастера. Кроме того, это та же самая причина, при которой ваши ключи со сроком жизни могут потеряться при восстановлении сервера Redis из резервной копии RDB.

Оригинал на английском языке: http://www.redisgreen.net/blog/missing-keys-on-redis-slave/?utm_source=redisweekly&utm_medium=email
Отправить комментарий