この記事はMySQL 8.2 – transparent read/write splittingの翻訳版です。
MySQLで読み取り・書き込み分離が可能になりました。
規模が大きいシステムの場合、読み取りはレプリカ間で分散しますが、これにはアプリケーション側での何らかの管理が必要です。つまり、どこに書き込みどこに読み取りに行くのか指定しなければなりません。
MySQL 8.2では、MySQL Routerが読み取りと書き込みを認識し、InnoDB Clusterのプライマリ・インスタンスまたは非同期レプリケーションのソースに書き込みを、セカンダリ・インスタンスまたはレプリカに読み取りをルーティングできます。

MySQL InnoDB ReplicaSetを例に下記に説明していきます。
MySQL InnoDB ReplicaSet
図はレプリケーションのソース・インスタンスと、非同期レプリケーションのレプリカ・インスタンスを示しています。

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

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

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

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

読み取りを実行すると、デフォルトでレプリカ(セカンダリ・インスタンス)に到達することが確認できます。トランザクションが開始されると、ポートを変えずに同じ接続で、ソース(プライマリ・インスタンス)に到達します。
※ 訳者注: 下記は実行コマンド例です。
ポート6450で接続すると、自動でレプリカ(3320)にアクセスします。
select @@hostname, @@port;
トランザクションを開始すると、ポート6450に接続することにより自動でソース(3310)に到達します。
start transacton; select @@hostname, @@port; rollback;

読み取り専用トランザクションを開始すると、接続先が3320に変わります。
※ 訳者注: 下記は実行コマンド例です。
読み取り専用トランザクションを開始すると、自動でレプリカ(3320)に到達します。
start transaction read only; select @@hostname, @@port; rollback;

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;

まとめ
本記事では、MySQL 8.2でサポート開始した読み取り・書き込み分離をご紹介しました。この機能によってアプリケーションに変更を加えずに、データベースの性能とスケーラビリティを最適化することができます。
また、全ての読み取りトラフィックを読み取り専用インスタンスに、全ての書き込みトラフィックを読み取り・書き込みインスタンスに送ることができるようになります。
これにより、データベース管理者の皆様のユーザ・エクスペリエンスが向上し、データベースの管理やデプロイが簡単になることでしょう。
本記事における読み取り・書き込みインスタンスとは、プライマリまたはソースです。読み取り専用インスタンスとはレプリカのことで、例えばInnoDB Clusterのセカンダリ、ReplicaSetのセカンダリ、Replica Clusterのセカンダリなどです。
レプリカへのワークロード分散をご検討中の方は、ぜひMySQL 8.2からサポートを開始した読み取り・書き込み分離をお試しください。
