ようへいの日々精進XP

よかろうもん

もう一回 redis を使ってみる(1)

概要

  • Key Value Store として MongoDB 等と肩を並べる redis を復習を兼ねてもう一回使ってみる
  • 今回は実際にサービス等での運用も想定した検証を行いたい

redis とは

他の KVS に比べると以下のような特徴があると思われる。


使ってみる

インストール

インストールはソースコードが配布されているのでダウンロードしてコンパイルしてインストールというステップを踏む。最近、個人的にサーバーの設定は出来るだけ Chef でやりたいので cookbook を使ってインストールを行う。cookbook はこちらから。Community Cookbook もアップされているのでどちらを使って頂いても良いかと…いや、Community Cookbook 版を使って下さい…。

とりあえず起動

redis-server を起動する。

/usr/local/bin/redis-server

正常に起動すると以下のように弁当箱みたいなアスキーアートが表示される。

[1243] 15 Jun 13:20:26.651 # Warning: no config file specified, using the d
fig. In order to specify a config file use /usr/local/bin/redis-server /pat
.conf                                                                      
[1243] 15 Jun 13:20:26.654 * Max number of open files set to 10032         
                _._                                                        
           _.-``__ ''-._                                                   
      _.-``    `.  `_.  ''-._           Redis 2.6.13 (00000000/0) 64 bit   
  .-`` .-```.  ```\/    _.,_ ''-._                                         
 (    '      ,       .-`  | `,    )     Running in stand alone mode        
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379                         
 |    `-._   `._    /     _.-'    |     PID: 1243                          
  `-._    `-._  `-./  _.-'    _.-'                                         
 |`-._`-._    `-.__.-'    _.-'_.-'|                                        
 |    `-._`-._        _.-'_.-'    |           http://redis.io              
  `-._    `-._`-.__.-'_.-'    _.-'                                         
 |`-._`-._    `-.__.-'    _.-'_.-'|                                        
 |    `-._`-._        _.-'_.-'    |                                        
  `-._    `-._`-.__.-'_.-'    _.-'                                         
      `-._    `-.__.-'    _.-'                                             
          `-._        _.-'                                                 
              `-.__.-'                                                     

適当にデータを突っ込んでみる

redis-cli を起動してデータを突っ込んでみる。

redis 127.0.0.1:6379> set kappa "ahoaho"
OK

データを取り出してみる

同じく redis-cli を起動してデータを取得してみる。

redis 127.0.0.1:6379> get kappa
"ahoaho"

運用してみる

ソースコード内に redis.conf というファイルが置いてあるので、環境に合わせて編集する。

デーモンとして起動する

redis.conf に以下を記載する。

daemonize yes

ディスクへの書き出しを設定する

同じく redis.conf に書き出し先のディレクトリパスを記載する。もちろん、記載したディレクトリパスを作成しておく。

dir /usr/local/redis

データの書き出しタイミング

データをどのタイミングで書き出すかは resis.conf 内の以下に記載されている。

#   In the example below the behaviour will be to save:                  
#   after 900 sec (15 min) if at least 1 key changed                     
#   after 300 sec (5 min) if at least 10 keys changed                    
#   after 60 sec if at least 10000 keys changed                          
#                                                                        
#   Note: you can disable saving at all commenting all the "save" lines. 
#                                                                        
#   It is also possible to remove all the previously configured save     
#   points by adding a save directive with a single empty string argument
#   like in the following example:                                       
#                                                                        
#   save ""                                                              
                                                                         
save 900 1                                                               
save 300 10                                                              
save 60 10000                                                            
  • 15 分以内に 1 個以上のキーが更新された場合
  • 5 分以内に 5 個以上のキーが更新された場合
  • 1 分以内に 10000 個以上のキーが更新された場合

上記のようなタイミングでディスクへの書き出しが行われるようだ。実際に試してみる。

# pwd                               
/usr/local/redis                                     
# ls -l                             
total 0                                              
# redis-cli                         
redis 127.0.0.1:6379> set kappa "ahoaho"             
OK                                                   
redis 127.0.0.1:6379> get kappa                      
"ahoaho"                                             
redis 127.0.0.1:6379> set inokara "ahoaho"           
OK                                                   
redis 127.0.0.1:6379> get inokara                    
"ahoaho"                                             
redis 127.0.0.1:6379> set huga "ahoaho"              
OK                                                   
redis 127.0.0.1:6379> quit                           
# ls -l /usr/local/redis/        
total 4                                         
-rw-r--r-- 1 root root 93 Jun 15 14:03 dump.rdb                                

ログには下記のように出力される。

[6330] 15 Jun 13:58:40.451 * DB loaded from disk: 0.000 seconds                        
[6330] 15 Jun 13:58:40.451 * The server is now ready to accept connections on port 6379
[6330] 15 Jun 14:03:41.044 * 10 changes in 300 seconds. Saving...                      
[6330] 15 Jun 14:03:41.045 * Background saving started by pid 6577                     
[6577] 15 Jun 14:03:41.050 * DB saved on disk                                          
[6577] 15 Jun 14:03:41.051 * RDB: 0 MB of memory used by copy-on-write                 
[6330] 15 Jun 14:03:41.146 * Background saving terminated with success                 

実際に書きだされたファイルを覗いてみる。

# od -c dump.rdb                                       
0000000   R   E   D   I   S   0   0   0   6 376  \0  \0 001   q 001   t 
0000020  \0 001   b 001   d  \0 004   h   u   g   a 006   a   h   o   a 
0000040   h   o  \0 001   h 001   j  \0 001   p 001   o  \0  \a   i   n 
0000060   o   k   a   r   a 006   a   h   o   a   h   o  \0 001   w 001 
0000100   e  \0 005   k   a   p   p   a 006   a   h   o   a   h   o  \0 
0000120 001   a 001   g 377   u 205 246 177   2   ; 245 031             
0000135                                                                 

ログファイル

素の redis.conf はログ出力が標準出力に設定されているのでファイルにログを出力するように修正する。

loglevel notice            
logfile /var/log/redis.log

再起動

検証したバージョンでは基本的にはサービスの再起動についてはプロセスの kill -HUP で行なっている。


まとめ

  • 他の KVS をちゃんと使ったことが無いがとても簡単に利用すること出来た
  • 定期的にディスクにも書き込んでくれているので永続化もちゃんとしている
  • タイミングに関しても運用に応じて調整は可能なようで引き続き検証していければと思う