Redisとは
Redisはインメモリで動作するKey-Valueストア(KVS)ソフトウェアです。Redisのデータはすべてメモリ内に保存されるため、高速なデータの読み書きが可能です。また、単純なキーと値のペアだけでなく様々なデータ構造が利用でき、データの永続化、冗長化、クラスタといった機能を備えており、様々な用途に対応できます。RedisはBSDライセンスの元配布されているオープンソースソフトウェアです。
Redisの特長
豊富なデータ構造
Redisは単純なキーと値のペアだけでなく以下のような様々なデータ型に対応しています。
- Strings: テキストまたはバイナリデータ (最大 512MB)
- Lists: 追加された順に並べられた文字列の集合
- Sets: 順序なしの文字列の集合
- Sorted Sets: スコアで順序付けされた文字列の集合 (ランキングなどに使える)
- Hashes: フィールドと値のリストを保存するデータ構造
- Bitmaps: ビット演算を実行できるデータ型
- HyperLogLogs: データセット内の一意の値の数を推定する確率的データ構造
- Srtreams: (Redis 5以降) ストリーム処理のための追記専用の時系列データ構造
データの永続化
Redisはインメモリデータベースですが、データをディスクに保存しておき、次回起動時にデータを読み込むことで永続化させることができます。
冗長化
Redisはマスター・スレーブ型のレプリケーションに対応しています。マスターの死活監視を行い、自動フェイルオーバーを行うことも可能です。複数のマスターから成るCluster構成をとることもできます。
導入手順
前提
インストール対象の OS として RHEL 7.x / CentOS 7.x を使用します。
1台構成のインストール
Redis の最新バージョンのインストールは Remi リポジトリを利用するのが最も簡単です。今回は Remi リポジトリを用いたインストール方法を紹介します。
1. epel, remiリポジトリのインストール
# yum install epel-release # yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm
2. Redisパッケージのインストール
# yum install --enablerepo=epel,remi redis
3. Redisの起動
# systemctl start redis # systemctl status redis ● redis.service - Redis persistent key-value database Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled) Drop-In: /etc/systemd/system/redis.service.d └─limit.conf Active: active (running) since 火 2019-05-21 15:59:30 JST; 5s ago Main PID: 2391 (redis-server) CGroup: /system.slice/redis.service └─2391 /usr/bin/redis-server 127.0.0.1:6379 5月 21 15:59:30 centos7 systemd[1]: Starting Redis persistent key-value database... 5月 21 15:59:30 centos7 systemd[1]: Started Redis persistent key-value database.
4. OSの設定
RHEL 7.x / CentOS 7.x のデフォルトの OS 設定の場合、 Redis 起動時に以下の警告が出る場合があります。
2391:M 21 May 2019 15:59:30.238 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sy s/net/core/somaxconn is set to the lower value of 128.
TCPバックログ(待ち受け可能なTCPセッション数)のOSのデフォルト値は128ですが、Redisのデフォルトでは511が指定されているため、OSのバックログを拡張します。
# sysctl net.core.somaxconn net.core.somaxconn = 128 # sysctl -w net.core.somaxconn=512 net.core.somaxconn = 512
OS起動時に有効にするには /etc/sysctl.conf に net.core.somaxconn = 512 を追加します。
2391:M 21 May 2019 15:59:30.238 # WARNING overcommit_memory is set to 0! Background save may fail under low m emory 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.
空きメモリが少ない状態でのバックグラウンド保存が失敗するのを防ぐため、OSの overcommit_memory を有効にします。OS起動時に有効にするには同様に /etc/sysctl.conf に vm.overcommit_memory = 1 を追加します。
# sysctl vm.overcommit_memory vm.overcommit_memory = 0 # sysctl -w vm.overcommit_memory=1 vm.overcommit_memory = 1
2391:M 21 May 2019 15:59:30.238 # WARNING you have Transparent Huge Pages (THP) support enabled in your kerne l. 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.
応答時間やメモリ使用量の問題を防ぐため、OSのTransparent Huge Pages (THP)を無効にします。
# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never # echo never > /sys/kernel/mm/transparent_hugepage/enabled # cat /sys/kernel/mm/transparent_hugepage/enabled always madvise [never]
OS起動時に有効にするには /etc/sysconfig/grub の GRUB_CMDLINE_LINUX オプションに transparent_hugepage=never を追加します。
# vi /etc/sysconfig/grub GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 vconsole.keymap=jp106 rd.lvm.lv=centos/root crashkernel=auto rhgb quiet transparent_hugepage=never" # grub2-mkconfig -o /boot/grub2/grub.cfg
上記の修正を反映させるためRedisを再起動します。
# systemctl restart redis
5. 自動起動の有効化
# systemctl enable redis
基本的な使い方
データの保存・取得
Redisのコマンドラインツールredis-cliでRedisを直接操作することができます。
$ redis-cli 127.0.0.1:6379> set hoge 1 #キーに値1を設定 OK 127.0.0.1:6379> get hoge #キーの値を取得 "1" 127.0.0.1:6379> incr hoge #キーの値に1を加算(数値のみ) (integer) 2 127.0.0.1:6379> get hoge #加算されている "2" 127.0.0.1:6379> set fuga "aaa" #キーに文字列を設定 OK 127.0.0.1:6379> get fuga "aaa" 127.0.0.1:6379> keys * #キー一覧を取得 1) "fuga" 2) "mylist" 3) "myset:__rand_int__" 4) "key:__rand_int__" 5) "hoge" 6) "counter:__rand_int__"
Redisはキーの種類によって値を取得するコマンドが異なります。
127.0.0.1:6379> type "myset:__rand_int__" #キーの種類を取得 hash 127.0.0.1:6379> hgetall "myset:__rand_int__" #hashの値を取得 1) "element:__rand_int__" 2) "xxx"
サーバ情報の取得
infoコマンドでRedisサーバのリソース使用状況などの様々な情報を取得できます。Redisサーバの状態の監視に使用することができます。
127.0.0.1:6379> info # Server redis_version:5.0.5 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:619d60bfb0a92c36 redis_mode:standalone ... # Clients connected_clients:1 client_recent_max_input_buffer:2 client_recent_max_output_buffer:0 blocked_clients:0 # Memory used_memory:854344 used_memory_human:834.32K ...
設定の操作
config getコマンドで設定情報を取得します。config setコマンドで一時的に設定を変更することもできます。
127.0.0.1:6379> config get * 1) "dbfilename" 2) "dump.rdb" ... 213) "bind" 214) "127.0.0.1"
セキュリティ
接続元の制限
デフォルトの設定ではローカルホストからのみ接続を受け付けます。他ホストからも接続を受け付けたい場合は、 /etc/redis.conf の以下の行に接続を受け付けたいIPアドレスを追加します。
bind 127.0.0.1 ↓ bind 127.0.0.1 192.168.1.100
なお、bindの行をコメントアウトして無効化し、かつprotected-modeも無効にするとすべてのアドレスから接続を受け付けてしまうためご注意ください。
認証
クライアント接続時に認証を行いたい場合は /etc/redis.conf に以下を追加します。
requirepass <パスワード文字列>
127.0.0.1:6379> get hoge (error) NOAUTH Authentication required. 127.0.0.1:6379> AUTH password OK 127.0.0.1:6379> get hoge "2"
ベンチマーク
RedisにはRedisの性能を測定するredis-benchmarkユーティリティが付属しており、簡単にRedisのベンチマークテストを行うことができます。デフォルトでは各種コマンドを10万回実行して実行時間を測定します。
$ redis-benchmark ====== PING_INLINE ====== 100000 requests completed in 1.50 seconds 50 parallel clients 3 bytes payload keep alive: 1 99.09% <= 1 milliseconds 99.99% <= 2 milliseconds 100.00% <= 2 milliseconds 66711.14 requests per second ... ====== SET ====== 100000 requests completed in 1.45 seconds 50 parallel clients 3 bytes payload keep alive: 1 99.79% <= 1 milliseconds 99.95% <= 2 milliseconds 99.95% <= 16 milliseconds 99.95% <= 18 milliseconds 100.00% <= 18 milliseconds 69156.30 requests per second ...
-q で結果のみ表示します。
$ redis-benchmark -q PING_INLINE: 67024.13 requests per second PING_BULK: 66357.00 requests per second SET: 66050.20 requests per second GET: 65876.16 requests per second INCR: 69013.11 requests per second LPUSH: 70028.02 requests per second RPUSH: 69300.07 requests per second LPOP: 68917.99 requests per second RPOP: 68540.09 requests per second SADD: 68965.52 requests per second HSET: 70274.07 requests per second SPOP: 67521.95 requests per second LPUSH (needed to benchmark LRANGE): 67888.66 requests per second LRANGE_100 (first 100 elements): 39808.91 requests per second LRANGE_300 (first 300 elements): 18372.22 requests per second LRANGE_500 (first 450 elements): 13553.81 requests per second LRANGE_600 (first 600 elements): 10847.16 requests per second MSET (10 keys): 66979.23 requests per second
おわりに
Redisは高機能なソフトウェアですが、上記で紹介したように簡単に導入して試すことができます。実際に利用する場合はアプリケーションからライブラリを通してRedisアクセスすることになります。また、業務で使用する場合は冗長化による信頼性の向上も必要となります。
次回はデータの永続化、バックアップとリストア、冗長化など、実際の運用で必要となる機能について解説します。