RedisはKey-Value型のデータベースです。
Key-Value型はその名の通りKey(検索するのに使う情報)とValue(実際に必要な情報の中身)で構成されます。
KeyとValueは1対1ですが、実際にはValueに区切り文字を使って、複数の情報を格納したりします。
以下はKey-Value型のデータベースに天気を格納した例です。
9/20 | 晴れ; 32℃; 24℃; 20% |
9/21 | 曇り; 30℃; 23℃; 40% |
9/22 | 雨; 28℃; 23℃; 80% |
この場合、ソフトウェアでKeyである日付を指定すると、Valueにある「;」で区切られた4つの情報「天気」「最高気温」「最低気温」「降水確率」を得ることが出来ます。
あとは、ソフトウェアの側で「;」で分解した情報を利用するという案配です。
なお、Key-Value型のデータベースではValueの値を検索するのは苦手です。上記の例では「最高気温が30℃以上の日」といった検索はかなり難しいです。
前回インストールしたMariaDBのようなリレーショナルデータベースであれば「日付」「天気」「最高気温」「最低気温」「降水確率」と5列作ればそれぞれで条件を付けて検索出来て便利なのに、なぜわざわざKey-Value型のデータベースを使うのでしょうか。
これはKey-Value型の構造が単純で高速化させやすいからです。
また、Redisも含めたKey-Value型のデータベースの多くはディスクドライブ(HDDやSSD)ではなく、メモリ上にデータを保持しているので、なお早いです。
実際に天気のデータを高速に書き換えたり読み出す必要はあまりないでしょうから天気のデータをKey-Value型にする意義は薄いです。
目まぐるしく書き換える必要のある情報、例えば3Dゲームでのキャラクターの座標を扱ったりする際には使えそうですね。
実際にはWebサービスでのキャッシュ(一度読み込まれた情報を高速に呼び出すために保持しておくもの)として使われる事が多く、PHPを使ったサービスの高速化でよく使われます。勿論、Wordpressも例外ではありません。
ちなみに、Key-Value型データベースのようなリレーショナルデータベース以外のデータベースをまとめてNoSQLと言います。SQLではないということです。どれだけデータベースと言えばリレーショナルデータベースとSQLというのが浸透しているかが表れていますね。
この記事で行うこと
1. Redisのインストール
RedisはCentOS8公式のAppStreamリポジトリからもインストールできますが、より新しいバージョンがRemi’s リポジトリにあるのでこちらをインストールしたいと思います。
Remi’s リポジトリを未だインストールしていない場合はこれをインストールします。
※ダウンロードURLが変わっている可能性もあるので、リポジトリの名称を検索するなどして公式ページから最新のURLを確認するようにしてください。
[root@localhost ~]# dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm
次に、Redisのモジュールのバージョンを確認して、最新バージョンをインストールします。
[root@localhost ~]# dnf module list redis
CentOS-8 - AppStream
Name Stream Profiles Summary
redis 5 [d] common [d] Redis persistent key-value database
Remi's Modular repository for Enterprise Linux 8 - x86_64
Name Stream Profiles Summary
redis remi-5.0 common [d] Redis persistent key-value database
redis remi-6.0 common [d] Redis persistent key-value database
ここでは、6.0が最新なので、これをインストールします。
[root@localhost ~]# dnf module install redis:remi-6.0/common
2. 基本的な設定
Redisの設定ファイルは以下にあります。(インストールしたバージョン・インストール元リポジトリによっては別の場所にある可能性があります)
/etc/redis.conf
なお、 /etc/redis-sentinel.conf
というファイルもありますが、これは複数のサーバでRedisを冗長化して可用性を高めるためのものです。自宅サーバで使う事はほぼ無いでしょう。
初期設定では、Redisは127.0.0.1:6379でアクセスすることが出来ます。これはサーバ自身の6379番ポートにTCPで接続するという事です。
php-fpmの説明の時にもお話ししましたが、TCP接続は遅いのでより早いUNIXドメインソケットで接続する設定にしたいと思います。
設定変更の前に、忘れずにバックアップを取るようにしてください。
編集する箇所は以下です。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。
- # unixsocket /tmp/redis.sock
+ unixsocket /run/redis/redis.sock
- # unixsocketperm 700
+ unixsocketperm 660
unixsocket
の設定は /tmp/redis.sock
のままでも構いませんが、今回はphp-fpmに合わせてみました。
また、unixsocketperm
はコメントアウトするだけでなく、数字も660に変えるようにしましょう。
数字の意味は下ページの「ファイルのパーミッション」に記載されています。
設定を変更し終えたら、Redisの起動と有効化を行います。
これはSSHなどと同じく systemctl
を使って行います。
[root@localhost ~]# systemctl enable redis --now
コマンドについては以下のページで解説されています。
さて、これでRedisが使えるようになったと言いたいところですが、このままではUNIXドメインソケットでnginxからRedisを使う事は出来ません。
以下はRedisのUNIXドメインソケットを確認したものです。
[root@localhost ~]# ls -l /run/redis/redis.sock
srw-rw----. 1 redis redis 0 9月 14 20:02 /run/redis/redis.sock
ファイルの所有者・グループが redis
となっていて、更に読み書きできるのはファイルの所有者・グループだけとなっています。
nginxのユーザ・グループは nginx
なので、これではnginxがRedisにアクセスすることは出来ません。
もちろん、先ほど設定した unixsocketperm
を 666
などに変えれば誰でもアクセス出来るようになりますが、これはセキュリティ上あまり好ましくありません。
また、上記のファイルの所有者を nginx
に変えると、今度はRedis自身がアクセスできなくなり本末転倒です。
なので、ここではnginxのユーザ nginx
に redis
グループを付与することでnginxもRedisも上記のファイルにアクセス出来るようにします。
[root@localhost ~]# groupmems --add nginx --group redis
groupmems
: グループに所属しているユーザを追加・削除・参照するためのコマンドです。--add nginx
:--add
はユーザ追加のためのオプションです。他に--delete
や--list
もあり、それぞれ削除・参照を表しています。続けて、対象のユーザ名を記述します。今回はnginx
を指定しています。--group redis
: 対象となるグループを指定します。指定しない場合は、実行したユーザのメインとなるグループに追加されます。仮にrootで実行した場合root
グループに入ってしまいます。
次に nginx
が redis
グループに入ったかを確認します。
[root@localhost ~]# groupmems --list --group redis
nginx
--list
: 前述の通り、グループ内のユーザを参照する際のオプションです。このオプションではユーザ名は指定しません。
これで、 redis
グループに nginx
が入っているのを確認できます。ちなみに redis
自身は当然入っているのでわざわざ表示されません。
また、以下のコマンドで逆に nginx
が入っているグループを参照できます。
[root@localhost ~]# groups nginx
nginx : nginx redis
groups
: ユーザが入っているグループの一覧を確認できます。nginx
:groups
コマンドに続けて対象となるユーザ名を指定します。指定しない場合は実行したユーザが入っているグループの一覧を確認できます。
最後に、php-fpmがRedisを使うにはSELinuxの設定を変更する必要があります。
[root@note ~]# setsebool -P daemons_enable_cluster_mode 1
Redisはクラスターモード(色々なサーバに分散して処理を行うモード)設定があるため、これに接続するためにはphp-fpmもクラスターモードを扱えるように設定する必要がある……んだとおもいます。
まとめ
今回はRedisのインストールとWebアプリで使えるようにするためにnginxからUNIXドメインソケットを使って接続する準備を行いました。
実際の設定は各Webアプリ内の設定で行うため、この記事では触れません。
大抵のWebアプリはRedisが無いならないで動くのですが、高速化の為に使う事が多いです。
必要になった際にインストールすると良いかと思います。
2020/10/15 SELinuxの設定について追記。