redisインストール構成および永続化の詳細


一、redisの概要
二、redis取付
三、redisプロファイルの詳細
四、redis持続化の詳細
1.redisの概要
Redisはオープンソース(BSDライセンス)であり、メモリ内のデータ構造ストレージシステムであり、データベース、キャッシュ、メッセージミドルウェアとして使用することができる.文字列(strings)、ハッシュ(hashes)、リスト(lists)、セット(sets)、順序付きセット(sorted sets)、範囲クエリー、bitmaps、hyperlogs、地理空間(geospatial)インデックス半径クエリーなど、さまざまなタイプのデータ構造をサポートします.Redisにはレプリケーション(replication)、LUAスクリプト(Lua scripting)、LRU駆動イベント(LRU eviction)、トランザクション(transactions)、および異なるレベルのディスク持続化(persistence)、Redis哨兵(Sentine)および自動パーティション(Cluster)による高可用性(highavailability)が内蔵されています.
総じて言えば、redisはNoSQLのようなもので、Redisはデータをメモリに格納するため、redisの実行速度は従来のデータベースよりずっと速く、業界のテストによると、最適化された1台は数十万の同時実行をサポートすることができます.
2.redisインストール
公式サイトは最新の安定バージョンをダウンロードします:http://redis.io/
最新の安定バージョン:redis-3.0.7.tar.gz 
#このバージョンではクラスタをサポート
tar -xf redis-3.0.7.tar.gz 
cd redis-3.0.7
make

ディレクトリの作成と必要なファイルのコピー
mkdir -p /usr/local/redis/{conf,bin}
cp *.conf /usr/local/redis/conf/
cp runtest* /usr/local/redis/
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin/

データファイルディレクトリの作成
mkdir -pv /data/redis/db

ログパスの作成
mkdir /data/log/redis -pv

3.プロファイルの詳細
vim/usr/local/redis/conf/redis.conf
daemonize yes
#redis          

pidfile /var/run/redis.pid
#  pid    

port 6379
#  redis     

tcp-backlog 511
#TCP          ,        ,                      。Linux                 /proc/sys/net/core/somaxconn    ,                  。

# bind 127.0.0.1
#  redis     ,      

# unixsocket /tmp/redis.sock
#  redis Linux socket    

timeout 0
#             ;    0      。

tcp-keepalive 0
#       ,                SO_KEEPALIVE    tcp acks     。          60 。

loglevel notice
#      ,  debug,verbose,notice,warning      。

logfile "/data/log/redis/redis.log"
#        

databases 16
#          ,   16 ,         DB 0。

#RDB        
#-------------------------------
save 900 1
#900    key      
save 300 10
#300  10 key  ,    
save 60 10000
#60  10000 key  ,    
#-------------------------------

stop-writes-on-bgsave-error yes
     ,   redis            ,redis         ,                            ,              。               ,redis           。             ,       redis    ,      no   。

rdbcompression yes
#     dump .rdb          LZF      ,      yes              cpu ,       no ,              。

rdbchecksum yes
#    RDB  

dbfilename dump.rdb
#RDB       

dir /data/redis/db
#DB      RDB AOF  

# slaveof  
#  redis      

# masterauth 
#             

slave-serve-stale-data yes
#     slave   master     ,           ,slave         :
#1)     yes ,slave           ,           ,                  
#2)     no ,       info he salveof         ,slave        "SYNC with master in progress"    。

slave-read-only yes
#  salve       , 2.6  ,redis  slave  read-only 。

repl-diskless-sync no
#        :    socket
#  slave     slave             ,       。      RDB  dump  ,   master  slave。       :
# 1)    (disk-backed):master       dump RDB,         (    )    slaves。
# 2)  socket(diskless):master         dump RDB slave socket,      ,     。
#       ,RDB     ,      ,         slave。  socket  ,  slave   ,   (     repl-diskless-sync-delay   ),           。
#   diskless   ,master    repl-diskless-sync-delay   ,   slave   ,    ,        。        。
# disk  ,         ,   diskless。(   disk-based)

repl-diskless-sync-delay 5
#        ,                      RDB  ,           。      ,        ,                           RDB  。                    。          ,   5 。       ,       0 ,       。

# repl-ping-slave-period 10
#   10,  slave  ping master   ;

# repl-timeout 60
#             : 
#1)      ,          I/O 
#2)           (  ,ping) 
#3)           (REPLCONF ACK pings) 
#         repl-ping-slave-period  ,                        。

repl-disable-tcp-nodelay no
#            TCP_NODELAY? 
#     yes,redis       TCP           。                 。linux           40     。 
#    no,            ,            。 
#              ,                    ,     yes     。


# repl-backlog-size 1mb
#           。          ,             ,          ,        ,         ,            ,#                 。 
#      ,                       。 
#         ,            。

# repl-backlog-ttl 3600
#              ,             。                   ,             。   0     。

slave-priority 100
#         redis INFO            。          ,redis sentinel                  。 
#                ,               10, 100, 25,sentinel       10   ,         。 
#       0            ,      0        redis sentinel  。 
#      100

# min-slaves-to-write 3
# min-slaves-max-lag 10
#           ,          N ,    M 。 
#N          。 
#       <=     ,                  ping    。ping       。 
#        N          ,                              。 
#      3        10 ,    
#      0        。

# min-slaves-max-lag is set to 10.
#     default min-slaves-to-write   0(  ) min-slaves-max-lag   10。

# requirepass foobared
#           slave。  ,  redis      ,        150K/S。10 /S。          ,         。

# rename-command CONFIG ""
#      ,   shared   ,        ,  CONFIG,     :        ,            。
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# rename-command CONFIG ""
#    AOF    slave              ~。

# maxclients 10000
    client   。  10000   。

# maxmemory 
#  redis           ,  ,   maxmemory-policy          ,      noeviction。  write    ,  set,lpush 。         。     redis  LRU  ,                   。    slave,              ,        slave output buffers(   noeviction  ,        )

#     。
# volatile-lru -> LRU     ttl key
# allkeys-lru -> LRU    key
# volatile-random ->     ttl key
# allkeys-random ->      key
# volatile-ttl ->    ttl   key
# noeviction ->  , write     

# maxmemory-policy noeviction
#   volatile-lru,      ,     

# maxmemory-samples 5
   3,LRU   TTL         ,         ,             。

appendonly no
#    AOF  

appendfilename "appendonly.aof"
#  AOF   

# appendfsync always
appendfsync everysec
# appendfsync no
#  fsync()              ,      ,    
#always    ,  key        ,          。
#appendfsync everysec        ,    。
# appendfsync no   fsync,           ,    。

no-appendfsync-on-rewrite no
#   no。 AOF fsync     always everysec,            I/O  。  linux   redis        fsync()  。

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#     AOF
#  AOF         ,       BGREWRITEAOF
#  :redis      rewrite aof    (    rewrite  ,     AOF     ),    AOF                。      AOF  ,   2 :1M      。
#  percentage  0,      。

aof-load-truncated yes
# AOF            (  system     ,   mount ext4         data=ordered  。     os  ,redis        )。 redis   load           。
#      ,    redis    ,  load        。
#   aof-load-truncated yes,       log      load(  )。   no,      redis-check-aof  AOF     。

lua-time-limit 5000
#           (  ),redis   log,    error。
#             。  SCRIPT KILL SHUTDOWN NOSAVE   。         write     。       write,         。
#    0    ,     。

# cluster-enabled yes
#         3.0         。

# cluster-config-file nodes-6379.conf
#        

# cluster-node-timeout 15000
#RedisCluster  quorum+     。       ,               Ping,cluster-node-timeout(   ,  )            ,            ,      PFAIL  。


# cluster-slave-validity-factor 10
#        0,  slave   master             failover(    ,        (factor*  TimeOut),    FailOver)。  ,     timeout   5 ,     10,  master slave      50 ,slave   failover  master(       master       ,    )。  :   0         master     slave failover ,  redis     。            master                。

# cluster-migration-barrier 1
#  master       slave  。      ,   master    slave   ,     slave master  ,        slave  。

# cluster-require-full-coverage yes
#       yes(    yes)               (            ,        )             。       no,                   ,      (         )

slowlog-log-slower-than 10000
#                 。    :      (      !,        。)。    log size,   ,       log。
# 1000000   。         log!   0.10S。100  。

slowlog-max-len 128
# log          。      。

latency-monitor-threshold 0
#  LATENCY  redis            。
#                 。0  ,      。      。    CONFIG SET latency-monitor-threshold 

notify-keyspace-events ""
#     pub/sub     key     。http://redis.io/topics/notifications
#         。  client   DEL   “foo”key  database0 。           pub/sub
# PUBLISH __keyspace@0__:foo del
# PUBLISH __keyevent@0__:del foo
#            ,         ,      。

hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# hash    ,        ,     map(encoding      )

list-max-ziplist-entries 512
list-max-ziplist-value 64
#  hash  ,     list                。

set-max-intset-entries 512
#    512, set            ,  set               ,         。

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# hash list  。

hll-sparse-max-bytes 3000
#HyperLogLog   。  16000      ! CPU      , 10000  。   3000.

activerehashing yes
# Active rehashing              rehash table,   rehash      。  redis    ,  rehash          ,          。
#     yes            ASAP。

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# client output buffer  ,                (  redis pub        client    sub)
# client-output-buffer-limit    
# class     :
#
# normal -> normal clients including MONITOR clients
# slave  -> slave clients
# pubsub -> clients subscribed to at least one pubsub channel or pattern
#  hard             。  soft    ,  soft 。
#       32m,soft 16m,10secs。 32m    ,   16m     10secs。
#    0    。

hz 10
# redis    (    timeout    ,    key  )  ,         。   100    CPU                  。   1~500  。

aof-rewrite-incremental-fsync yes
#  child   rewrite AOF  ,       yes,    file 32MB  fsync()。                 I/O  。

3.1.プロファイルの例
daemonize no
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/data/log/redis/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis/db
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes 
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 1024mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

3.2.サービスの開始
# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

サービスの表示
# ps -ef | grep redis
root     24596 23241  0 14:52 pts/1    00:00:00 /usr/local/redis/bin/redis-server *:6379                          
502      24646 21849  0 14:52 pts/2    00:00:00 grep redis

4.永続化の説明
4.1.2つの永続化の説明
Redisは、さまざまなレベルの永続化方法を提供します.
(1)RDB永続化は、指定された時間間隔でデータセットのポイント・イン・タイム・スナップショットを生成することができる.
(2)AOFは,サーバが実行するすべての書き込み操作コマンドを永続化し,サーバ起動時にこれらのコマンドを再実行することでデータセットを復元する.AOFファイルのコマンドはすべてRedisプロトコル形式で保存され、新しいコマンドはファイルの末尾に追加されます.Redisはまた、AOFファイルをバックグラウンドで書き換えることができ、AOFファイルのボリュームがデータセット状態を保存するのに必要な実際のサイズを超えないようにすることができる.
(3)Redisはまた、AOF持続化とRDB持続化を同時に使用することができる.この場合、Redisが再起動されると優先的に使用されます.
AOFファイルは、AOFファイルが保存するデータセットが通常RDBファイルが保存するデータセットよりも完全であるため、データセットを復元するために使用される.
(4)サーバの実行時にのみデータが存在するように、永続化機能をオフにすることもできます.
RDB持続化とAOF持続化の間の異同を理解することは非常に重要であり,以下のいくつかのセクションでは,この2つの持続化動作を詳細に説明する.
はい、それらの同じところと違うところを説明します.
4.2.RDBの長所と短所
4.2.1.RDBはちょっと
(1)RDBは、ある時点におけるRedisのデータセットを保存する非常にコンパクトなファイルである.このファイルはバックアップに適しています.たとえば、最近の24時間以内にRDBファイルを1時間に1回バックアップし、毎月の毎日に1つのRDBファイルをバックアップすることができます.これにより、問題が発生しても、いつでもデータセットを異なるバージョンに復元することができます.
(2)RDBはディザスタリカバリ(disaster recovery):ファイルが1つしかなく、コンテンツが非常にコンパクトで、(暗号化後)他のデータセンター、またはアマゾンS 3に転送することができます.
(3)RDBはRedisの性能を最大化することができる:親プロセスはRDBファイルを保存する時に唯一しなければならないのはforkがサブプロセスを出して、それからこのサブプロセスは次のすべての保存作業を処理して、親プロセスはいかなるディスクI/O操作を実行する必要はありません.
(4)RDBのビッグデータセットの復元速度はAOFの復元速度よりも速い.
4.2.2.RDBの欠点
(1)サーバ障害時にデータを失うことをできるだけ避ける必要がある場合は、RDBはあなたに適していません.Redisでは、異なるセーブポイントを設定してRDBファイルを保存する頻度を制御できますが、RDBファイルはデータセット全体の状態を保存する必要があるため、簡単な操作ではありません.そのため、少なくとも5分でRDBファイルを保存することができます.この場合、障害が発生して停止すると、数分間のデータが失われる可能性があります.
(2)RDBを保存するたびに,Redisはfork()からサブプロセスを取り出し,サブプロセスによって実際の永続化作業を行う.データセットが膨大な場合、fork()は非常に時間がかかり、サーバがミリ秒以内にクライアントの処理を停止する可能性があります.データセットが非常に大きく、CPU時間が非常に緊張している場合、この停止時間は丸1秒にも及ぶ可能性があります.AOF書き換えもfork()が必要であるが,AOF書き換えの実行間隔がどれだけ長くてもデータの耐久性に何ら損失はない.
 4.3.AOFメリットとデメリット
 4.3.1.AOFの利点
(1)AOF持続化を使用するとRedisは非常に耐久性があります(much more durable):fsyncなし、毎秒1回fsync、または書き込みコマンドを実行するたびにfsyncなどの異なるfsyncポリシーを設定できます.AOFのデフォルトポリシーは、毎秒fsyncです.この構成では、Redisは依然として良好なパフォーマンスを維持し、障害が発生してダウンタイムしても、最大1秒のデータしか失われません(fsyncはバックグラウンドスレッドで実行されるので、メインスレッドはコマンド要求を処理するために努力し続けることができます).
(2)AOFファイルは追加操作のみを行うログファイル(append only log)であるため、AOFファイルへの書き込みにseekを行う必要はなく、ログに何らかの理由で書き込みが完了していないコマンド(書き込み時にディスクがいっぱいになったり、書き込みが途中で停止したりするなど)が含まれていても、redis-check-aofツールはこの問題を簡単に修復することができる.
(3)Redisは、AOFファイルのボリュームが大きすぎると、自動的にバックグラウンドでAOFを書き換えることができる:書き換えられた新しいAOFファイルには、現在のデータセットを復元するために必要な最小コマンドセットが含まれている.Redisは新しいAOFファイルを作成する過程で、既存のAOFファイルにコマンドを追加し続けるため、書き換え中にダウンタイムが発生しても、既存のAOFファイルは失われません.新しいAOFファイルの作成が完了すると、Redisは古いAOFファイルから新しいAOFファイルに切り替え、新しいAOFファイルの追加操作を開始します.
(4)AOFファイルはデータベースに対して実行されるすべての書き込み操作を秩序正しく保存しており,これらの書き込み操作はRedisプロトコルの形式で保存されているため,AOFファイルの内容は非常に読みやすく,ファイルの解析(parse)も容易である.エクスポート(export)AOFファイルも簡単です.たとえば、FLUSHALLコマンドをうっかり実行したが、AOFファイルが書き換えられていない限り、サーバを停止し、AOFファイルの末尾にあるFLUSHALLコマンドを削除し、Redisを再起動すれば、データセットをFLUSHALL実行前の状態に戻すことができます.
 4.3.2.AOF欠点
(1)AOFファイルの体積は、同じデータセットの場合、通常、RDBファイルの体積よりも大きい.
(2)使用するfsyncポリシーによっては、AOFの速度がRDBよりも遅くなる可能性がある.一般的に、毎秒fsyncの性能は依然として非常に高く、fsyncを閉じることで、高負荷でもAOFの速度をRDBと同じように速くすることができる.しかし、大きな書き込みロードを処理する場合、RDBは、より保証された最大遅延時間(latency)を提供することができる.
(3)AOFは過去に,個別の命令により,AOFファイルの再読み込み時にデータセットを保存時のままに復元できないというバグが発生していた.△たとえば、ブロックコマンドBRPOLPUSHは、このようなバグを引き起こしたことがある.テストキットには、ランダムで複雑なデータセットが自動的に生成され、これらのデータを再ロードすることですべてが正常であることを確認するテストが追加されています.このようなバグはAOFファイルではあまり見られないが,比較的RDBではこのようなバグはほとんど起こり得ない.
まとめ:どのように使用するかは、ビジネスによって異なります.データが重要なのか、パフォーマンスが重要なのか、安全のために両方を使用することをお勧めします.