DavidWittman.redis
ansible-redis
- Ansible 2.4以上
- Ubuntu/Debian および RHEL/CentOS 6.x のほとんどのバージョンと互換性があります
目次
- インストール
- はじめに
- 単一のRedisノード
- マスタースレーブレプリケーション
- Redis Sentinel
- 高度なオプション
- チェックサムの検証
- ローカルtarballからのインストール
- 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を簡単に実行できます。ホスト名の後にコンマを付ける必要があります。
これで、redis01.example.com の127.0.0.1でリッスンしているRedisサーバーができました。デフォルトでは、Redisのバイナリは/opt/redisの下にインストールされますが、redis_install_dir
変数を設定することで上書きできます。
マスタースレーブレプリケーション
Redisでのレプリケーションの設定は、複数のノードをデプロイし、スレーブノードでredis_slaveof
変数を設定することで行います。以下の例では、Redisマスターと3つのスレーブをデプロイします。
この例では、グループを使用してマスターとスレーブノードを分離します。まずインベントリファイルから始めましょう。
[redis-master]
redis-master.example.com
[redis-slave]
redis-slave0[1:3].example.com
そして、プレイブックは次のようになります。
---
- name: マスターRedisサーバーの設定
hosts: redis-master
roles:
- davidwittman.redis
- name: Redisスレーブの設定
hosts: redis-slave
vars:
- redis_slaveof: redis-master.example.com 6379
roles:
- davidwittman.redis
この場合、redis-master.example.com用にDNSレコードを設定していると仮定していますが、必ずしもそうではありません。必要に応じて何でも設定できます。多くの場合、Ansibleにeth1のIPアドレスをマスターに使用するように指示します。将来的を考えると、こちらの柔軟な値もあります。
redis_slaveof: "{{ hostvars['redis-master.example.com'].ansible_eth1.ipv4.address }} {{ redis_port }}"
これで準備は完了です!このプレイブックを実行すれば、Redisマスターと3つのスレーブの準備が整います。
Redis Sentinel
概要
マスタースレーブレプリケーションは耐久性のために素晴らしいですが、高可用性にはあまり適していません。マスターノードが失敗した場合、スレーブを手動でマスターに昇格させ、接続を新しいマスターにリダイレクトする必要があります。この問題の解決策はRedis Sentinelです。これは、Redis自体を使用して通信し、Redisクラスターで自動フェイルオーバーを処理する分散システムです。
Sentinel自体は、Redisが使用するのと同じredis-serverバイナリを使用しますが、--sentinel
フラグで実行され、異なる構成ファイルを使用します。これらはすべて、このAnsibleロールで抽象化されていますが、知っておくと良いでしょう。
設定
既存のデプロイメントにSentinelノードを追加するには、このredis
ロールを同じように割り当て、特定のホストで変数redis_sentinel
をTrueに設定します。この設定はさまざまな方法で実行でき、以下のマスタースレーブ構成で使ったインベントリファイルを拡張します。
[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グループに3つのホストを追加し、インベントリファイル内にredis_sentinel
変数をインラインで設定しました。
今や、redis_sentinel_monitors
変数を設定して、Sentinelが監視するRedisマスターを定義するだけで済みます。この設定はプレイブックの中で行います。
- name: マスターRedisサーバーの設定
hosts: redis-master
roles:
- davidwittman.redis
- name: Redisスレーブの設定
hosts: redis-slave
vars:
- redis_slaveof: redis-master.example.com 6379
roles:
- davidwittman.redis
- name: Redis Sentinelノードの設定
hosts: redis-sentinel
vars:
- redis_sentinel_monitors:
- name: master01
host: redis-master.example.com
port: 6379
roles:
- davidwittman.redis
これにより、上記で作成したマスターを識別子master01
を使って監視するようにSentinelノードが設定されます。デフォルトでは、Sentinelは2つの同意が得られる必要があり、マスターがダウンしたと見なされるため、フェイルオーバーが実行されます。この値は、モニター定義内でquorum
キーを設定することで上書きできます。詳細はSentinelドキュメントを参照してください。
上記でリストされている変数に加えて、SentinelにはRedisサーバーと同様に独自の設定項目もあります。これらはredis_sentinel_
で始まり、ロール変数セクションに列挙されています。
複数のロールの含まれた実行
ロールを複数回実行する必要がある場合は、test/test_all.yml
を確認して手順を確認してください。詳細はこちらとこちらをご覧ください。
高度なオプション
チェックサムの検証
redis_verify_checksum
変数をtrueに設定すると、get_url
のチェックサム検証オプションを使用できます。これは、RedisがURLからダウンロードされるときのみチェックサムを検証し、redis_tarball
でtarballが提供される場合には検証しません。
Ansible 2.xを使用している場合、このロールはvars/main.yml
内のredis_checksums
変数で定義されたチェックサムに対してダウンロードのsha1チェックサムを検証します。バージョンがこの変数に定義されていない場合や、自分自身のチェックサムで上書きしたい場合は、単にredis_checksum
変数を設定します。以下の例のように、使用しているハッシュの種類を接頭辞として付加する必要があります。
- name: Ansible 1.xでRedisをインストールし、チェックサムを検証
hosts: all
roles:
- role: davidwittman.redis
redis_version: 3.0.7
redis_verify_checksum: true
redis_checksum: "sha256:b2a791c4ea3bb7268795c45c6321ea5abcc24457178373e6a6e3be6372737f23"
ローカルtarballからのインストール
サーバーが存在する環境でダウンロードが許可されない(たとえば、DMZにマシンがある場合)場合は、redis_tarball
変数をローカルにダウンロードしたRedis tarballのパスに設定し、HTTPからダウンロードする代わりに使用します。
混乱を避けるためにも、バージョン変数をtarballのバージョンと同じに設定することを忘れないでください!例えば:
vars:
redis_version: 2.8.14
redis_tarball: /path/to/redis-2.8.14.tar.gz
この場合、ソースアーカイブはSSH経由でサーバにコピーされ、ダウンロードされなくなります。
32ビットバイナリのビルド
Redisの32ビットバイナリをビルドするには(これによりメモリ最適化ができます)、redis_make_32bit: true
に設定します。これにより、RHEL/Debian/SuSEに必要な依存関係(x86 glibc)がインストールされ、makeを実行する際に'32bit'オプションが設定されます。
TLSサポートでのビルド
TLSサポート(バージョン6
で追加)を持つRedisをビルドするには、redis_make_tls: true
に設定します。これにはOpenSSL開発ライブラリ(例:Debian/Ubuntuのlibssl-dev)が必要です。
ロール変数
このロールのすべてのデフォルト変数のリストで、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"
# vars/main.ymlに対するredis tarballチェックサムを検証するためにこの値をtrueに設定
redis_verify_checksum: false
# ダウンロードの代わりにインストールに使用するtarballのローカルパスを設定
redis_tarball: false
# Redisの32ビットバイナリをビルドするにはこの値をtrueに設定
redis_make_32bit: false
# TLSサポート付きでRedisをビルドするにはこの値をtrueに設定 (バージョン>=6のみに対応)
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
# Redisのために/local factsを/etc/ansible/facts.dに追加
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
## レプリケーションオプション
# redis.confで行うようにslaveofを設定します。(例:"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 }}"
# 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" ⇒ 1つのキーチェンジごとに900秒
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: ""
## Redis Sentinelの設定
# ホストでこれを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
をfalseに設定します。
Highly configurable role to install Redis and Redis Sentinel from source
ansible-galaxy install DavidWittman.redis