この記事はMySQL 8.2 – transparent read/write splittingの翻訳版です。

MySQLで読み取り・書き込み分離が可能になりました。

規模が大きいシステムの場合、読み取りはレプリカ間で分散しますが、これにはアプリケーション側での何らかの管理が必要です。つまり、どこに書き込みどこに読み取りに行くのか指定しなければなりません。

MySQL 8.2では、MySQL Routerが読み取りと書き込みを認識し、InnoDB Clusterのプライマリ・インスタンスまたは非同期レプリケーションのソースに書き込みを、セカンダリ・インスタンスまたはレプリカに読み取りをルーティングできます。

MySQL8.2 Router' Feature

 

MySQL InnoDB ReplicaSetを例に下記に説明していきます。
 

MySQL InnoDB ReplicaSet

図はレプリケーションのソース・インスタンスと、非同期レプリケーションのレプリカ・インスタンスを示しています。

MySQL InnoDB ReplicaSet

下の例では、ReplicaSetオブジェクトのステータスをMySQL Shellで確認しています。
※ 訳者注: ReplicaSetの構築については、Webマニュアルを参照して下さい。

MySQL InnoDB ReplicaSet Status

MySQL Router 8.2をブートストラップ

ブートストラップによってMySQL Routerを設定をします。
※ 訳者注: MySQL Routerの設定については、Webマニュアルを参照して下さい。

MySQL Router Bootstrap

MySQL ShellのReplicaSetオブジェクトで、ルータを確認します。

ReplicaSet's Router List

MySQLに読み取り・書き込みポート(6450)で接続します。
※ 訳者注: 本検証における実施環境は、下の概略図のようになります。
MySQL8.2 Router Verification Environment

 

読み取りを実行すると、デフォルトでレプリカ(セカンダリ・インスタンス)に到達することが確認できます。トランザクションが開始されると、ポートを変えずに同じ接続で、ソース(プライマリ・インスタンス)に到達します。

※ 訳者注: 下記は実行コマンド例です。
ポート6450で接続すると、自動でレプリカ(3320)にアクセスします。

select @@hostname, @@port;

トランザクションを開始すると、ポート6450に接続することにより自動でソース(3310)に到達します。

start transacton;
select @@hostname, @@port;
rollback;

Testing Read/Write Splitting

読み取り専用トランザクションを開始すると、接続先が3320に変わります。

※ 訳者注: 下記は実行コマンド例です。
読み取り専用トランザクションを開始すると、自動でレプリカ(3320)に到達します。

start transaction read only;
select @@hostname, @@port;
rollback;

Read Only Transaction Example

MySQL Routerの設定ファイルで、生成された読み取り・書き込み分離の設定を確認することができます。(※ 訳者注: /etc/mysqlrouter/mysqlrouter.conf など)

[routing:bootstrap_rw_split]
bind_address=0.0.0.0
bind_port=6450
destinations=metadata-cache://myreplica/?role=PRIMARY_AND_SECONDARY
routing_strategy=round-robin
protocol=classic
connection_sharing=1
client_ssl_mode=PREFERRED
server_ssl_mode=PREFERRED
access_mode=auto

 

コマンド  ROUTER SET access_mode=: によって、セッションで接続するインスタンスのタイプの定義もできます。

※ 訳者注: 下記は実行コマンド例です。
読み取り専用モードに設定し、レプリカ(3320)にアクセス

ROUTER SET access_mode='read_only';
select @@port;


読み書きモードに設定し、ソース(3310)にアクセス

ROUTER SET access_mode='read_write';
select @@port;

Session changes

 

 

まとめ

本記事では、MySQL 8.2でサポート開始した読み取り・書き込み分離をご紹介しました。この機能によってアプリケーションに変更を加えずに、データベースの性能とスケーラビリティを最適化することができます。

また、全ての読み取りトラフィックを読み取り専用インスタンスに、全ての書き込みトラフィックを読み取り・書き込みインスタンスに送ることができるようになります。

これにより、データベース管理者の皆様のユーザ・エクスペリエンスが向上し、データベースの管理やデプロイが簡単になることでしょう。

本記事における読み取り・書き込みインスタンスとは、プライマリまたはソースです。読み取り専用インスタンスとはレプリカのことで、例えばInnoDB Clusterのセカンダリ、ReplicaSetのセカンダリ、Replica Clusterのセカンダリなどです。

レプリカへのワークロード分散をご検討中の方は、ぜひMySQL 8.2からサポートを開始した読み取り・書き込み分離をお試しください。