redis
ansible-redis
- Ansible 2.4+
- Совместимо с большинством версий Ubuntu/Debian и RHEL/CentOS 6.x
Содержание
- Установка
- Начало работы
- Одиночный узел Redis
- Репликация Master-Slave
- Redis Sentinel
- Расширенные параметры
- Проверка контрольных сумм
- Установка из локального архива
- Создание 32-битных бинарных файлов
- Переменные роли
Установка
$ 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