DavidWittman.redis

ansible-redis

ビルドステータス Ansible Galaxy

  • Ansible 2.4以上
  • Ubuntu/Debian および RHEL/CentOS 6.x のほとんどのバージョンと互換性があります

目次

  1. インストール
  2. はじめに
  3. 単一のRedisノード
  4. マスタースレーブレプリケーション
  5. Redis Sentinel
  6. 高度なオプション
  7. チェックサムの検証
  8. ローカルtarballからのインストール
  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を簡単に実行できます。ホスト名の後にコンマを付ける必要があります。

これで、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
ライセンス
mit
ダウンロード
1.1M
所有者
Dev, Ops, Security, Lens Flares