以前、Amazon linux 2 で Extras Library から Redis をインストールしてみました。
他にも有名どころでは、Memcached があり、どちらもインメモリデータストアとして人気があるようです。
個人的には10年以上前から、Redis を利用していたので、こちらはなじみがあるのですが、Memcached は利用したことがなかったので、両方インストールして比べてみました。
まず、表面的な比較は、AWS さんのサイトが非常にわかりやすいです。
AWS では、ElastiCache というマネージドサービスを提供していて、安価で簡単に利用できます。
今回は、T4g インスタンスの Amazon Linux 2 に、Extras Library からインストールしてみました。同一インスタンス上の PHP などから、socket (UNIXドメインソケット) 通信する想定で試します。
※各バージョンなどは 2022/12/20 現在
Redis をインストール
手順は以前の投稿と変わりません。Extras Library で redis6 を有効にして、インストールします。
1 2 3 |
amazon-linux-extras enable redis6 yum clean metadata yum install redis |
インストール時のメッセージは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 |
======================================================================================================================== Package Arch Version Repository Size ======================================================================================================================== Installing: redis aarch64 6.2.7-1.amzn2 amzn2extra-redis6 1.1 M Transaction Summary ======================================================================================================================== Install 1 Package Total download size: 1.1 M Installed size: 3.8 M |
ダウンロードサイズが 1.1 M 、インストールサイズは 3.8 M でした。
yum info コマンドで確認すると以下のように表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
Name : redis Arch : aarch64 Version : 6.2.7 Release : 1.amzn2 Size : 3.8 M Repo : installed From repo : amzn2extra-redis6 Summary : A persistent key-value database URL : https://redis.io License : BSD and MIT Description : Redis is an advanced key-value store. It is often referred to as a data : structure server since keys can contain strings, hashes, lists, sets and : sorted sets. : : You can run atomic operations on these types, like appending to a string; : incrementing the value in a hash; pushing to a list; computing set : intersection, union and difference; or getting the member with highest : ranking in a sorted set. : : In order to achieve its outstanding performance, Redis works with an : in-memory dataset. Depending on your use case, you can persist it either : by dumping the dataset to disk every once in a while, or by appending : each command to a log. : : Redis also supports trivial-to-setup master-slave replication, with very : fast non-blocking first synchronization, auto-reconnection on net split : and so forth. : : Other features include Transactions, Pub/Sub, Lua scripting, Keys with a : limited time-to-live, and configuration settings to make Redis behave like : a cache. : : You can use Redis from most programming languages also. |
設定ファイルは、 /etc/redis/redis.conf となります。
変更箇所は以下の3か所で、TCP の listen を止めて、socket通信するようにします。
1 2 3 |
port 0 unixsocket /run/redis/redis.sock unixsocketperm 700 |
ここで、前回つまずいたのですが、元のコメントでは「unixsocket /run/redis.sock」なのですが、そのままコメントを外しても動きませんでした。「unixsocket /run/redis/redis.sock」に修正しています。
systemctl コマンドで、start してプロセスが起動できることを確認したら、enable で自動起動を有効にします。
1 2 |
systemctl start redis systemctl enable redis |
ちなみに、起動スクリプトは /usr/lib/systemd/system/ 以下に格納されていて、enable すると、/etc/systemd/system/ にリンクが作成され、disable するとリンクが削除されます。
Redis の起動スクリプトの内容は以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[Unit] Description=Redis persistent key-value database After=network.target After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/redis-server /etc/redis/redis.conf --daemonize no --supervised systemd ExecStop=/usr/libexec/redis-shutdown Type=notify User=redis Group=redis RuntimeDirectory=redis RuntimeDirectoryMode=0755 [Install] WantedBy=multi-user.target |
RuntimeDirectory と RuntimeDirectoryMode が指定されているので、OS起動時に /run/redis が作成され、オーナーが redis 、パーミッションは 0755 で作成されます。
起動直後のメモリ使用状況はこんな感じ。
1 2 |
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND redis 2157 0.1 1.6 175592 7080 ? Ssl 14:54 0:00 /usr/bin/redis-server unixsocket:/run/redis/redis.sock |
Memcached をインストール
同様に Extras Library で、memcached1.5 を有効にしてインストールします。
1 2 3 |
amazon-linux-extras enable memcached1.5 yum clean metadata yum install memcached |
インストール時のメッセージは以下の通り。
1 2 3 4 5 6 7 8 9 10 11 12 |
======================================================================================================================== Package Arch Version Repository Size ======================================================================================================================== Installing: memcached aarch64 1.5.17-1.amzn2.0.1 amzn2extra-memcached1.5 131 k Transaction Summary ======================================================================================================================== Install 1 Package Total download size: 131 k Installed size: 309 k |
ダウンロードサイズが 131 k 、インストールサイズは 309 k でした。Redis よりも圧倒的に小さいです。Redis は機能がリッチなのに対して、Memcache はシンプルな感じ。
yum info コマンドで確認すると以下のように表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Name : memcached Arch : aarch64 Version : 1.5.17 Release : 1.amzn2.0.1 Size : 309 k Repo : installed From repo : amzn2extra-memcached1.5 Summary : High Performance, Distributed Memory Object Cache URL : https://www.memcached.org/ License : BSD Description : memcached is a high-performance, distributed memory object caching : system, generic in nature, but intended for use in speeding up dynamic : web applications by alleviating database load. |
説明もシンプル。ハイパフォーマンスとうたわれています。
設定ファイルは、 /etc/sysconfig/memcached となります。
元の設定を書き換え、TCP の listen を止めて、socket通信するようにします。
1 2 3 4 5 6 7 8 |
#PORT="11211" USER="memcached" #MAXCONN="1024" #CACHESIZE="64" #OPTIONS="-l 127.0.0.1,::1" MAXCONN="64" CACHESIZE="2" OPTIONS="-s /run/memcached/memcached.sock" |
同時接続数やキャッシュサイズは小さくしました。
Memcached の起動スクリプトの内容は以下のようになっていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/usr/lib/systemd/system/redis.service# It's not recommended to modify this file in-place, because it will be # overwritten during upgrades. If you want to customize, the best # way is to use the "systemctl edit" command to create an override unit. # # For example, to pass additional options, create an override unit # (as is done by systemctl edit) and enter the following: # # [Service] # Environment=OPTIONS="-l 127.0.0.1,::1" [Unit] Description=memcached daemon Before=httpd.service After=network.target [Service] EnvironmentFile=/etc/sysconfig/memcached ExecStart=/usr/bin/memcached -p ${PORT} -u ${USER} -m ${CACHESIZE} -c ${MAXCONN} $OPTIONS # Set up a new file system namespace and mounts private /tmp and /var/tmp # directories so this service cannot access the global directories and # other processes cannot access this service's directories. PrivateTmp=true # Mounts the /usr, /boot, and /etc directories read-only for processes # invoked by this unit. ProtectSystem=full # Ensures that the service process and all its children can never gain new # privileges NoNewPrivileges=true # Sets up a new /dev namespace for the executed processes and only adds API # pseudo devices such as /dev/null, /dev/zero or /dev/random (as well as # the pseudo TTY subsystem) to it, but no physical devices such as /dev/sda. PrivateDevices=true # Required for dropping privileges and running as a different user CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE # Restricts the set of socket address families accessible to the processes # of this unit. Protects against vulnerabilities such as CVE-2016-8655 RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX # Some security features are not in the older versions of systemd used by # e.g. RHEL7/CentOS 7. The below settings are automatically edited at package # build time to uncomment them if the target platform supports them. # Attempts to create memory mappings that are writable and executable at # the same time, or to change existing memory mappings to become executable # are prohibited. ##safer##MemoryDenyWriteExecute=true # Explicit module loading will be denied. This allows to turn off module # load and unload operations on modular kernels. It is recommended to turn # this on for most services that do not need special file systems or extra # kernel modules to work. ##safer##ProtectKernelModules=true # Kernel variables accessible through /proc/sys, /sys, /proc/sysrq-trigger, # /proc/latency_stats, /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq # will be made read-only to all processes of the unit. Usually, tunable # kernel variables should only be written at boot-time, with the sysctl.d(5) # mechanism. Almost no services need to write to these at runtime; it is hence # recommended to turn this on for most services. ##safer##ProtectKernelTunables=true # The Linux Control Groups (cgroups(7)) hierarchies accessible through # /sys/fs/cgroup will be made read-only to all processes of the unit. # Except for container managers no services should require write access # to the control groups hierarchies; it is hence recommended to turn this # on for most services ##safer##ProtectControlGroups=true # Any attempts to enable realtime scheduling in a process of the unit are # refused. ##safer##RestrictRealtime=true # Takes away the ability to create or manage any kind of namespace ##safer##RestrictNamespaces=true [Install] WantedBy=multi-user.target |
こちらは、RuntimeDirectory と RuntimeDirectoryMode が指定されていないので、以下のファイルを作成して、起動時にテンポラリディレクトリを作成するように指定します。
記載内容は次の1行のみ。
1 |
d /run/memcached 755 memcached memcached - |
ちなみに、/var/run は /run へのリンクとなっていました。
OS を reboot して、上記で設定した内容でテンポラリディレクトリが作成されていることを確認したら、systemctl コマンドで、start してプロセスが起動できることを確認し、enable で自動起動を有効にします。
1 2 |
systemctl start memcached systemctl enable memcached |
起動直後のメモリ使用状況はこんな感じ。
1 2 |
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND memcach+ 1846 0.0 0.1 428008 3424 ? Ssl 12:31 0:00 /usr/bin/memcached -p -u memcached -m 2 -c 64 -s /run/memcached/memcached.sock |
AWS の比較表を見ると、Redis のほうができることがたくさんあるけど、インストールサイズや起動時のメモリ使用量が多くなりそう。
Memcached | Redis | |
---|---|---|
ミリ秒未満のレイテンシー | 有 | 有 |
開発者の使いやすさ | 有 | 有 |
データのパーティション | 有 | 有 |
幅広いプログラミング言語のサポート | 有 | 有 |
柔軟なデータ構造 | – | 有 |
マルチスレッドアーキテクチャ | 有 | – |
スナップショット | – | 有 |
レプリケーション | – | 有 |
トランザクション | – | 有 |
Pub/Sub | – | 有 |
Lua スクリプト | – | 有 |
地理空間のサポート | – | 有 |
個人のブログでキャッシュするくらいなら、Memcached でいいのかも。
どちらを選ぶかは、用途や好みでよさそうです。