---
title: "causal_reads – MariaDB MaxScale 2.3 新機能"
publish_date: 2019-05-14
updated_date: 2023-10-12
author: "MariaDB"
tags:
  - name: "MaxScale"
    url: "/ja/resources/blog/tag/maxscale-ja.md"
---

# causal_reads – MariaDB MaxScale 2.3 新機能

MariaDB のデータベース Proxy, MaxScale では バージョン 2.3 で read/write split ルータ・モジュールに [causal\_reads](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads) と呼ばれる新機能が追加されました。今回はこの新機能に関して説明させて頂きます。

### causal\_reads

[causal\_reads](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads) は read/write split ルータにおいて，クライアント/アプリケーションがデータベース上のデータ変更を行った際に，直後に Replica ノードで実行される read (SELECT等)に対するレプリケーション遅延の影響がないような処理を行います。  
なお，[causal\_reads](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads) はデフォルトで無効になっています。

### 制限事項

[casula\_reads](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads) を用いる場合，MariaDB Server 10.2.16 以降のバージョンを利用する必要があり，また，[session\_track\_system\_variables](https://mariadb.com/kb/en/library/server-system-variables/#session_track_system_variables) パラメータに last\_gtid を設定する必要があります。

### 利用例

[autocommit](https://mariadb.com/kb/en/library/server-system-variables/#autocommit) を1 (有効)に設定している場合，以下の例において，

```
INSERT INTO test.t1 (id) VALUES (1);
SELECT * FROM test.t1 WHERE id = 1;

```

各SQL文はトランザクション内では実行されないため，MaxScaleから見ると，後者のSELECT文は Replica ノードにルーティングされます。これにより起こりうる問題としては，Primary に INSERT されてから，SELECT文が実行される Replica ノードにまだレプリケーションされていない場合，クエリ結果が異なってしまう可能性があります。

このような場合に，MaxScale は一貫したクエリ結果を返すことを保証するコマンドをプリフィックスとして付与することにより，一貫性を犠牲にすることなく read スケーラビリティを向上させることができます。

上記の例のSQL文は以下のように変換されます。

```
INSERT INTO test.t1 (id) VALUES (1);
SET @maxscale_secret_variable=(
    SELECT CASE
           WHEN MASTER_GTID_WAIT('0-3000-8', 10) = 0 THEN 1
           ELSE (SELECT 1 FROM INFORMATION_SCHEMA.ENGINES)
    END);
SELECT * FROM test.t1 WHERE id = 1;

```

ここで，`SET` コマンドは Replica をあるGTIDに同期させるようにします(詳細は [MASTER\_GTID\_WAIT](https://mariadb.com/kb/en/library/master_gtid_wait/) を参照)。

もし，Replica が Primary に対して causal\_reads\_timeout 時間内に同期できない場合，MaxScale は Primary に対して再度クエリを実行します。

###### [causal\_reads\_timeout](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads_timeout)

causal\_reads におけるタイムアウト時間(単位: 秒)のパラメータで， デフォルト値は 10 秒です。

### まとめ

今回は MaxScale 2.3 において導入された新機能，[causal\_reads](https://mariadb.com/kb/en/mariadb-maxscale-23-readwritesplit/#causal_reads) について解説させて頂きました。従来であれば，アプリケーション側での対処が必要な場面においても，MaxScale を介することにより，あたかもシングルノード構成のデータベースであるかのように扱えるかと存じます。