お金をかけずにサーバーの勉強をしよう

Redisインストール

2024年1月22日

メニューへ戻る

こんばんは。

私、OSS界隈で人気のあるサーバープロダクトにどんなものがあるか知りたくて、よく dockerhubの explorerを見るんですね。

デフォルトだと「おすすめ順」に出てくるので、どんなのが人気があるか分かるのです。

見たことも聞いたこともないものでも結構☆が多かったりして「試しに味わってみるか」と導入してみることがよくあります。

そんなものの一つが、これ。
Redis

インメモリの KVS(Key Value Store)/NoSQLデータベース ってものなんですが、結構古くからあって、AWSと Azureでは Redisの SaaSがありますね。
(OCIにもあって、GCPは知りません)

私個人的には仕事では使いどころがなかった類のもので、強いて言うと WEBシステムのセッション情報を格納するキャッシュとして使えばレスポンスが良くなるくらいしか認識してませんでした。

でも、もしパブリッククラウドでセッション情報の格納を RDB系の DBaaSに任せた場合、どれくらいのレイテンシが出るか分からなかったので、その環境上でなら Redisを選択したかも知れません。

結局そういう機会には恵まれなかったので使わず終いでしたが、dockerhubでは上位常連のブツだっただけに気にはなっていたのでした。

こちらインストールも使い方も簡単そうなんで、いっちょここでインストールしてみます。


1.環境

以下の環境でやります。

Ubuntu Serverのインストールについては
Ubuntu Linux Serverをインストール」と
Ubuntu Serverの初期設定」に書いています。


2.インストール

※「2」で行っている手順は失敗します。 参考までに残しますので、お急ぎの方は「3.Redisのリポジトリからインストール」へどうぞ。

2024年1月22日時点の Redisの最新版は 7.2.4です。

Ubuntuの(Canonical提供の)パッケージリポジトリですと、aptのが 6.0.16と古く、snapのが 7.2.4になっています。

snapのリポジトリには最新版があり、aptの方は以前からずっと変わらずです。

以下がインストール手順なんですが、Ubuntuの場合は Redisの aptリポジトリを使うのと、snapでやるのが両方とも正攻法ってことで良いようです。
Install Redis on Linux

「snapか…」と思わなくもないのですが、本家サイトのインストール手順に snapの事まで書いてあるならきっと問題が出ないんだろうと信じて snapパッケージを使います。

subro@UbuntuServer2204-1:~$ sudo snap install redis
redis 7.2.4 from Redis (redislabs) installed

難なくインストールできました。

早速動作確認したく、redisのコマンドラインツール「redis-cli」をば…。

subro@UbuntuServer2204-1:~$ which redis-cli

subro@UbuntuServer2204-1:~$

シ〜ン…みたいな。(´·ω·`)

どうせこの辺(/snap)にと思ったら、やっぱりありました。

subro@UbuntuServer2204-1:~$ ls -l /snap/redis/current/usr/bin
合計 44290
-rwxr-xr-x 1 root root 10850728  1月  9 21:02 redis-benchmark
lrwxrwxrwx 1 root root       12  1月  9 21:02 redis-check-aof -> redis-server
lrwxrwxrwx 1 root root       12  1月  9 21:02 redis-check-rdb -> redis-server
-rwxr-xr-x 1 root root 11400992  1月  9 21:02 redis-cli
lrwxrwxrwx 1 root root       12  1月  9 21:02 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 23100336  1月  9 21:02 redis-server

snapってこういう風に付随している実行ファイルについてはあんまり考慮してくれないんだよなぁ…。

[PATH]環境変数に追加するなり、エイリアスを切るなり、やり様は色々あるけど、やっぱり snapって苦手っすわ。
でも Canonicalはこれを進めていますからねぇ…。

redis-cli pingコマンドで、導通を確認できます。

subro@UbuntuServer2204-1:~$ /snap/redis/current/usr/bin/redis-cli ping
/snap/redis/current/usr/bin/redis-cli: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

ええ加減にせいやぁ〜!
って、どうやらこれは、Ubuntu22.04から OpenSSLが 3.0になったからです。

だけど snapってディストリビューションに関係なく使えるんじゃなかったっけか?と訝しがりつつも解決策を探します。

Ubuntuは先の LTSである、20.04(Focal)では、OpenSSL1.1.1を使っていましたが、最新の LTSである 22.04(Jammy)で OpenSSL 3の利用へと大きな変更が入っています。

OpenSSL 3は 1.1.1の完全互換ではないので、Ubuntuをリリースしている Canonicalでは動かなくなるパッケージが出ることは予想しており、OpenSSL 3への対応のお願いについては 22.04(Jammy)リリース前よりアナウンスがされていたようです。

ただ、対応するかどうかは各ソフト側の責任範囲であり、Canonicalが強制できるものでもないので、いくつかのソフトでは取りこぼしがあり、動かないものもあるようなのです。

Redisにおいては、snapパッケージでインストールしたサーバーは問題なく動いているので、サーバーは OpenSSLのライブラリを使っていないか(そんなことないと思いますが)、対応済なんだと思います。

しかし redis-cliコマンドはそうではなかったと言うことなのかも知れません。

この OpenSSL 3への対応の問題について、他にも動かなくなったソフトの例は多くあり、回避策として Debianのパッケージやソースからコンパイルした OpenSSL 1.1.1をインストールしたり、ライブラリファイルのみ持ってきたりと幾つかの方法が紹介されていますが、基本的に OpenSSL 3を使おうというディストリビューション・バージョンにおいては例外的な環境を作るということになり、あまり美しくない気がします。

snapパッケージで入れた Redisのプログラムが動的リンクしているライブラリファイルを確認してみます。

サーバーの方。

subro@UbuntuServer2204-1:~$ ldd /snap/redis/current/usr/bin/redis-server
        linux-vdso.so.1 (0x00007fffc61b3000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb906d48000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fb906d43000)
        libssl.so.1.1 => not found
        libcrypto.so.1.1 => not found
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb906d3e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb906b13000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb9073d7000)

redis-cliの方。

subro@UbuntuServer2204-1:~$ ldd /snap/redis/current/usr/bin/redis-cli
        linux-vdso.so.1 (0x00007ffc7c1f3000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa13db43000)
        libssl.so.1.1 => not found
        libcrypto.so.1.1 => not found
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa13db3e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa13d915000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa13d82c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fa13deac000)

サーバーも redis-cliも、OpenSSL 1系をリンクしていました。

Ubuntuは OpenSSL 3に移行しているけど、Redisの snapパッケージは OpenSSL 1を使うようになっていて、これだとやっぱりダメな気がします。

一旦 Redisをアンインストールしました。

subro@UbuntuServer2204-1:~$ sudo snap remove redis
redis removed

アンインストールできました。
はてさて。


3.Redisのリポジトリからインストール

今度は Redisのリポジトリから、aptパッケージを入れてみます。

インストール手順はこちら。
Install Redis on Linux

手順に従ってインストールします。

作業前提として必要なパッケージに「lsb-release」「curl」「gpg」とありますので、インストールしておきます。
(Ubuntu 22.04.3だと既に入っているかも知れません)

subro@UbuntuServer2204-1:~$ sudo apt install lsb-release curl gpg
〜〜〜 省略 〜〜〜

Redisのリポジトリの公開鍵を OSに登録します。

subro@UbuntuServer2204-1:~$ curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

subro@UbuntuServer2204:~$ echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb jammy main

登録できました。

OSのパッケージデータベースを最新状態にします。

subro@UbuntuServer2204-1:~$ sudo apt-get update
〜〜〜省略〜〜〜

Redisをインストールします。

subro@UbuntuServer2204-1:~$ sudo apt-get install -y redis
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
  redis-server redis-tools
提案パッケージ:
  ruby-redis
以下のパッケージが新たにインストールされます:
  redis redis-server redis-tools
アップグレード: 0 個、新規インストール: 3 個、削除: 0 個、保留: 16 個。
1,725 kB 中 0 B のアーカイブを取得する必要があります。
この操作後に追加で 9,790 kB のディスク容量が消費されます。
以前に未選択のパッケージ redis-tools を選択しています。
(データベースを読み込んでいます ... 現在 138602 個のファイルとディレクトリがインストールされています。)
.../redis-tools_6%3a7.2.4-1rl1~jammy1_amd64.deb を展開する準備をしています ...
redis-tools (6:7.2.4-1rl1~jammy1) を展開しています...
以前に未選択のパッケージ redis-server を選択しています。
.../redis-server_6%3a7.2.4-1rl1~jammy1_amd64.deb を展開する準備をしています ...
redis-server (6:7.2.4-1rl1~jammy1) を展開しています...
以前に未選択のパッケージ redis を選択しています。
.../redis_6%3a7.2.4-1rl1~jammy1_all.deb を展開する準備をしています ...
redis (6:7.2.4-1rl1~jammy1) を展開しています...
redis-tools (6:7.2.4-1rl1~jammy1) を設定しています ...
redis-server (6:7.2.4-1rl1~jammy1) を設定しています ...
redis (6:7.2.4-1rl1~jammy1) を設定しています ...
man-db (2.10.2-1) のトリガを処理しています ...
Scanning processes...
Scanning linux images...

Running kernel seems to be up-to-date.

No services need to be restarted.

No containers need to be restarted.

No user sessions are running outdated binaries.

No VM guests are running outdated hypervisor (qemu) binaries on this host.

インストールされました。

バージョンを確認すると最新版になっています。

subro@UbuntuServer2204-1:~$ redis-server --version
Redis server v=7.2.4 sha=00000000:0 malloc=jemalloc-5.3.0 bits=64 build=44edf16bebe6fed2

今度はどこにインストールされたでしょう。
確認してみます。

subro@UbuntuServer2204-1:~$ which redis-server
/usr/bin/redis-server

subro@UbuntuServer2204-1:~$ which redis-cli
/usr/bin/redis-cli

両方とも [/usr/bin]ディレクトリ以下に配置されていました。

リンクしている動的ライブラリを確認してみます。

subro@UbuntuServer2204-1:~$ ldd /usr/bin/redis-server
        linux-vdso.so.1 (0x00007ffc7fd46000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fdd91756000)
        libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007fdd9168f000)
        libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007fdd915eb000)
        libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007fdd911a8000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fdd90f7f000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fdd91dac000)
        liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007fdd90f54000)
        libzstd.so.1 => /lib/x86_64-linux-gnu/libzstd.so.1 (0x00007fdd90e83000)
        liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007fdd90e63000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007fdd90e58000)
        libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007fdd90d1a000)
        libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007fdd90cf4000)

subro@UbuntuServer2204-1:~$ ldd /usr/bin/redis-cli
        linux-vdso.so.1 (0x00007ffeb45f9000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f47d9515000)
        libssl.so.3 => /lib/x86_64-linux-gnu/libssl.so.3 (0x00007f47d9471000)
        libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f47d902e000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f47d8e05000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f47d9949000)

OpenSSL 3を使うようになっていました。

なんだ、最初からこちらにしておけば良かった、と思っても後の祭りです。
一つ勉強になったと諦めます。

インストールによって systemdで立ち上げる設定も済んでいますし、これで Redisが使えるようになったはずなんですが、デフォルトだとローカルホスト [127.0.0.1] でしか使えないので、外部から使えるようにしましょう。

Redisの設定ファイル [/etc/redis/redis.conf] を以下のように書き換えます。
※IPv6は使ってないので消してしまいました。

bind 127.0.0.1 -::1
  ↓
bind 0.0.0.0

Redisサーバーを再起動します。

subro@UbuntuServer2204-1:~$ sudo systemctl restart redis-server

これでOKなはずです。

サーバー起動時に自動起動するには以下の設定をしておきます。

subro@UbuntuServer2204-1:~$ sudo systemctl enable redis-server
Synchronizing state of redis-server.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redis-server
Created symlink /etc/systemd/system/redis.service → /lib/systemd/system/redis-server.service.
Created symlink /etc/systemd/system/multi-user.target.wants/redis-server.service → /lib/systemd/system/redis-server.service.

これで良いでしょう。


4.動作確認

まずは redis-cliを使っての導通確認です。

subro@UbuntuServer2204-1:~$ redis-cli ping
PONG

エラーもなく動きました。\(^o^)/

実際にデータを入れるテスト。

subro@UbuntuServer2204-1:~$ redis-cli set mykey somevalue  ← キーが[mykey]で値が[somevalue]の行を挿入しています。
OK

subro@UbuntuServer2204-1:~$ redis-cli get mykey  ← キーが[mykey]の行を検索しています。
"somevalue"

良いんじゃないでしょうか。


==========
何だかんだと長くなってしまいましたが、最初から Redisのリポジトリを使ってればアッという間でしたねw

Redisはコマンドラインで使うことはそんなにないと思われ、ここから先はプログラミング言語でデータを入れたり出したりする検証をするべきでしょうから、環境構築はこの辺で終わりです。

AWSも Azureとも、Redisを KVSの DBというよりキャッシュという謳い文句のサービスにしているようです。
実際はそういう使い方が多いってことなんでしょうね。

その一方で高速な Redisを主データベースとして扱うことに可能性を見出している人たちもいるようです。


なお高速が売りの Redisですが、いささか設計が古くなっているらしく、「Redisの25倍速い!」という触れ込みの Dragonfly っていうのがあります。

Linuxの新しいカーネルで使えるようになった I/O のシステムコールを使うことで実現できたのだとか。

当ホームページでは「Dragonflyインストール(Redis互換)(前編)」にて扱っていますので、良ければご覧ください。

Redisと Memcachedと APIがコンパチらしいので、いずれ Redisに取って代わるのかも知れません。
サーバーエンジニアの皆さんは情報を追っておくと良いでしょう。


ちょっと前まで新しい本が無かったんですが、技術評論社より 2022年12月に出ました。