Redis
CentOS
CentOS6.x

redis.confの設定内容

はじめに

他のRedis構築に関するページは以下をご参考ください。
Redis構築のまとめ

以下の記事を参考にさせていただきました。(多くはこちらを表形式にしたものになります。)
https://qiita.com/uryyyyyyy/items/9ccadcccf7f7060d544a

検証時にredis-clusterかredis-sentinelかで検証したため、各構築の場合の値が記載されている部分があります。

※今回の設定では${REDISPORT}は6379
その他項目もあるので随時調査していく

項目 設定値 内容 コメント
GENERAL
# include /path/to/local.conf
# include /path/to/other.conf
複数の設定ファイルを利用できる
同じパラメータをいじってる場合は最後にincludeされたものが優先される
コメントアウト
daemonize yes デーモン化するときはyes デーモン化するのでyes
pidfile redis_${REDISPORT}.pid デーモン化した時のPID
port ${REDISPORT} クライアント向けの開放ポート
デフォルトのポート番号を使用
tcp-backlog 511 tcp connectionの待ちの上限 デフォルト
protected-mode no 他のサーバからのアクセスを制限する
コメントアウトしてもデフォルトはyesで設定される
alias IPを使用して接続するためnoに設定
bind 192.168.56.111 127.0.0.1
(そのサーバのIPアドレス)
bindするネットワークのインターフェースを限定できる
bind xxx.xxx.xx.xxx 127.0.0.1(そのサーバのIPアドレス)を指定する
alias IPを使用して接続するためコメントアウトに設定
unixsocket
unixsocketperm
クライアントからのコネクションに対してUnix socketで対応する コメントアウト
timeout 0 指定時間を過ぎるとコネクションが切れる(秒)。0ならdisable デフォルト
tcp-keepalive 0 0でなければクライアントへのTCP ACKsに SO_KEEPALIVE を使う(秒)
0が一般的
デフォルト
loglevel notice ログレベル
debug (たくさん。 development/testing向け)
verbose (多すぎない程度にたくさん)
notice (普通。本番向き)
warning (重要なもののみ。玄人 or リソース厳しいときのみ?)
本番向きのnoticeに設定
logfile /var/log/redis/6379.log logfile名
syslog-enabled no loggingにSyslogを使う コメントアウト
syslog-ident redis syslogの識別子 コメントアウト
syslog-facility local0 syslogのfacility、LOCAL0-LOCAL7のどれか コメントアウト
databases 16 databaseの個数。0〜N-1まで作られ、初期の接続先は0 # クラスタ構成するならv3.0では一つしか使えない デフォルト
SNAPSHOTTING
save save ""
■デフォルト
900 1
300 10
60 10000
[A] [B]
save [seconds] [changes]
RDB ファイルを自動的にディスクに保存するタイミングを設定。複数指定可能
# B 回変更されたら、その後 A 秒以内に保存する
保存したくない場合は「save ""」
永続化しないのでsave ""
stop-writes-on-bgsave-error yes RDBスナップショットが有効なのに作成に失敗している(保存できていない)場合は書き込みを受け付けない。デフォルトではyes
これにより、ユーザーは永続化できないのを無理矢理に知ることができる。
デフォルト
rdbcompression yes LZFを使ってrdbを圧縮する
普通はyesだが、どうしてもCPUリソースを削りたいときはno
デフォルト
rdbchecksum yes RDBバージョン5から、 CRC64 checksumがファイル末尾につく
正真性がある、その処理にCPUを取られるので場合によってはnoにする
デフォルト
dbfilename ${REDISPORT}.rdb RDBのファイル名
dir /var/run/redis dbfilenameのファイルや、redisが使う一時ファイルなどを保存する領域
ファイル名でなくディレクトリ名
REPLICATION
slaveof ・sentinelの場合
[masterip] [masterport]
・clusterの場合
コメントアウト
対象のマスタのスレーブとなる
1) レプリケーションは非同期だが、もしレプリカが一定数死んでいれば書き込みを止めることもできる
2) スレーブは、少しのネットワーク障害であれば整合性を回復できる
3) レプリケーションは自動なのでユーザーで気にする必要はない。もしネットワークが瞬断しても自動で復旧する。
masterauth [master-password] もしマスタが認証アリにしていたら、スレーブはまず認証を通ってからでないとレプリケーションできない。(VIP方式を使用する場合はマスタ/スレーブは同じパスワードでないといけない) 任意のパスワードの設定をお願いします
slave-serve-stale-data yes 1) slave-serve-stale-dataが'yes'なら、 古くても多少不整合でもいいからレスポンスを返す
2) slave-serve-stale-dataが'no'なら、 INFO and SLAVEOF以外のコマンドは受け付けない
(redisのスレーブは古い状態もありうるのが一般的なのでyesでよいかと)
デフォルト
slave-read-only yes スレーブが書き込みを受け付けるかどうか。 (直ぐにレプリケーションで消されてしまうが、一時的なデータストアならいい。 しかしクライアントが間違えて使ってしまうケースが起こりうることに注意。 デフォルト
repl-diskless-sync no 注: disklessはEXPERIMENTAL
クラスタに新しく加わった場合は、差分でなくfull syncをする必要がある。これは二種類の方法がある。
1) Disk-backed: マスタがRDBファイルを作りスレーブに転送する。 一度RDBを作ってしまえば、好きなタイミングで送るだけ。
2) Diskless: マスタがスレーブのRDBファイルソケットに直接データを送る。 複数のソケットに同時に送れるが、送信中に他クライアントの追加はできない。 Diskが遅くてネットワークが速いならDisklessの方が良い。(EXPERIMENTALだけど)
デフォルト
repl-diskless-sync-delay 5 Disklessの場合、一定時間待ってからレプリケーションを開始する。
これは、一度転送が始まると後から新規ノードが来ても対応できないため。
デフォルト
repl-ping-slave-period 10 スレーブがマスターに PING を送る間隔を指定(秒)
(ネットワークが安定しているならもう少し短くていいかも)
コメントアウト
repl-timeout 60 重要な点は、この値はrepl-ping-slave-periodよりかなり大きくしないと、
一度pingが通らないくらいでtimeout判定されてしまう。(秒)
コメントアウト
repl-disable-tcp-nodelay no yes
少数のpacketでやりとりして帯域を占領しなくなるが、遅延が起きてしまう。
no
多くのpacketで帯域を占領するが、遅延は少なくなる。 デフォルトはnoだが、ネットワーク環境が悪い場合や、物理的に遠い場合はyesを利用する。
デフォルト
repl-backlog-size 1mb スレーブが一時的にマスタから見えない時に差分データを溜めておく
fullSyncの時には必要ない
このbacklogは、slaveが一つ接続された時のみ作られる(スレーブごとに作られる?)
コメントアウト
repl-backlog-ttl 3600 slaveとの接続が切れて指定時間過ぎたらbacklogが消される。 0ならずっと消さない。 (backlogが消されてからslaveが復帰したら、RDB dumpを取ってくることになる?) コメントアウト
slave-priority 100 Redis Sentinelがスレーブ昇格の際に参考にする優先度
min-slaves-to-write
min-slaves-max-lag
3
10
どちらかの設定が0やコメントアウトしてたらこれらはdisabled この値はただの設定例 (データロストを防ぎたいならキツ目に設定しておく)
書き込みを許容する際のスレーブの最低数
書き込みを許容する際のスレーブの最終接続からの経過時間
コメントアウト
SECURITY
requirepass xxxxxx redis起動時にパスワードが必要になる設定
パスなしのコマンドも受け付けなくなる
任意のパスワードの設定をお願いします
reneme-command CONFIG コメントアウト
LIMITS
maxclients 10000 コネクションの数を制限します
デフォルトは10000クライアント
最大でfile limit -32まで可能(redisは他にもfileを扱うので、多くて困ることはない気がする。)
コメントアウト
maxmemory [bytes] メモリが設定値を超えたら、redisは古いkeyを削除する
もし破棄できなければ、set系のコマンドはエラーを返す(getは問題なし)
デフォルトではLRUを使用
WARNING: slaveを利用している場合は、output bufferにメモリを持って行かれるので注意
maxmemoryはサーバの半分ほどのメモリを使用するとmaxmemoryに達した挙動を行うので、サーバの半分程度のmaxmemoryを設定しておくと良い
メモリ検証(Redis)(随時リンク追加)
コメントアウト
maxmemory-policy volatile-ttl メモリ検証(Redis)参照
maxmemory-samples 5 アルゴリズムの厳密さ? (数値が高ければアルゴリズム[LRUとか]に近くなるがメモリを消費する。低ければいいかげんだが速い) コメントアウト
APPEND ONLY MODE
appendonly no デフォルトでは非同期で永続化するので、あるケースではデータがロストする可能性がある Append Only Fileは、それよりも障害に強いモード デフォルトでは最悪の場合1秒程度のデータロストの可能性がある AOF と RDBへの保存は両立する。AOFの方がデータが飛びにくい Please check http://redis.io/topics/persistence for more information. (消えたくないデータを使っているなら一旦yesでよいかと) デフォルト(永続化しないのでno)
appendfilename appendonly.aof append only fileの名前 コメントアウト
appendfsync everysec OSのfsync()を利用して即座に書き込むようになる、3種類のモードを用意している
no: OSの好きなタイミングでfsyncする。速い
everysec:毎秒書き込む。デフォルト
always:遅いがデータが飛ばない http://antirez.com/post/redis-persistence-demystified.html
デフォルト
no-appendfsync-on-rewrite no fsyncがものすごくIO waitを発生してしまったら、現状防ぐ方法がない この問題を解決するには、BGSAVEが既に起動中ならfsync()のコールを止めること waitが発生して入る場合には "yes" それ以外は"no"のままにすることで耐障害性は高くなる デフォルト
auto-aof-rewrite-percentage 100 指定したパーセントを超えた場合に自動的に AOF を再構成する デフォルト
auto-aof-rewrite-min-size 64mb 指定したサイズ以下の場合には自動的に再構成しない デフォルト
aof-load-truncated yes AOFから復旧した場合、読み終わったAOFファイルを消すかどうか デフォルト
LUA SCRIPTING
lua-time-limit 5000 デフォルト
REDIS CLUSTER
cluster-enabled ・sentinelの場合
no
・clusterの場合
yes
クラスタに参加するには、以下のモードをyesにする必要がある Clusterを使用しないのでno
cluster-config-file nodes-${REDISPORT}.conf Redisノードが、クラスタの状態を永続化するためにcluster-config-fileを用いる。
(これによって再起動時にすぐにクラスタに加わるなどが可能になる。)
cluster-node-timeout 15000 ノードの死活管理の際に用いるミリ秒指定 デフォルト
cluster-slave-validity-factor 10 スレーブは、自身のデータが古いと判断したらマスタに昇格しない dataの古さの明確な指標はないので以下の方法を用いる 1) 複数のスレーブがフェイルオーバー可能な場合、offset値を見て一番新しいスレーブにする 2) マスタと最後に連絡がとれた時間を見て判断する
2は、ユーザーの方で、どのくらい古くても許容するかを指定できる。
(node-timeout * slave-validity-factor) + repl-ping-slave-period

可用性を最大化するためにslave-validity-factorを0にすることができる
これはスレーブが、マスタと以前通信できていても常にフェイルオーバーをしようとする (しかしマスタが生きていればoffsetを更新して終わり) 0は、常にクラスタが生きていられるようにマスタを維持しようとする
コメントアウト
cluster-migration-barrier 1 クラスタは、もしマスタの一部が飛んでも接続を試み続ける。 これは、もしスレーブが昇格するとスレーブいなくなる時に、データを維持し続けることができる。 スレーブは、もしマスタが死んでスレーブの数も十分な場合のみフェイルオーバーする。 その数に達していなければフェイルオーバー(マイグレーション)しない。 デフォルトは1で、0にするとデータのロストがありうるので本番時はおすすめしない。 (スレーブなしのマスタがいると、そいつが死んだらデータは永遠に失われるため。) コメントアウト
cluster-require-full-coverage yes デフォルトでは、あるslotが応答できなくなったら全部のクエリを止める。 これは、もし担当ノードが死んでslotが利用できなくなったら、非同期でクラスタ全体を止める。 slotが復活したら即座に運用を再開する。 もし一部だけでも動かし続けたい場合はここをnoにする。 (あるいはデータのロストや不整合を許容しても可用性を確保したいとき以外はyes) コメントアウト
SLOWLOG
slowlog-max-len
slowlog-log-slower-than
128
10000
特定時間を超えるクエリを特定する。 これにはクライアントとのIOは含まない。 実行待ちは含まず、純粋に処理時間を扱う。 2つのパラメータを設定できる。 len:一つはslowの度合い。(㍉秒) than:もし容量を超えたら古いものが消される デフォルト
LATENCY MONITOR
latency-monitor-threshold 0 インスタンスの遅延度を別プロセスで収集するツール
LATENCYを利用してグラフを表示する。
応答速度の許容値㍉秒(もし0なら表示しない。) (普段は消しておいて、問題が発覚してからonにするでもいいのでは。)
デフォルト
EVENT NOTIFICATION
notify-keyspace-events デフォルト
ADVANCED CONFIG
hash-max-ziplist-entries
hash-max-ziplist-value
512
64
hashエンコードはkeyの数が小さければ効率化する必要があるし、多ければ閾値を超えないようにする必要がある デフォルト
list-max-ziplist-entries
list-max-ziplist-value
512
64
hashと同様にlistも決める必要がある デフォルト