redis

ansible-redis

Статус сборки Ansible Galaxy

  • Ansible 2.4+
  • Совместимо с большинством версий Ubuntu/Debian и RHEL/CentOS 6.x

Содержание

  1. Установка
  2. Начало работы
  3. Одиночный узел Redis
  4. Репликация Master-Slave
  5. Redis Sentinel
  6. Расширенные параметры
  7. Проверка контрольных сумм
  8. Установка из локального архива
  9. Создание 32-битных бинарных файлов
  10. Переменные роли

Установка

$ ansible-galaxy install davidwittman.redis

Начало работы

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

Эта роль должна выполняться от имени пользователя root или пользователя с привилегиями sudo.

Одиночный узел Redis

Развертывание одного узла Redis довольно просто; просто добавьте роль в свой плейбук и вперед. Вот пример, который мы сделаем чуть более интересным, установив адрес привязки на 127.0.0.1:

---
- hosts: redis01.example.com
  vars:
    - redis_bind: 127.0.0.1
  roles:
    - davidwittman.redis
$ ansible-playbook -i redis01.example.com, redis.yml

Примечание: Вы, возможно, заметили, что я просто указал имя хоста в качестве файла инвентаря Ansible. Это простой способ запустить Ansible, не создавая файл инвентаря заранее — просто добавьте запятую к имени хоста, чтобы Ansible знал, что с ним делать.

Вот и все! Теперь у вас будет сервер Redis, прослушивающий 127.0.0.1 на redis01.example.com. По умолчанию бинарные файлы Redis устанавливаются в /opt/redis, хотя это можно изменить, установив переменную redis_install_dir.

Репликация Master-Slave

Настройка репликации в Redis осуществляется путем развертывания нескольких узлов и установки переменной redis_slaveof на узлах-слугах, как вы бы сделали в redis.conf. В следующем примере мы развернем узел мастера Redis с тремя слугами.

В этом примере мы будем использовать группы для разделения узлов мастера и слуг. Давайте начнем с файла инвентаря:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

А вот плейбук:

---
- name: настроить сервер master redis
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: настроить слуг redis
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

В данном случае я предполагаю, что у вас настроены DNS-записи для redis-master.example.com, но это не всегда так. Вы можете немного пофантазировать с тем, как это должно быть настроено. Во многих случаях я говорю Ansible использовать IP-адрес eth1 для мастера. Вот более гибкое значение для будущего:

redis_slaveof: "{{ hostvars['redis-master.example.com'].ansible_eth1.ipv4.address }} {{ redis_port }}"

Теперь дело шло! Запуск этого плейбука должен подготовить вас к работе с мастером Redis и тремя слугами.

Redis Sentinel

Введение

Использование репликации Master-Slave прекрасно для надежности и распределения чтений и записей, но не так хорошо для высокой доступности. Если узел мастера выходит из строя, слуга должна быть вручную повышена до мастера, а подключения должны быть перенаправлены на нового мастера. Решение этой проблемы — Redis Sentinel, распределенная система, которая использует сам Redis для связи и обработки автоматического переключения при сбое в кластере Redis.

Sentinel использует тот же бинарный файл redis-server, что и Redis, но запускается с флагом --sentinel и с другим конфигурационным файлом. Конечно, это все абстрагировано с помощью этой роли Ansible, но все же полезно знать.

Конфигурация

Чтобы добавить узел Sentinel в существующее развертывание, необходимо назначить ему ту же роль redis и установить переменную redis_sentinel на True для этого конкретного хоста. Это можно сделать различными способами, и для целей этого примера я расширю файл инвентаря, использованный ранее в конфигурации Master/Slave:

[redis-master]
redis-master.example.com

[redis-slave]
redis-slave0[1:3].example.com

[redis-sentinel]
redis-sentinel0[1:3].example.com redis_sentinel=True

Мы добавили три дополнительные хоста в группу redis-sentinel (хотя эта группа не выполняет никакой функции в рамках роли, она просто служит идентификатором) и установили переменную redis_sentinel в инвентарном файле.

Теперь все, что нам нужно сделать, это установить переменную redis_sentinel_monitors для определения Redis мастеров, которые Sentinel должен мониторить. В данном случае я собираюсь сделать это в плейбуке:

- name: настроить сервер master redis
  hosts: redis-master
  roles:
    - davidwittman.redis

- name: настроить слуг redis
  hosts: redis-slave
  vars:
    - redis_slaveof: redis-master.example.com 6379
  roles:
    - davidwittman.redis

- name: настроить узлы sentinel redis
  hosts: redis-sentinel
  vars:
    - redis_sentinel_monitors:
      - name: master01
        host: redis-master.example.com
        port: 6379
  roles:
    - davidwittman.redis

Это настроит узлы Sentinel для мониторинга мастера, которого мы создали ранее, используя идентификатор master01. По умолчанию Sentinel будет использовать кворум из 2, что значит, что как минимум 2 Sentinel должны согласовать, что мастер вышел из строя, чтобы произошел переход. Это значение можно переопределить, установив ключ quorum в вашем определении монитора. Дополнительную информацию см. в документации Sentinel.

Помимо перечисленных выше переменных, Sentinel имеет ряд своих собственных настраиваемых параметров. Они начинаются с redis_sentinel_ и перечислены в разделе Переменные роли ниже.

Множественные включения роли

Если вам нужно выполнять роль несколько раз, обратите внимание на test/test_all.yml, чтобы увидеть, как действовать. См. здесь и здесь для контекста.

Расширенные параметры

Проверка контрольных сумм

Установите переменную redis_verify_checksum на true, чтобы использовать параметр проверки контрольных сумм для get_url. Обратите внимание, что это проверяет контрольные суммы только в случае, если Redis загружается с URL, а не когда он предоставлен в архиве с redis_tarball.

При использовании Ansible 2.x эта роль будет проверять контрольную сумму sha1 загруженного файла по контрольным суммам, определенным в переменной redis_checksums внутри vars/main.yml. Если ваша версия не указана здесь или вы хотите переопределить контрольную сумму на свою, просто установите переменную redis_checksum. Как в примере ниже, вам нужно будет префиксовать контрольную сумму типом хэша, который вы используете.

- name: установить redis на ansible 1.x и проверить контрольные суммы
  hosts: all
  roles:
    - role: davidwittman.redis
      redis_version: 3.0.7
      redis_verify_checksum: true
      redis_checksum: "sha256:b2a791c4ea3bb7268795c45c6321ea5abcc24457178373e6a6e3be6372737f23"

Установка из локального архива

Если в среде, в которой находится ваш сервер, не разрешены загрузки (т.е. если машина находится в dmz), установите переменную redis_tarball на путь к локально загруженному архиву Redis, чтобы использовать его вместо загрузки по HTTP с redis.io.

Не забудьте установить переменную версии на ту же версию архива, чтобы избежать путаницы! Например:

vars:
  redis_version: 2.8.14
  redis_tarball: /path/to/redis-2.8.14.tar.gz

В этом случае исходный архив копируется на сервер через SSH, а не загружается.

Создание 32-битных бинарных файлов

Чтобы создать 32-битные бинарные файлы Redis (которые могут использоваться для оптимизации памяти), установите redis_make_32bit: true. Это установит необходимые зависимости (x86 glibc) на RHEL/Debian/SuSE и установит опцию '32bit' при выполнении make.

Создание с поддержкой TLS

Чтобы создать Redis с поддержкой TLS (добавлена в версии 6), установите redis_make_tls: true. Это требует библиотек разработки OpenSSL (например, libssl-dev на Debian/Ubuntu).

Переменные роли

Вот список всех переменных по умолчанию для этой роли, которые также доступны в defaults/main.yml. Однажды я отформатирую их в таблицу или что-то подобное.

---
## Параметры установки
redis_version: 2.8.24
redis_install_dir: /opt/redis
redis_dir: /var/lib/redis/{{ redis_port }}
redis_config_file_name: "{{ redis_port }}.conf"
redis_download_url: "http://download.redis.io/releases/redis-{{ redis_version }}.tar.gz"
# Установите это в true, чтобы проверить контрольную сумму архива redis по vars/main.yml
redis_verify_checksum: false
# Установите это значение в локальный путь архива для установки вместо загрузки
redis_tarball: false
# Установите это в true, чтобы создать 32-битные бинарные файлы Redis
redis_make_32bit: false
# Установите это в true, чтобы создать redis с поддержкой TLS, доступным только для версий >= 6 (требует библиотеки разработки OpenSSL)
redis_make_tls: false

redis_user: redis
redis_group: "{{ redis_user }}"

# Ограничение на открытие файлов для Redis/Sentinel
redis_nofile_limit: 16384

## Опции роли
# Настройка Redis как службы
# Это создает скрипты инициализации для Redis и обеспечивает работу процесса
# Также применяется для Redis Sentinel
redis_as_service: true
# Добавить локальные факты в /etc/ansible/facts.d для Redis
redis_local_facts: true
# Имя службы
redis_service_name: "redis_{{ redis_port }}"

## Опции сети/подключения
redis_bind: false
redis_port: 6379
redis_password: false
# Параметры репликации слуг
redis_min_slaves_to_write: 0
redis_min_slaves_max_lag: 10
redis_tcp_backlog: 511
redis_tcp_keepalive: 0
# Максимальное количество одновременно подключенных клиентов
redis_maxclients: 10000
redis_timeout: 0
# Параметры сокета
# Установите socket_path в желаемый путь для сокета. Например, /var/run/redis/{{ redis_port }}.sock
redis_socket_path: false
redis_socket_perm: 755

## Параметры репликации
# Установите slaveof так же, как в redis.conf. (например, "redis01 6379")
redis_slaveof: false
# Сделать слуг только для чтения. "yes" или "no"
redis_slave_read_only: "yes"
redis_slave_priority: 100
redis_repl_backlog_size: false

## Логирование
redis_logfile: '""'
# Включить syslog. "yes" или "no"
redis_syslog_enabled: "yes"
redis_syslog_ident: "{{ redis_service_name }}"
# facility syslog. Должен быть USER или LOCAL0-LOCAL7
redis_syslog_facility: USER

## Общая конфигурация
redis_daemonize: "yes"
redis_pidfile: /var/run/redis/{{ redis_port }}.pid
# Количество разрешенных баз данных
redis_databases: 16
redis_loglevel: notice
# Логировать запросы, медленнее чем за это количество миллисекунд. -1 для отключения
redis_slowlog_log_slower_than: 10000
# Максимальное количество медленных запросов для сохранения
redis_slowlog_max_len: 128
# Ограничение памяти Redis (например, 4294967296, 4096mb, 4gb)
redis_maxmemory: false
redis_maxmemory_policy: noeviction
redis_rename_commands: []
redis_db_filename: dump.rdb
# Как часто делать снапшоты базы данных на диск
# например, "900 1" => 900 секунд, если изменен хотя бы 1 ключ
redis_save:
  - 900 1
  - 300 10
  - 60 10000
redis_stop_writes_on_bgsave_error: "yes"
redis_rdbcompression: "yes"
redis_rdbchecksum: "yes"
redis_appendonly: "no"
redis_appendfilename: "appendonly.aof"
redis_appendfsync: "everysec"
redis_no_appendfsync_on_rewrite: "no"
redis_auto_aof_rewrite_percentage: "100"
redis_auto_aof_rewrite_min_size: "64mb"
redis_notify_keyspace_events: '""'

## Дополнительные параметры конфигурации
# оставьте пустым, если не требуется. Используйте блочный стиль скаляров для добавления опций, например:
# redis_config_additional: |
#   io-threads 4
#   io-threads-do-reads yes
redis_config_additional: ""

## Конфигурации sentinel redis
# Установите это в true на хосте, чтобы настроить его как Sentinel
redis_sentinel: false
redis_sentinel_dir: /var/lib/redis/sentinel_{{ redis_sentinel_port }}
redis_sentinel_bind: 0.0.0.0
redis_sentinel_port: 26379
redis_sentinel_password: false
redis_sentinel_pidfile: /var/run/redis/sentinel_{{ redis_sentinel_port }}.pid
redis_sentinel_logfile: '""'
redis_sentinel_syslog_ident: sentinel_{{ redis_sentinel_port }}
redis_sentinel_monitors:
  - name: master01
    host: localhost
    port: 6379
    quorum: 2
    auth_pass: ant1r3z
    down_after_milliseconds: 30000
    parallel_syncs: 1
    failover_timeout: 180000
    notification_script: false
    client_reconfig_script: false
    rename_commands: []

Факты

Следующие факты доступны в вашем инвентаре или задачах вне этой роли.

  • {{ ansible_local.redis.bind }}
  • {{ ansible_local.redis.port }}
  • {{ ansible_local.redis.sentinel_bind }}
  • {{ ansible_local.redis.sentinel_port }}
  • {{ ansible_local.redis.sentinel_monitors }}

Чтобы отключить эти факты, установите redis_local_facts в ложное значение.

О проекте

Highly configurable role to install Redis and Redis Sentinel from source

Установить
ansible-galaxy install DavidWittman/ansible-redis
Лицензия
mit
Загрузки
1056409
Владелец
Dev, Ops, Security, Lens Flares