t-suzuki 雑記ノート

主に技術の話

redis設定について自分メモ

これはなに

redis設定をした時の検討項目。 devで設定したのみでまだ本番で使っていないのであまいところはあるかも。

設定diff

以下は redis-3.2.8 に同梱されていた設定ファイルとplaybook template とのdiff。

diff /tmp/redis.conf roles/install_redis/templates/redis.conf.j2
1c1,3
< # Redis configuration file example.
---
> # USAGE: {{ item.USAGE }}
> # Redis configuration file.
> # This configuration is based on redis-3.2.8 default configuration file.
61c63,64
< bind 127.0.0.1
---
> {# bind: 特に認証はかけない。やるならサーバが居るネットワークセグメントごとに裏からのみ疎通できるようにするなどの設定をいれる。 -#}
> # bind
80c83,84
< protected-mode yes
---
> {# protected-mode: キャッシュサーバはインターネットに直接露出しなければ切っておいてもよいかもしれない -#}
> protected-mode no
84c88,89
< port 6379
---
> {# port: 同一サーバ内に別ポートで複数インスタンスを立ち上げることができるようにしておきたい -#}
> port {{ item.PORT }}
93c98,99
< tcp-backlog 511
---
> {# tcp-backlog: これと一緒にsomaxconnもsysctlで設定しておく必要がある。TCPの接続要求を格納するキューの最大長なので、front系サーバapacheがある程度詰まっても大丈夫な値にしておくのがよさそう -#}
> tcp-backlog 2500
104a111
> {# timeout: idle状態のコネクションはタイムアウトさせない(デフォルト設定)。アプリケーションが側できちんと切断処理がされていれば問題にならないはず-#}
127a135
> {# daemonize: 直接redis-serverコマンドにこの設定ファイルを食わせて起動した場合にはデバッグのためにdaemonize noでよい。systemctlで起動した場合にはこの設定に関わらずデーモン化される -#}
150c158,159
< pidfile /var/run/redis_6379.pid
---
> {# pidfile: 一応設定しているが、systemdではpidファイルは不要 -#}
> pidfile /var/run/redis_{{ item.PORT }}.pid
163c172,173
< logfile ""
---
> {# logfile: redisユーザに権限があるディレクトリにログを吐くようにしておく。ローテートも忘れずに。redisはログを吐くごとにファイルを開き直すのでSIGHUPなどは不要。 -#}
> logfile "{{ REDIS_LOG_DIR }}/redis.log"
177a188
> {# database: keyspaceが独立したdatabaseを何個にするか。使えるDatabaseがの数が大きくてもデフォルトは0が使われるので細かい値はなんでもよさそう。dev, productionとかで使う用途を想定しているみたい。-#}
201c212,216
<
---
> {# save: redisが死んでて復旧した時にRDBには古いデータが残っている。しかしexpireは実時間基準なのできちんと古いデータは消えておいてくれる。
> RDBを取る時に親プロセスがやるのは子プロセスをforkさせるだけなので、親インスタンスにdisk I/Oが発生して待ちになることはないとのこと。あまりにもデータが大きいもしくはCPUがいまいちな場合にはforkに時間かかるのでclientへのレスポンス遅れることもあるらしい。
> RDBの方がAOFをよりも起動が早く、データサイズも小さいのがメリット。マスタデータはredisには無ければ厳密に永続化を考えなくても良い。パフォーマンスが落ちない程度に使う方針。
> 設定はデフォルトで問題なさそうならそのまま。
> -#}
219c234,235
< stop-writes-on-bgsave-error yes
---
> {# stop-writes-on-bgsave-error: persistentが止まるよりもwriteが止まるほうが不都合。TODO 適切な監視はほしい。 -#}
> stop-writes-on-bgsave-error no
224a241
> {# rdbcompression: 多少CPUを使っていても圧縮しておいてくれた方が良い。あまりにCPU不可が高くなりそうなら変えても良い。 -#}
233a251
> {# rdbchecksum: 10%程度の性能劣化はあるがRDBファイルの破損の検知は入れたままでもよさそう。 -#}
247c265,266
< dir ./
---
> {# dir: ファイル名はデフォルトで良いが、保存先は適切なpermissionの場所に配置しなければならない。-#}
> dir {{ REDIS_DATABASE_DIR }}
265c284,288
< # slaveof <masterip> <masterport>
---
> # slaveof <masterip> <masterport>
> {# slaveof: 設定に書かないでDBと同じようにコマンドで指定するのもあり。ただしmysqlの場合にはchange master toではその設定がファイルに保存される。redisの場合には設定に書いてないと再起動時に消えてしまうと思われる。意図せず消えてしまうか、意図しないmasterを向いているかで比較的後者の方が事故が少ないと考えてファイルに記載する。原則としてシステムに組み込むときにはmasterノードがどれか確認してから組み込むのがよい。 -#}
> {% if REPL_NODE=="slave" %}
> slaveof {{ REDIS_MASTER_NAME }} {{ REDIS_MASTER_PORT }}
> {% endif %}
284a308
> {# slave-serve-stale-data: レプリケーション遅延で多少古いデータが帰ってしまったとしてもエラーを返すよりマシかもしれない(デフォルト) -#}
300a325,326
> {# slave-read-only: masterとの再同期によりslaveのみに保持されたデータは削除されるのでslaveに一時的に書き込みたいデータを書いておく用途に使える。特に使いたい理由がなければreadonlyのほうがよい(デフォルト)。
> -#}
414c440,441
< slave-priority 100
---
> {# slave-priority: 基本的には変更しないが、仮にmasterにしたくないslaveを作ることになったらansible EXTRA_VARSで0に設定できるようにしておく。-#}
> slave-priority {{ REDIS_SLAVE_PRIORITY | default("100") }}
511a539
> {# maxclients: 十分に大きいのでデフォルトのままでよい。pconnect使うならそれを意識して増やしておいたほうがよい。コネクションの数の監視も必要だろう-#}
537a566,570
> {% if ENVIRONMENT == "production" -%}
> maxmemory {{ item.MAXMEMORY }}
> {% else %}
> maxmemory 1G
> {% endif %}
592c625
<
---
> {# appendonly: redisにはマスタデータは乗らなければ永続化より性能を重視してOffにしておく。 -#}
623,624c656,657
< appendfsync everysec
< # appendfsync no
---
> # appendfsync everysec
> appendfsync no
834a868
> {# slowlog-log-slower-than: デフォルトでも秒に直すと0.01秒なので十分小さいのでそのままでよい。-#}
838a873
> {# slowlog-max-len: ここで設定した以上古いログは消えてしまう。まずはデフォルトで良い。あとで値を上げたければCONFIG SETコマンドを用いて設定できる。ログを見るためにはSLOWLOG GETコマンドを用いる -#}
905a941
> {# notify-keyspace-events: TODO 何かに使えそう。更新されたらPUBされるので他のサーバが更新を検知できる。サーバリストなど。PUBされた時にSUBしているサーバが接続していなければ受け取れないので注意が必要。pub/subを使いつつ、定期的に値を見直すなどを使えば信頼性をあるていど担保できるかもしれない。 -#}