Follower Read

このドキュメントでは、 Follower Read を使用してクエリのパフォーマンスを最適化する方法を紹介します。

導入

TiDB は、クラスター内のすべてのノードにデータを分散するための基本単位としてリージョンを使用します。リージョンには複数のレプリカを含めることができ、レプリカはリーダーと複数のフォロワーに分割されます。リーダー上のデータが変更されると、TiDB は同期的にデータをフォロワーに更新します。

デフォルトでは、TiDB は同じリージョンのリーダー上でのみデータの読み取りと書き込みを行います。リージョンで読み取りホットスポットが発生すると、リージョンリーダーがシステム全体の読み取りボトルネックになる可能性があります。この状況では、Follower Read機能を有効にすると、リーダーの負荷が大幅に軽減され、複数のフォロワー間で負荷が分散されるため、システム全体のスループットが向上します。

いつ使用するか

読み取りホットスポットを減らす

アプリケーションにTiDB ダッシュボード キー ビジュアライザー ページスポットリージョンがあるかどうかを視覚的に分析できます。 「メトリクス選択ボックス」をRead (bytes)またはRead (keys)に選択すると、読み取りホットスポットが発生しているかどうかを確認できます。

ホットスポットの処理の詳細については、 TiDB ホットスポットの問題処理を参照してください。

アプリケーションにTiDB Cloudキー ビジュアライザー ページスポットリージョンがあるかどうかを視覚的に分析できます。 「メトリクス選択ボックス」をRead (bytes)またはRead (keys)に選択すると、読み取りホットスポットが発生しているかどうかを確認できます。

ホットスポットの処理の詳細については、 TiDB ホットスポットの問題処理を参照してください。

読み取りホットスポットが避けられない場合、または変更コストが非常に高い場合は、Follower Read機能を使用して、フォロワーリージョンへの読み取りリクエストのバランスをより適切にロードしてみることができます。

地理的に分散された展開のレイテンシーを削減

TiDB クラスターが複数の地区またはデータセンターに展開されている場合、リージョンの異なるレプリカが異なる地区またはデータセンターに分散されます。この場合、 Follower Read をclosest-adaptiveまたはclosest-replicasに設定すると、TiDB が現在のデータセンターからの読み取りを優先できるようになり、読み取り操作のレイテンシーとトラフィック オーバーヘッドを大幅に削減できます。実装の詳細については、 Follower Readを参照してください。

Follower Readを有効にする

  • SQL
  • Java

Follower Readを有効にするには、変数tidb_replica_read (デフォルト値はleader ) をfollowerleader-and-followerprefer-leaderclosest-replicas 、またはclosest-adaptiveに設定します。

SET [GLOBAL] tidb_replica_read = 'follower';

この変数の詳細については、 Follower Readの使用法を参照してください。

JavaでFollower Read を有効にするには、 FollowerReadHelperクラスを定義します。

public enum FollowReadMode { LEADER("leader"), FOLLOWER("follower"), LEADER_AND_FOLLOWER("leader-and-follower"), CLOSEST_REPLICA("closest-replica"), CLOSEST_ADAPTIVE("closest-adaptive"), PREFER_LEADER("prefer-leader"); private final String mode; FollowReadMode(String mode) { this.mode = mode; } public String getMode() { return mode; } } public class FollowerReadHelper { public static void setSessionReplicaRead(Connection conn, FollowReadMode mode) throws SQLException { if (mode == null) mode = FollowReadMode.LEADER; PreparedStatement stmt = conn.prepareStatement( "SET @@tidb_replica_read = ?;" ); stmt.setString(1, mode.getMode()); stmt.execute(); } public static void setGlobalReplicaRead(Connection conn, FollowReadMode mode) throws SQLException { if (mode == null) mode = FollowReadMode.LEADER; PreparedStatement stmt = conn.prepareStatement( "SET GLOBAL @@tidb_replica_read = ?;" ); stmt.setString(1, mode.getMode()); stmt.execute(); } }

Followerノードからデータを読み取る場合は、 setSessionReplicaRead(conn, FollowReadMode.LEADER_AND_FOLLOWER)方法を使用してFollower Read機能を有効にします。これにより、現在のセッションでLeaderノードとFollowerノードの間で負荷のバランスをとることができます。接続が切断されると元のモードに戻ります。

public static class AuthorDAO { // Omit initialization of instance variables... public void getAuthorsByFollowerRead() throws SQLException { try (Connection conn = ds.getConnection()) { // Enable the follower read feature. FollowerReadHelper.setSessionReplicaRead(conn, FollowReadMode.LEADER_AND_FOLLOWER); // Read the authors list for 100000 times. Random random = new Random(); for (int i = 0; i < 100000; i++) { Integer birthYear = 1920 + random.nextInt(100); List<Author> authors = this.getAuthorsByBirthYear(birthYear); System.out.println(authors.size()); } } } public List<Author> getAuthorsByBirthYear(Integer birthYear) throws SQLException { List<Author> authors = new ArrayList<>(); try (Connection conn = ds.getConnection()) { PreparedStatement stmt = conn.prepareStatement("SELECT id, name FROM authors WHERE birth_year = ?"); stmt.setInt(1, birthYear); ResultSet rs = stmt.executeQuery(); while (rs.next()) { Author author = new Author(); author.setId( rs.getLong("id")); author.setName(rs.getString("name")); authors.add(author); } } return authors; } }

続きを読む

このページは役に立ちましたか?

Playground
新規
登録なしで TiDB の機能をワンストップでインタラクティブに体験できます。
製品
TiDB Cloud
TiDB
価格
PoC お問い合わせ
エコシステム
TiKV
TiFlash
OSS Insight
© 2024 PingCAP. All Rights Reserved.
Privacy Policy.