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