OCI Cache with Redisを試してみる

# はじめに
Oracle Cloud Infrastructure（OCI）でマネージドのRedisサービス（Cache with Redis）がGAになりましたので、試してみます。

https://docs.oracle.com/en-us/iaas/releasenotes/changes/ac53961a-195c-4e30-be4b-4835e53fcebe/

https://docs.oracle.com/en-us/iaas/Content/redis/home.htm


# redis-cliのインストール
Oracle Linuxのサーバにこちらを参考にredis-cliをインストールします。

https://redis.io/docs/getting-started/installation/install-redis-from-source/

https://qiita.com/ajitama/items/ad37d9795e5cfdb840d2


- openssl, gccのインストール

```
$ sudo yum install openssl-devel gcc
This system is receiving updates from OSMS server.
Last metadata expiration check: 0:30:07 ago on Wed 18 Oct 2023 06:28:30 AM GMT.
Package openssl-devel-1:1.1.1k-9.el8_7.x86_64 is already installed.
Package gcc-8.5.0-18.0.5.el8.x86_64 is already installed.
Dependencies resolved.
====================================================================================================================================================
 Package                      Architecture                Version                               Repository                                     Size
====================================================================================================================================================
Upgrading:
 cpp                          x86_64                      8.5.0-18.0.6.el8                      ol8_appstream-x86_64                           10 M
 gcc                          x86_64                      8.5.0-18.0.6.el8                      ol8_appstream-x86_64                           23 M
 libgcc                       x86_64                      8.5.0-18.0.6.el8                      ol8_baseos_latest-x86_64                       91 k
 libgomp                      x86_64                      8.5.0-18.0.6.el8                      ol8_baseos_latest-x86_64                      217 k

Transaction Summary
====================================================================================================================================================
Upgrade  4 Packages

・・・

Upgraded:
  cpp-8.5.0-18.0.6.el8.x86_64        gcc-8.5.0-18.0.6.el8.x86_64        libgcc-8.5.0-18.0.6.el8.x86_64        libgomp-8.5.0-18.0.6.el8.x86_64       

Complete!
```

- redisソースコードのダウンロード

```
$ wget https://download.redis.io/redis-stable.tar.gz
$ tar -xzvf redis-stable.tar.gz
$ cd redis-stable/
$ ls -l
total 248
-rw-rw-r--.  1 opc opc  18320 Sep  6 17:56 00-RELEASENOTES
-rw-rw-r--.  1 opc opc     51 Sep  6 17:56 BUGS
-rw-rw-r--.  1 opc opc   5027 Sep  6 17:56 CODE_OF_CONDUCT.md
-rw-rw-r--.  1 opc opc   2634 Sep  6 17:56 CONTRIBUTING.md
-rw-rw-r--.  1 opc opc   1487 Sep  6 17:56 COPYING
drwxrwxr-x.  8 opc opc    133 Sep  6 17:56 deps
-rw-rw-r--.  1 opc opc     11 Sep  6 17:56 INSTALL
-rw-rw-r--.  1 opc opc    151 Sep  6 17:56 Makefile
-rw-rw-r--.  1 opc opc   6888 Sep  6 17:56 MANIFESTO
-rw-rw-r--.  1 opc opc  22607 Sep  6 17:56 README.md
-rw-rw-r--.  1 opc opc 107512 Sep  6 17:56 redis.conf
-rwxrwxr-x.  1 opc opc    279 Sep  6 17:56 runtest
-rwxrwxr-x.  1 opc opc    283 Sep  6 17:56 runtest-cluster
-rwxrwxr-x.  1 opc opc   1772 Sep  6 17:56 runtest-moduleapi
-rwxrwxr-x.  1 opc opc    285 Sep  6 17:56 runtest-sentinel
-rw-rw-r--.  1 opc opc   1695 Sep  6 17:56 SECURITY.md
-rw-rw-r--.  1 opc opc  14700 Sep  6 17:56 sentinel.conf
drwxrwxr-x.  4 opc opc   8192 Sep  6 17:56 src
drwxrwxr-x. 11 opc opc   4096 Sep  6 17:56 tests
-rw-rw-r--.  1 opc opc   3628 Sep  6 17:56 TLS.md
drwxrwxr-x.  9 opc opc   4096 Sep  6 17:56 utils
```

- コンパイル

```
$ make distclean
cd src && make distclean
make[1]: Entering directory '/home/opc/redis/redis-stable/src'
rm -rf redis-server redis-sentinel redis-cli redis-benchmark redis-check-rdb redis-check-aof *.o *.gcda *.gcno *.gcov redis.info lcov-html Makefile.dep *.so
rm -f adlist.d quicklist.d ae.d anet.d dict.d server.d sds.d zmalloc.d lzf_c.d lzf_d.d pqsort.d zipmap.d sha1.d ziplist.d release.d networking.d util.d object.d db.d replication.d rdb.d t_string.d t_list.d t_set.d t_zset.d t_hash.d config.d aof.d pubsub.d multi.d debug.d sort.d intset.d syncio.d cluster.d crc16.d endianconv.d slowlog.d eval.d bio.d rio.d rand.d memtest.d syscheck.d crcspeed.d crc64.d bitops.d sentinel.d notify.d setproctitle.d blocked.d hyperloglog.d latency.d sparkline.d redis-check-rdb.d redis-check-aof.d geo.d lazyfree.d module.d evict.d expire.d geohash.d geohash_helper.d childinfo.d defrag.d siphash.d rax.d t_stream.d listpack.d localtime.d lolwut.d lolwut5.d lolwut6.d acl.d tracking.d socket.d tls.d sha256.d timeout.d setcpuaffinity.d monotonic.d mt19937-64.d resp_parser.d call_reply.d script_lua.d script.d functions.d function_lua.d commands.d strl.d connection.d unix.d logreqres.d anet.d adlist.d dict.d redis-cli.d zmalloc.d release.d ae.d redisassert.d crcspeed.d crc64.d siphash.d crc16.d monotonic.d cli_common.d mt19937-64.d strl.d cli_commands.d ae.d anet.d redis-benchmark.d adlist.d dict.d zmalloc.d redisassert.d release.d crcspeed.d crc64.d siphash.d crc16.d monotonic.d cli_common.d mt19937-64.d strl.d
(cd ../deps && make distclean)
make[2]: Entering directory '/home/opc/redis/redis-stable/deps'
(cd hiredis && make clean) > /dev/null || true
(cd linenoise && make clean) > /dev/null || true
(cd lua && make clean) > /dev/null || true
(cd jemalloc && [ -f Makefile ] && make distclean) > /dev/null || true
(cd hdr_histogram && make clean) > /dev/null || true
(cd fpconv && make clean) > /dev/null || true
(rm -f .make-*)
make[2]: Leaving directory '/home/opc/redis/redis-stable/deps'
(cd modules && make clean)
make[2]: Entering directory '/home/opc/redis/redis-stable/src/modules'
rm -rf *.xo *.so
make[2]: Leaving directory '/home/opc/redis/redis-stable/src/modules'
(cd ../tests/modules && make clean)
make[2]: Entering directory '/home/opc/redis/redis-stable/tests/modules'
rm -f commandfilter.so basics.so testrdb.so fork.so infotest.so propagate.so misc.so hooks.so blockonkeys.so blockonbackground.so scan.so datatype.so datatype2.so auth.so keyspace_events.so blockedclient.so getkeys.so getchannels.so test_lazyfree.so timer.so defragtest.so keyspecs.so hash.so zset.so stream.so mallocsize.so aclcheck.so list.so subcommands.so reply.so cmdintrospection.so eventloop.so moduleconfigs.so moduleconfigstwo.so publish.so usercall.so postnotifications.so moduleauthtwo.so rdbloadsave.so commandfilter.xo basics.xo testrdb.xo fork.xo infotest.xo propagate.xo misc.xo hooks.xo blockonkeys.xo blockonbackground.xo scan.xo datatype.xo datatype2.xo auth.xo keyspace_events.xo blockedclient.xo getkeys.xo getchannels.xo test_lazyfree.xo timer.xo defragtest.xo keyspecs.xo hash.xo zset.xo stream.xo mallocsize.xo aclcheck.xo list.xo subcommands.xo reply.xo cmdintrospection.xo eventloop.xo moduleconfigs.xo moduleconfigstwo.xo publish.xo usercall.xo postnotifications.xo moduleauthtwo.xo rdbloadsave.xo
make[2]: Leaving directory '/home/opc/redis/redis-stable/tests/modules'
(rm -f .make-*)
make[1]: Leaving directory '/home/opc/redis/redis-stable/src'
```

```
$ make redis-cli BUILD_TLS=yes
・・・
make[2]: Leaving directory '/home/opc/redis/redis-stable/deps'
    CC anet.o
    CC adlist.o
    CC dict.o
    CC redis-cli.o
    CC zmalloc.o
    CC release.o
    CC ae.o
    CC redisassert.o
    CC crcspeed.o
    CC crc64.o
    CC siphash.o
    CC crc16.o
    CC monotonic.o
    CC cli_common.o
    CC mt19937-64.o
    CC strl.o
    CC cli_commands.o
    LINK redis-cli
make[1]: Leaving directory '/home/opc/redis/redis-stable/src'
```

- インストールと確認

```
$ sudo install -m 755 src/redis-cli /usr/local/bin/
$ redis-cli -v
redis-cli 7.2.1
```

# ポリシーの設定
必要に応じてポリシーを設定します。

https://docs.oracle.com/en-us/iaas/Content/redis/permissions.htm


# Redisクラスタの作成

OCIコンソールの`データベース` `Redis` `クラスタの作成`をクリックします。

任意の名称と作成するコンパートメントを選択します。
現時点ではバージョンは7.0.5のみ選択可能です。

![スクリーンショット 2023-10-18 16.28.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/1ca30f0a-c24b-2657-bd5b-84bf48a295b5.png)

ノードの構成を設定します。
メモリはデフォルトの8GBにしました。
ノード数は、プライマリが1ノードで残りはレプリカになります。（5ノードだったら、1プライマリ＋4レプリカ）
今回は1ノードにしました。

![スクリーンショット 2023-10-18 16.28.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/c6494b4f-6adc-607b-04cc-9fadf6363928.png)

プロビジョニングするVCNとサブネットを設定します。
今回はredis-cliをインストールしたインスタンスと同じサブネットにプロビジョニングします。

![スクリーンショット 2023-10-18 16.29.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/012c970f-8551-59b5-b69d-c9c72b512a60.png)

しばらく待つとこのようにstatusがアクティブになります。
後ほどクラスタに接続する際に必要になる`プライマリ・エンドポイント`をコピーしておきます。

![スクリーンショット 2023-10-18 16.36.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/50deb2be-d4fe-985c-f73f-ca977544df98.png)

また、Redisクラスタを作成したサブネットのセキュリティリストに`redis-security-list`が追加されています。

![スクリーンショット 2023-10-18 16.40.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/c52d98ce-3bba-0b45-3cdb-6784830ca812.png)

確認すると、Redisへのアクセスに必要な6379ポートへのイングレスルールが設定されています。

![スクリーンショット 2023-10-18 16.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492530/a3388d9a-e312-8733-50b2-8622ace5b11f.png)

# Redisへの接続と動作確認

プライマリ・エンドポイントを指定して、Redisに接続します。
```
$ redis-cli --tls -h axxxxxxxxxxxxxxxxxxxxxxx-p.redis.ap-osaka-1.oci.oraclecloud.com
```

接続すると、プロンプトが`プライマリエンドポイント:6379> `になります。

Redisへの書き込みと応答を確認します。

```
プライマリエンドポイント:6379> ping
PONG
プライマリエンドポイント:6379> set mykey somevalue
OK
プライマリエンドポイント:6379> get mykey
"somevalue"
```