RedisをCentOS7にインストールしてみた

こんにちは。

見習いエンジニアの下地です。

今頂いているお仕事で、Redisを使った構成が必要になりました。

そこで、私も1台構成Redisをインストール&セットアップする手順を調べてみました。

Redisとは?

RedisはインメモリのKVSです。

インメモリ(メモリ上にデータを保存する)

Redisはコンピュータのメモリ上にKVSを構築します。

また、メモリ上に構築されたKVSは定期的にディスクへ保存することもできます。

KVS(Key-Valueストア)である

keyと値の組み合わせでデータを管理します。

従来型のリレーショナルデータベースに比べて、高速にデータを処理できます。

Redisのインストール

yumを使用してインストールができますが、標準リポジトリには含まれていません。

そこで、epelとremiを使用してインストールします。

またepelを先に入れないと依存関係でエラーが出ましたので、epelを先にインストールしています。

epelリポジトリをインストール

# yum -y install epel-release

この時点でyumを使用してredisをインストールできます。

ただ、epelだけだとバージョンが少し古いものが入るようです。

yum info redisと実行するとインストールされる情報が分かります。

# yum info redis
・・・略・・・
利用可能なパッケージ
名前 : redis
アーキテクチャー : x86_64
バージョン : 3.2.10
リリース : 2.el7
容量 : 545 k
リポジトリー : epel/x86_64
要約 : A persistent key-value database
URL : http://redis.io
ライセンス : BSD
・・・略・・・

epelのみだと3.2.10が入るようです。

しかし最新版は4.0.2のため、そっちをインストールしたいと思います。

そのために、epelに加えてremiも入れます。

remiリポジトリをインストール

epelが入りましたので、次にremiもインストールします。

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
http://rpms.famillecollet.com/enterprise/remi-release-7.rpm を取得中
警告: /var/tmp/rpm-tmp.nwVhQa: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 00f97f56: NOKEY
準備しています... ################################# [100%]
更新中 / インストール中...
1:remi-release-7.3-2.el7.remi ################################# [100%]
#

epelとremiを無効化

epelとremiを入れた後に無効化して、必要なときだけenablerepoオプションで使用する形にします。

# sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/epel*
# sed -i 's/enabled=1/enabled=0/g' /etc/yum.repos.d/remi*

Redisをyumでインストール

サードパーティリポジトリが入りましたので、yumでRedisをインストールします。

「--enablerepo=epel,remi」のオプションをつけて一時的にepelとremiを有効化します。

# yum install --enablerepo=epel,remi redis
・・・略・・・
インストール:
redis.x86_64 0:4.0.2-1.el7.remi

依存性関連をインストールしました:
jemalloc.x86_64 0:3.6.0-1.el7

完了しました!

yumでインストールするとjemallocというメモリ最適化のパッケージも一緒に入りました。

ちなみにソースからインストールするとjemallocは入りませんでした。

これでインストールは完了です。

ただ、この状態でredisを起動すると以下3つのwarningが出力されます。

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 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.

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.

それぞれ、

「/proc/sys/net/core/somaxconnの数値が128だけど大丈夫?」

「overcommit_memoryは0だけど1のほうが良いよ」

「THPはOFFのほうが良いよ」

という感じです。

warningを放置するのは気分が悪いので、これらを出ないように設定します。

Redisの初期設定

先ほどの3つのwarningを解決するために、以下の設定を行います。

overcommit_memoryを「1」に設定

Linuxでは実メモリが足りなくなり溢れたスワップ領域も使い切ってしまうと、メモリを確保しているプロセスを強制終了させる仕組みがあります。
「OOM Killer」と呼ばれるものです。
この仕組みの振る舞いを以下の3通りから選択できます。

  • 0:空き容量がなければ実行中のプロセスを強制終了する(デフォルト)
  • 1:制限ギリギリまでメモリがあるように振る舞い、確保できなければ実行中のプロセスを強制終了する
  • 2:空き容量がない場合はエラーを発生させる

Redisでは1が推奨のようなので、0から1に変更します。

# sysctl vm.overcommit_memory
vm.overcommit_memory = 0    ←デフォルトは0になっている
# vim /etc/sysctl.conf
・・・略・・・
vm.overcommit_memory=1    ←ファイルの最終行に追記して上書き保存
# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1

THPをdisableにする

Linuxはpageという単位でメモリを管理しており、従来、1pageは4kb(4096バイト)でした。

そのため、メモリ1MBは256pagesになります。

しかし、メモリの低価格化もあって数GB~数百GB搭載されるケースも多くなっており、これらを4KB単位で処理していると性能が低下します。

この問題の対策の1つがTransparent HugePages(THP)です。

RedisではこのTHPを無効化するようにとのwarningが出ていたので、それに従います。

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never   ←有効になっている。これをneverに変更したい。
# echo never > /sys/kernel/mm/transparent_hugepage/enabled   ←無効化
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]   ←無効になった

ただ、これだと再起動した際に設定がalwaysに戻ってしまいます。

従って更に以下の手順を実施します。

# 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
[Unit]
Description=Redis persistent key-value database
After=network.target rc-local.service    ←「rc-local.service」を追記
・・・略・・・

これでTHP設定は完了です。

net.core.somaxconnの値を修正

net.core.somaxconnはOSレベルの接続キューの最大値として、TCPソケットで待ち受けるサービス全般に影響を与えます。

具体的には「アプリで設定した指定した接続キューの最大数 > net.core.somaxconn設定値」の場合、アプリ側での設定値が大きくても、

net.core.somaxconn設定値がボトルネックになって接続不可になります。

yumでredisをインストールした場合、/etc/redis.confの「tcp-backlog」の値は「511」になっています。

従って、カーネル側パラメタのsomaxconnの値も511に修正しておきます。

# vim /etc/sysctl.conf
・・・略・・・
vm.overcommit_memory=1
net.core.somaxconn = 511    ←最終行に追記
# sysctl -p    ←設定を反映
vm.overcommit_memory = 1
net.core.somaxconn = 511

これで3つのwarning全てが解決されました。

Redisを起動して自動起動も有効化する

最後に起動&自動起動の設定をしておきます。

# systemctl start redis.service
# systemctl enable redis.service

再起動して設定確認

再起動してちゃんと設定ができているか確認をします。

# reboot
・・・再起動実施・・・
# sysctl vm.overcommit_memory
vm.overcommit_memory = 1
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# sysctl net.core.somaxconn
net.core.somaxconn = 511
# systemctl status redis.service
● redis.service - Redis persistent key-value database
Loaded: loaded (/usr/lib/systemd/system/redis.service; enabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/redis.service.d
└─limit.conf
Active: active (running) since 木 2017-11-09 21:14:40 JST; 1min 41s ago
Main PID: 965 (redis-server)
CGroup: /system.slice/redis.service
└─965 /usr/bin/redis-server 127.0.0.1:6379

11月 09 21:14:39 RedisCent7 systemd[1]: Starting Redis persistent key-value database...
11月 09 21:14:40 RedisCent7 systemd[1]: Started Redis persistent key-value database.
# systemctl list-unit-files --type=service | grep redis
redis-sentinel.service disabled
redis.service enabled
#

これでインストールと設定ができました。

最後にちゃんと動作するか確認してみます。

動作確認

Redisは「redis-cli」コマンドでDBを操作できます。

試しにkeyに「name」、valueに「Tama」を登録してみます。

# redis-cli
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> set name "Tama"
OK
127.0.0.1:6379> get name
"Tama"
127.0.0.1:6379> exit

このようにちゃんとデータの登録ができました。

redis.confを使用したチューニングにつきましては、またの機会に書きたいと思います。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA