Redis と php-pecl-redis のインストールメモ(CentOS7.1.1503)

Linux
Linux
スポンサーリンク

Redis(レディス)は、メモリ上でデータの高速な読み書きを可能にする、キーバリューストアを構築するためのソフトウェアです。キーバリューストアの代表格 Memcached と比べると、Redis は高機能で、データの永続化や、データ構造のサポート、データレプリケーション機能など、便利な機能が色々あります。そこで今回は、Redis と php-pecl-redis のインストール手順と、Redis 推奨のシステム設定方法をメモしておきました。

インストール環境

こちらの手順で構築した、CentOS 7.1.1503 に Redis をインストールしました。

Redis と php-pecl-redis のインストール

Remi の yum リポジトリからインストールします。Redis が依存する jemalloc もインストールするため、EPELリポジトリも追加しておきます。

RemiとEPELリポジトリの追加

・Remi

rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
 

・EPEL

rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-8.noarch.rpm
rpm --import http://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7
 

Redis のインストール

2015年7月22日時点のバージョンは 3.0.3-1 です。

yum install -y redis

php-pecl-redis のインストール

yum install -y php-pecl-redis

RemiとEPELリポジトリの無効化

vim /etc/yum.repos.d/remi.repo

[remi]
(略)
enabled=1
 ↓
enabled=0

vim /etc/yum.repos.d/epel.repo

[epel]
(略)
enabled=1
 ↓
enabled=0

・自動起動設定
systemctl enable redis

・起動
systemctl start redis

動作確認

redis-cli

127.0.0.1:6379> set test-key test-value
OK
127.0.0.1:6379> get test-key
"test-value"
127.0.0.1:6379> quit

▽ コマンドリファレンス - redis 2.0.3 documentation
http://redis.shibu.jp/commandreference/

・php-pecl-redis モジュールの読込み確認

php -m | grep redis

redis ←この表示があればOK

・Apacheの再起動
systemctl restart httpd

Redis 推奨のシステム設定

Redis を起動すると以下のような WARNING が発生します。
tail /var/log/redis/redis.log

(略)
1972:M 22 Jul 04:37:29.233 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1972:M 22 Jul 04:37:29.233 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
1972:M 22 Jul 04:37:29.233 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
(略)

それぞれの WARNING の原因です。

  • 1行目 メモリー・オーバーコミットの設定が「1」になっていない
  • 2行目 Transparent Huge Pages (THP) が無効になっていない
  • 3行目 net.core.somaxconn の値が小さすぎる

メモリー・オーバーコミットの設定

デフォルトでは「0」に設定されていますが、これを「1」に変更します。
vim /etc/sysctl.conf
↓下記を追加

vm.overcommit_memory = 1

・設定を反映
sysctl -p

Transparent Huge Pages (THP) の無効化

vim /etc/rc.local
↓下記を追加

echo never > /sys/kernel/mm/transparent_hugepage/enabled
 

・実行権限を追加
chmod +x /etc/rc.d/rc.local

上記の設定だけだと、OS起動時に rc.local が実行されTHPが無効になる前に Redis が起動してしまうため、THPのWARNINGが解消されません。そこで、Redis の起動スクリプトを修正して、rc.local が実行されてから、Redis が起動するようにします。

vim /usr/lib/systemd/system/redis.service
↓下記を変更

After=network.target
 ↓
After=network.target rc-local.service
 

▽ 参考サイト
Redis latency problems troubleshooting – Redis

somaxconn の設定

vim /etc/sysctl.conf
↓下記を追加

net.core.somaxconn = 1024

・設定を反映
sysctl -p

設定の確認

一度OSを再起動します。
shutdown -r now

Redisログに、WARNINGが発生していなければOKです。余談ですが、おかしなログ→「`-.__.-'」があるなと思っていたら、Redisのロゴの一部でした(^^)

tail -n 21 /var/log/redis/redis.log

                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.3 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 1256
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

1256:M 30 May 08:50:59.245 # Server started, Redis version 3.0.3
1256:M 30 May 08:50:59.247 * DB loaded from disk: 0.002 seconds
1256:M 30 May 08:50:59.247 * The server is now ready to accept connections on port 6379

Redis のデータ永続関連の設定

vim /etc/redis.conf
143行目付近

save 900 1
save 300 10
save 60 10000

デフォルトの設定では、以下の条件でメモリ上のデータベースが、ダンプファイル「/var/lib/redis/dump.rdb」に保存されます。

もし最低1回、キーの変更が発生すると、900秒(15分)後
もし最低10回、キーの変更が発生すると、300秒(5分)後
もし最低10,000回、キーの変更が発生すると、60秒後

一般的なキャッシュ用途であれば、デフォルトの設定で十分かと思いますが、Redis を RDB 代わりに使うなど、保存するデータの消失が許されない場合は「appendonly」を「yes」に設定します。

appendonly(yes/no)
Redisはデフォルトでは非同期でデータセットをディスクに書き出します。もし、クラッシュした場合に最新のいくつかのデータが失われても良いのであれば、Redisの実行方法として、これがベストな方法です。もしデータが大切で、1データも失いたくないのであれば、 append_only_mode を有効にすべきです。このモードが設定されると、Redisは appendonly.aof に書き込み操作を受け取るたびにすべて記録していきます。このファイルは起動時に全データセットをメモリ内に構築していくときに読み込まれます。
もし使用したければ、非同期のダンプと、追記専用モードの両方を併用することもできます。もしダンプを止めたければ、 save 文をコメントアウトする必要があります。その場合でも、もし追記専用モードが有効になっているのであれば、Redisは起動時に、ログファイルからデータをロードしようとして、 dump.rdb ファイルを無視します

設定ファイル - mdash; redis 2.0.3 documentation より引用

php-pecl-redis を使った PHP サンプルコード

単純な Key-Value で使うのであれば、使い方は php-pecl-memcache と同じです。インスタンス生成と接続の部分を書き換えれば差し替えができそうですね。

<?php
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

// キー「tabemono」に、値「焼肉」をセット
$redis->set('tabemono', '焼肉');

// キー「tabemono」の値を表示
echo $redis->get('tabemono');

終わりに

Redis のデータ構造の仕組みを使うと、メンバをスコア順に自動でソートしてくれるなど、面白そうな機能が色々ありそうです。機会を見つけてぜひ試してみたいと思います。

コメント

タイトルとURLをコピーしました