DavidWittman.redis
ansible-redis
- Ansible 2.4+
- Kompatibel mit den meisten Versionen von Ubuntu/Debian und RHEL/CentOS 6.x
Inhalt
- Installation
- Erste Schritte
- Einzelner Redis-Knoten
- Master-Slave-Replikation
- Redis Sentinel
- Erweiterte Optionen
- Überprüfung der Prüfziffern
- Installation von lokalem Tarball
- Erstellen von 32-Bit-Binärdateien
- Rollenvariablen
Installation
$ ansible-galaxy install davidwittman.redis
Erste Schritte
Hier sind einige Beispiel-Playbooks und Konfigurationen zur Bereitstellung verschiedener Redis-Architekturen.
Diese Rolle sollte als root oder als Benutzer mit Sudo-Rechten ausgeführt werden.
Einzelner Redis-Knoten
Das Bereitstellen eines einzelnen Redis-Serverknotens ist ziemlich einfach; fügen Sie einfach die Rolle zu Ihrem Playbook hinzu und legen Sie los. Hier ist ein Beispiel, das wir ein wenig spannender gestalten, indem wir die Bind-Adresse auf 127.0.0.1 setzen:
---
- hosts: redis01.example.com
vars:
- redis_bind: 127.0.0.1
roles:
- davidwittman.redis
$ ansible-playbook -i redis01.example.com, redis.yml
Hinweis: Möglicherweise ist Ihnen aufgefallen, dass ich einfach den Hostnamen als Ansible-Inventory-Datei übergeben habe. Dies ist ein einfacher Weg, um Ansible auszuführen, ohne vorher eine Inventar-Datei erstellen zu müssen; Sie müssen nur den Hostnamen mit einem Komma ergänzen, damit Ansible weiß, was zu tun ist.
Das war’s! Sie haben jetzt einen Redis-Server, der auf 127.0.0.1 auf redis01.example.com lauscht. Standardmäßig werden die Redis-Binärdateien unter /opt/redis installiert, dies kann jedoch durch Festlegen der Variable redis_install_dir
überschrieben werden.
Master-Slave-Replikation
Die Konfiguration der Replikation in Redis erfolgt durch das Bereitstellen mehrerer Knoten und das Setzen der Variablen redis_slaveof
auf den Slave-Knoten, genauso wie in der redis.conf. Im folgenden Beispiel werden wir einen Redis-Master mit drei Slaves bereitstellen.
In diesem Beispiel verwenden wir Gruppen, um den Master und die Slave-Knoten zu trennen. Lassen Sie uns mit der Inventar-Datei beginnen:
[redis-master]
redis-master.example.com
[redis-slave]
redis-slave0[1:3].example.com
Hier ist das Playbook:
---
- name: Konfigurieren des Master-Redis-Servers
hosts: redis-master
roles:
- davidwittman.redis
- name: Konfigurieren der Redis-Slaves
hosts: redis-slave
vars:
- redis_slaveof: redis-master.example.com 6379
roles:
- davidwittman.redis
In diesem Fall gehe ich davon aus, dass Sie DNS-Einträge für redis-master.example.com eingerichtet haben, aber das ist nicht immer der Fall. Sie können es im Wesentlichen so einrichten, wie Sie es benötigen. In vielen Fällen sage ich Ansible, dass es die eth1-IP-Adresse für den Master verwenden soll. Hier ist ein flexiblerer Wert:
redis_slaveof: "{{ hostvars['redis-master.example.com'].ansible_eth1.ipv4.address }} {{ redis_port }}"
Jetzt sind Sie auf dem richtigen Weg! Wenn Sie dieses Playbook ausführen, sollten Sie bereit sein, mit einem Redis-Master und drei Slaves zu arbeiten.
Redis Sentinel
Einführung
Die Verwendung von Master-Slave-Replikation ist großartig für Haltbarkeit und das Verteilen von Lese- und Schreibvorgängen, aber nicht so sehr für hohe Verfügbarkeit. Wenn der Master-Knoten ausfällt, muss ein Slave manuell zum Master befördert werden, und Verbindungen müssen zum neuen Master umgeleitet werden. Die Lösung für dieses Problem ist Redis Sentinel, ein verteiltes System, das Redis selbst zur Kommunikation und zur automatischen Failover-Verwaltung in einem Redis-Cluster verwendet.
Sentinel verwendet dasselbe redis-server-Binärogramm wie Redis, läuft aber mit dem Flag --sentinel
und einer anderen Konfigurationsdatei. All dies wird natürlich durch diese Ansible-Rolle abstrahiert, aber es ist trotzdem gut zu wissen.
Konfiguration
Um einen Sentinel-Knoten zu einer vorhandenen Bereitstellung hinzuzufügen, weisen Sie diesem denselben redis
-Roll zu und setzen Sie die Variable redis_sentinel
auf True auf diesem bestimmten Host. Dies kann auf verschiedene Weisen erfolgen. Für dieses Beispiel erweitere ich die oben verwendete Inventar-Datei in der Master/Slave-Konfiguration:
[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
Hier haben wir drei weitere Hosts in der redis-sentinel-Gruppe hinzugefügt (obwohl diese Gruppe innerhalb der Rolle keinen Zweck erfüllt, dient sie lediglich als Bezeichner) und die Variable redis_sentinel
in der Inventar-Datei zeilenweise festgelegt.
Jetzt müssen wir nur noch die Variable redis_sentinel_monitors
festlegen, um die Redis-Master zu definieren, die Sentinel überwachen soll. In diesem Fall mache ich das im Playbook:
- name: Konfigurieren des Master-Redis-Servers
hosts: redis-master
roles:
- davidwittman.redis
- name: Konfigurieren der Redis-Slaves
hosts: redis-slave
vars:
- redis_slaveof: redis-master.example.com 6379
roles:
- davidwittman.redis
- name: Konfigurieren der Redis-Sentinel-Knoten
hosts: redis-sentinel
vars:
- redis_sentinel_monitors:
- name: master01
host: redis-master.example.com
port: 6379
roles:
- davidwittman.redis
Dies konfiguriert die Sentinel-Knoten, um den Master zu überwachen, den wir oben erstellt haben, unter Verwendung der Kennung master01
. Standardmäßig verwendet Sentinel ein Quorum von 2, was bedeutet, dass mindestens 2 Sentinels zustimmen müssen, dass ein Master ausgefallen ist, damit ein Failover stattfinden kann. Dieser Wert kann durch Festlegen des Schlüssels quorum
in Ihrer Monitordefinition überschrieben werden. Weitere Einzelheiten finden Sie in den Sentinel-Dokumenten.
Zusätzlich zu den oben aufgelisteten Variablen hat Sentinel eine Reihe eigener Konfigurationsoptionen, genau wie der Redis-Server. Diese sind mit redis_sentinel_
vorangestellt und sind im Abschnitt Rollenvariablen unten aufgeführt.
Mehrfache Rolleneinschlüsse
Wenn Sie die Rolle mehrere Male ausführen müssen, sehen Sie sich test/test_all.yml
an, um zu sehen, wie Sie vorgehen können. Siehe hier und hier für den Kontext.
Erweiterte Optionen
Überprüfung der Prüfziffern
Setzen Sie die Variable redis_verify_checksum
auf true, um die Prüfziffernüberprüfungsoption für get_url
zu verwenden. Beachten Sie, dass dies nur Prüfziffern überprüft, wenn Redis von einer URL heruntergeladen wird, nicht wenn es in einem Tarball mit redis_tarball
bereitgestellt wird.
Bei der Verwendung von Ansible 2.x wird diese Rolle die sha1-Prüfziffer des Downloads mit den in der Variablen redis_checksums
in vars/main.yml
definierten Prüfziffern vergleichen. Wenn Ihre Version hier nicht definiert ist oder Sie die Prüfziffer mit einer eigenen überschreiben möchten, setzen Sie einfach die Variable redis_checksum
. Wie im folgenden Beispiel müssen Sie die Prüfziffer mit dem Typ des verwendeten Hashs voranstellen.
- name: Installieren von Redis auf Ansible 1.x und Überprüfen der Prüfziffern
hosts: all
roles:
- role: davidwittman.redis
redis_version: 3.0.7
redis_verify_checksum: true
redis_checksum: "sha256:b2a791c4ea3bb7268795c45c6321ea5abcc24457178373e6a6e3be6372737f23"
Installation von lokalem Tarball
Wenn die Umgebung, in der Ihr Server betrieben wird, keine Downloads zulässt (d.h. wenn die Maschine in einer DMZ sitzt), setzen Sie die Variable redis_tarball
auf den Pfad eines lokal heruntergeladenen Redis-Tarballs, um ihn anstelle des Downloads über HTTP von redis.io zu verwenden.
Vergessen Sie nicht, die Versionsvariable auf dieselbe Version des Tarballs festzulegen, um Verwirrungen zu vermeiden! Zum Beispiel:
vars:
redis_version: 2.8.14
redis_tarball: /path/to/redis-2.8.14.tar.gz
In diesem Fall wird das Quellarchiv über SSH auf den Server kopiert, anstatt heruntergeladen.
Erstellen von 32-Bit-Binärdateien
Um 32-Bit-Binärdateien von Redis zu erstellen (die zur Speichereinsparung verwendet werden können), setzen Sie redis_make_32bit: true
. Dies installiert die erforderlichen Abhängigkeiten (x86 glibc) auf RHEL/Debian/SuSE und setzt die Option '32bit', wenn make ausgeführt wird.
Erstellen mit TLS-Unterstützung
Um Redis mit TLS-Unterstützung (hinzugefügt in Version 6
) zu erstellen, setzen Sie redis_make_tls: true
. Dies erfordert OpenSSL-Entwicklungslibraries (z.B. libssl-dev auf Debian/Ubuntu).
Rollenvariablen
Hier ist eine Liste aller Standardvariablen für diese Rolle, die auch in defaults/main.yml verfügbar sind. Eines Tages werde ich diese in eine Tabelle oder etwas Ähnliches formatieren.
---
## Installationsoptionen
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"
# Setzen Sie dies auf true, um die Prüfziffer des Redis-Tarballs mit vars/main.yml zu validieren
redis_verify_checksum: false
# Setzen Sie diesen Wert auf einen lokalen Pfad eines Tarballs, der anstelle des Downloads verwendet werden soll
redis_tarball: false
# Setzen Sie dies auf true, um 32-Bit-Binärdateien von Redis zu erstellen
redis_make_32bit: false
# Setzen Sie dies auf true, um Redis mit TLS-Unterstützung zu erstellen, verfügbar nur für Versionen >= 6 (erfordert OpenSSL-Entwicklungslibraries)
redis_make_tls: false
redis_user: redis
redis_group: "{{ redis_user }}"
# Das offene Dateilimit für Redis/Sentinel
redis_nofile_limit: 16384
## Rollenoptionen
# Konfigurieren Sie Redis als Dienst
# Dies erstellt die Init-Skripte für Redis und stellt sicher, dass der Prozess ausgeführt wird
# gilt auch für Redis Sentinel
redis_as_service: true
# Fügen Sie lokale Fakten zu /etc/ansible/facts.d für Redis hinzu
redis_local_facts: true
# Service-Name
redis_service_name: "redis_{{ redis_port }}"
## Netzwerk-/Verbindungsoptionen
redis_bind: false
redis_port: 6379
redis_password: false
# Slave-Replikationsoptionen
redis_min_slaves_to_write: 0
redis_min_slaves_max_lag: 10
redis_tcp_backlog: 511
redis_tcp_keepalive: 0
# Maximale Anzahl von verbundenen Clients zu einem Zeitpunkt
redis_maxclients: 10000
redis_timeout: 0
# Socket-Optionen
# Setzen Sie socket_path auf den gewünschten Pfad zum Socket. Z.B. /var/run/redis/{{ redis_port }}.sock
redis_socket_path: false
redis_socket_perm: 755
## Replikationsoptionen
# Setzen Sie slaveof, genau wie in redis.conf. (z.B. "redis01 6379")
redis_slaveof: false
# Machen Sie Slaves schreibgeschützt. "ja" oder "nein"
redis_slave_read_only: "ja"
redis_slave_priority: 100
redis_repl_backlog_size: false
## Protokollierung
redis_logfile: '""'
# Aktivieren Sie Syslog. "ja" oder "nein"
redis_syslog_enabled: "ja"
redis_syslog_ident: "{{ redis_service_name }}"
# Syslog-Anlage. Muss USER oder LOCAL0-LOCAL7 sein
redis_syslog_facility: USER
## Allgemeine Konfiguration
redis_daemonize: "ja"
redis_pidfile: /var/run/redis/{{ redis_port }}.pid
# Anzahl der Datenbanken, die erlaubt sind
redis_databases: 16
redis_loglevel: notice
# Protokollieren von Abfragen, die langsamer sind als diese Millisekunden. -1 zum Deaktivieren
redis_slowlog_log_slower_than: 10000
# Maximale Anzahl langsamer Abfragen zum Speichern
redis_slowlog_max_len: 128
# Redis-Speichergrenze (z.B. 4294967296, 4096mb, 4gb)
redis_maxmemory: false
redis_maxmemory_policy: noeviction
redis_rename_commands: []
redis_db_filename: dump.rdb
# Wie häufig das Snapshot des Datensatzes auf die Festplatte erfolgt
# z.B. "900 1" => 900 Sekunden, wenn mindestens 1 Schlüssel geändert wurde
redis_save:
- 900 1
- 300 10
- 60 10000
redis_stop_writes_on_bgsave_error: "ja"
redis_rdbcompression: "ja"
redis_rdbchecksum: "ja"
redis_appendonly: "nein"
redis_appendfilename: "appendonly.aof"
redis_appendfsync: "everysec"
redis_no_appendfsync_on_rewrite: "nein"
redis_auto_aof_rewrite_percentage: "100"
redis_auto_aof_rewrite_min_size: "64mb"
redis_notify_keyspace_events: '""'
## Zusätzliche Konfigurationsoptionen
# Leer lassen, wenn nicht erforderlich. Verwenden Sie einen Blockstil-Skalaren, um Optionen hinzuzufügen, z.B.
# redis_config_additional: |
# io-threads 4
# io-threads-do-reads yes
redis_config_additional: ""
## Redis-Sentinel-Konfigurationen
# Setzen Sie dies auf true auf einem Host, um ihn als Sentinel zu konfigurieren
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: []
Fakten
Die folgenden Fakten sind in Ihrem Inventar oder in Aufgaben außerhalb dieser Rolle zugänglich.
{{ ansible_local.redis.bind }}
{{ ansible_local.redis.port }}
{{ ansible_local.redis.sentinel_bind }}
{{ ansible_local.redis.sentinel_port }}
{{ ansible_local.redis.sentinel_monitors }}
Um diese Fakten zu deaktivieren, setzen Sie redis_local_facts
auf einen falschen Wert.
Highly configurable role to install Redis and Redis Sentinel from source
ansible-galaxy install DavidWittman.redis