Redisプロトコル互換のPolarDB for MySQL Orcaを使ってみる

# Redisプロトコル互換のPolarDB for MySQL Orcaを使ってみる

Alibaba Cloudの[PolarDB for MySQL](https://www.alibabacloud.com/ja/product/polardb-for-mysql)では[Orca](https://www.alibabacloud.com/help/ja/polardb/polardb-for-mysql/user-guide/orca/)という機能が提供されています。これはMySQLプロトコルとRedisプロトコル両方を同時にサポートするもので、従来のリレーショナルデータベースの能力を拡張し、NoSQLの柔軟性を組み合わせた統合ソリューションです。

この記事では、PolarDB for MySQL Orcaの特徴とメリットを紹介するとともに、実際に設定して使用する手順についても解説します。

https://www.alibabacloud.com/help/ja/polardb/polardb-for-mysql/user-guide/orca/

# PolarDB for MySQL Orcaとは

Orcaは、PolarDB for MySQLをベースに開発された、Redisプロトコルと互換性のある永続データベース機能です。Orcaを有効化すると、PolarDB for MySQLクラスタは従来のMySQLデータベースとしての機能に加えて、Redisプロトコルを使ったNoSQLの機能も提供できるようになります。

これにより、単一のデータベースクラスタでリレーショナルデータベース(MySQL)とNoSQLデータベース(Redis)の両方のワークロードを処理できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/87564279-aef1-46f4-8427-5a58b3986c85.png)

引用元: [https://www.alibabacloud.com/help/ja/polardb/polardb-for-mysql/user-guide/orca/](https://www.alibabacloud.com/help/ja/polardb/polardb-for-mysql/user-guide/orca/)

従来のKey-Valueデータベースは高いスケーラビリティを提供するために設計されていますが、実際の展開においてはノード間の調整や運用管理の複雑さが課題となることがあります。これらの課題に対応するため、PolarDB for MySQLではOrcaによって単一のクラスターを永続的なKey-Valueデータベースとしても利用できるようになりました。単一のクラスターといってもMySQLデータとOrca(Redisプロトコル)データは互いに分離されています。

PolarDB for MySQLのアーキテクチャをベースに、OrcaはRedisプロトコルの解析とリクエスト処理フレームワークを導入しています。Orca(Redisプロトコル)に関するリクエストはMySQLとは別の専用ポートに接続します。

# 主要なメリット

- 低コスト
    - Orcaを使うために追加のノードリソースを購入する必要はなく、Orcaデータのストレージに対してのみ課金されます。
- 使いやすさ
    - PolarDB for MySQLアーキテクチャをベースにした物理レプリケーションにより、読み書き分離機能を実現。
    - サーバーレス機能と計算ホットスタンバイを備えた水平・垂直な弾力的スケーリングをサポートし、運用オーバーヘッドを効果的に削減。
    - [Global Database Network (GDN)](https://www.alibabacloud.com/help/en/polardb/polardb-for-mysql/user-guide/global-database-networks/)などの新しいPolarDB for MySQL製品形態との互換性。
- データ永続性と強力な一貫性
    - PolarDB for MySQLのストレージエンジンInnoDBをベースに実装され、分散ストレージPolarStoreを使用してデータが失われないことを保証。
    - PolarDB for MySQLの[SCC](https://www.alibabacloud.com/help/en/polardb/polardb-for-mysql/user-guide/global-consistency-high-performance-mode/)技術に基づき、RW/ROノード間での高パフォーマンスかつ強力な一貫性を実現。
- 高性能
    - 高性能InnoDBエンジンをベースに、Blink-treeの高性能インデックス構造と論理プリフェッチ機能を活用し、高並行性の書き込みと読み取りシナリオで大幅なパフォーマンス向上を実現。

# 互換性

OrcaはRedis 7.0以降の特定のコマンドと互換性があり、RESP2およびRESP3プロトコルをサポートしています。現在、単一DBの操作のみがサポートされており、複数のDBに対するコマンド(MOVEなど)はサポートされていないようです。他に、単一キーの最大長はRedisでは512MBですが、Orcaでは4GBと約8倍です。ただし、最適なパフォーマンスを維持するために2560バイト以下のキーサイズであることが推奨されています。

互換性に関する詳細は次のドキュメントを参照: 

https://www.alibabacloud.com/help/ja/polardb/polardb-for-mysql/user-guide/orca-restrictions-on-use

# クラスタの作成とOrcaの有効化

まず、Alibaba CloudコンソールからPolarDB for MySQLクラスタを作成します。

[Alibaba Cloudコンソール](https://home.console.alibabacloud.com/)にログイン済みであることが前提です。

1. [PolarDB](https://polardb.console.aliyun.com/overview)コンソールへアクセスする
    ![overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/424270fd-6ef3-48e7-9eb5-835dbccfecb2.png)

2. **クラスタの作成** から購入画面へ進む
3. 必要なネットワーク設定、スペック(CPU、メモリ)などを選択し、クラスターを作成する。
クラスター作成後、状態が「実行中」になるまで数分待ちます。
    - 課金方法: サブスクリプションまたは従量課金制
    - リージョン: 日本(東京) ※または任意のリージョン
    - データベースエンジン: **MySQL 8.0.2**(Orcaがサポートされるバージョン)
    - Orca機能: **有効化する**
    
    ![create_cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/6eb44dc9-0c41-414f-8d56-d39fefd55d00.png)
    
    次の画面が表示されたら購入が完了
    
    ![created.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/91335056-ddd1-4206-a900-cbe4f832b2c4.png)
    

クラスターの一覧画面

![clusters_list_page_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/e5bfd85d-8f75-4da2-a159-9e4c964b0175.png)

各リージョンに存在するクラスターがひと目でわかるのは便利ですね。

## Orca アカウントの作成

Orcaデータベースに接続するためのアカウントを作成します。

1. クラスタの概要ページで **[アカウント管理]** をクリックする
2. **アカウントの作成** をクリックする
3. 以下の情報を入力する:
    - アカウント名: 任意の名前(例: orca_user)
    - アカウントタイプ: **Orca アカウント** を選択
    - パスワード
4. **OK** をクリックする
    
    ![create_user_account.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/2ab2801e-a1c2-4a72-b1dd-c7197724093e.png)
    

# エンドポイントの確認と設定

クラスタの概要ページにある「データベースへの接続」セクションで、Orca用のエンドポイントを確認できます。

パブリックネットワークから接続する場合は**申請**をクリックしてパブリックアクセス用のアドレスを発行します。

![create_pep_orca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/5f8bd5d2-8548-46c6-a6d3-0ce193c863ff.png)

![creating_pep_orca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/0bf6935d-ed00-4c4f-929d-83752a731b55.png)

## IPホワイトリストの設定

1. クラスターの詳細ページで、左側メニューから **[ホワイトリスト]** をクリックする
2. **IPホワイトリストの追加**をクリックする
3. ホワイトリスト名とIP アドレスを入力して**OK**をクリックする
    
    ![create_whitelist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3804814/c767c1a0-e9f9-451e-b132-e34842f84b41.png)
    

# Redis クライアントからの接続

Redis互換のプロトコルを提供するOrca機能を利用するには、通常のRedisクライアントを使用できます。
ここでは、redis-cliを使った基本的な接続と操作を試してみます。

## redis-cliでの接続

ローカル環境にredis-cliがインストールされていることを前提に、次ののコマンドでOrcaに接続します。

```bash
% redis-cli -h pe-************.rwlb.japan.rds.aliyuncs.com -p 6379 -a 'orca_user:password'
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
```

```bash
pe-************.rwlb.japan.rds.aliyuncs.com:6379> PING
PONG
```

PINGコマンドを実行したところ「PONG」と応答がありました。

```bash
pe-************.rwlb.japan.rds.aliyuncs.com:6379> set test 12345
OK
pe-************.rwlb.japan.rds.aliyuncs.com:6379> get test
"12345"
```

SET, GETコマンドも問題なく実行できています。Redisプロトコルを使った通信が正常におこなえることがわかります。

## パフォーマンスのベンチマーク

続いて、redis-benchmarkを使用してPolarDB for MySQL Orcaのパフォーマンスを測定してみます。

```bash
% redis-benchmark -h pe-************.rwlb.japan.rds.aliyuncs.com -p 6379 -a 'orca_user:password' -q -n 10000
WARNING: Could not fetch server CONFIG
PING_INLINE: 4484.30 requests per second, p50=10.911 msec
PING_MBULK: 4506.53 requests per second, p50=10.887 msec
SET: 1807.99 requests per second, p50=16.831 msec
GET: 4468.28 requests per second, p50=10.919 msec
INCR: 1788.27 requests per second, p50=17.135 msec
LPUSH: 1446.76 requests per second, p50=18.719 msec
RPUSH: 1465.85 requests per second, p50=18.575 msec
LPOP: 1462.84 requests per second, p50=18.831 msec
RPOP: 1442.17 requests per second, p50=18.719 msec
SADD: 1469.72 requests per second, p50=18.735 msec
HSET: 1497.45 requests per second, p50=18.607 msec
SPOP: 4422.82 requests per second, p50=10.951 msec
ZADD: 4222.97 requests per second, p50=11.015 msec
ZPOPMIN: 4304.78 requests per second, p50=11.023 msec
LPUSH (needed to benchmark LRANGE): 1436.16 requests per second, p50=18.799 msec
LRANGE_100 (first 100 elements): 4361.10 requests per second, p50=11.071 msec
LRANGE_300 (first 300 elements): 4170.14 requests per second, p50=11.479 msec
LRANGE_500 (first 500 elements): 3720.24 requests per second, p50=12.303 msec
LRANGE_600 (first 600 elements): 3327.79 requests per second, p50=12.895 msec
MSET (10 keys): 1704.45 requests per second, p50=17.775 msec
Error from server: ERR unknown command XADD, with args beginning with: mystream*myfieldVXK
```

このベンチマーク結果から、PolarDB for MySQL Orcaでは基本的なRedisコマンドがそれなりのパフォーマンスで実行されていることがわかります。一部のコマンド(XADDなど)がサポートされていないことも確認できました。

注意点としては以下

- すべてのRedisコマンドがサポートされているわけではなく、基本的なKey-Valueストア機能に焦点が当てられている。
- Orca機能を有効にした場合、OrcaはPolarDB for MySQLクラスター全体のCPUとメモリリソースを再利用するためワークロード全体に影響する負荷を考慮する。
- Orca機能を有効にすると、自動的に`__orca_in_polardb_m_`という名前のデフォルトのOrcaデータベースが作成される。
- 記事執筆段階ではData Management(DMS)でOrca機能(Redisプロトコル)に接続することができない。

# まとめ

PolarDB for MySQL Orcaを実際に使用してみて、以下のようなシナリオで有用だと感じました。

1. **MySQLとRedisの統合管理:** 従来ではMySQLとRedisを別々に管理する必要がありましたが、PolarDB for MySQL Orcaでは単一のサービスで両方の機能を活用できます。これによって運用の複雑性が軽減されます。
2. **大容量のKey-Valueストア:** 通常のRedisではメモリサイズに制限がありますが、PolarDB for MySQL OrcaではPolarDBの分散ストレージを活用して大容量のデータを保存できます。
3. **データの永続性と一貫性:** メモリベースのRedisでは障害時にデータが失われるリスクがありますが、PolarDB for MySQL Orcaでは永続性が保証されています。

PolarDB for MySQL Orcaを使うことで、単一のデータベースクラスタでMySQLとRedisの両方のプロトコルを利用できます。これにより、アプリケーションの要件に応じて最適なデータアクセス方法を選択できるようになり、インフラの複雑さを軽減しながら両方のデータベースの利点を活用できます。また、Alibaba Cloudの強力な分散ストレージインフラストラクチャがベースとなっているので、データの永続性と一貫性を確保しやすいという点で魅力的な選択肢と言えます。