OSSデータベース取り取り時報

第55回 MySQLのド定番機能 レプリケーションの構築運用に新風,PostgreSQLの活用事例セミナー報告とバージョンアップ情報

この記事を読むのに必要な時間:およそ 5 分

この連載では,OSSコンソーシアム データベース部会のメンバーが,さまざまなオープンソースデータベースの毎月の出来事をお伝えしています。

オープンソースカンファレンス(OSC)東京での「多様性時代のDB選択」の開催中止

今回の「取り取り時報」では,オープンソースカンファレンス2020 Tokyo/SpringでのOSSデータベース特集トラック,⁠多様性時代のDB選択」の詳しい報告をする予定でしたが,新型コロナウイルスへの警戒が続く中,開催中止となりました。開催できなかったことはもちろん残念なことですが,参加者や関係者の健康と安全に配慮いただいて難しいご判断をされた実行委員会と事務局に敬意を表します。さて,OSSデータベースの発表をまとめる特集トラックの企画は,仕切り直しをして別のOSCの場で開催したいと考えています。次回の東京開催は2020年の秋の予定です。また,それ以前の他地域での開催にて何かできるかもしれません。現時点ではまだ白紙ですが,決まりましたらこの連載にてお知らせしたいと思います。みなさん,次のOSCでお会いしましょう。

[MySQL]2020年2月の主な出来事

2020年2月の製品リリースはありませんでした。1月の原稿締め切り後,商用版のバックアップツールであるMySQL Enterprise Backup 4.1.4, 3.12.5とMySQL NDB Clusterの管理ツールMySQL Cluster Manager 1.4.8の各マイナーバージョンがリリースされました。新型コロナウイルスなどの影響により,開催予定だった複数のMySQL関連イベントがキャンセルされました。代替としてオンラインセミナーなどが計画されている模様です。

MySQL InnoDB ReplicaSetの登場

マイナーバージョンアップでもどんどん新機能を追加してくるMySQL 8.0ですが,連載第54回にご紹介したとおり,1月にリリースされたMySQL 8.0.19ではMySQL利用者にとっては定番中の定番の機能であるレプリケーションの構築と運用を劇的に刷新するMySQL InnoDB ReplicaSetが登場しました。

InnoDB ReplicaSetは,MySQLの非同期レプリケーションとMySQL Router,MySQL Shellを組み合わせたパッケージです。グループレプリケーションをベースとしたMySQL InnoDB Clusterと同様に,MySQL Shellでレプリケーション環境の構築や運用を可能にしました。

下記はMySQL Shellからレプリケーション環境を構築した例です。事前にMySQLサーバー(mysqld)やMySQL Router(mysqlrouter), MySQL Shell(mysqlsh)の各実行プログラムへのパスが通っている前提です。MySQL Shellのdba.deploySandboxInstanceメソッドを利用して,TCP/IPのポート番号3310, 3320, 3330の3つのポートを利用するMySQLインスタンスを作成し,3310をマスター,それ以外をスレーブする流れです。

$ mysqlsh
# 3つのインスタンス作成 出力略
 MySQL  JS > dba.deploySandboxInstance(3310)
 MySQL  JS > dba.deploySandboxInstance(3320)
 MySQL  JS > dba.deploySandboxInstance(3330)

# マスターになる端末に接続
 MySQL  JS > \c root@localhost:3310

# レプリカセットの作成
 MySQL  localhost:3310 ssl  JS > dba.createReplicaSet("repl1")
A new replicaset with instance '127.0.0.1:3310' will be created.

* Checking MySQL instance at 127.0.0.1:3310

This instance reports its own address as 127.0.0.1:3310
127.0.0.1:3310: Instance configuration is suitable.

* Updating metadata...

ReplicaSet object successfully created for 127.0.0.1:3310.
Use rs.addInstance() to add more asynchronously replicated instances to this replicaset and rs.status() to check its status.

<ReplicaSet:repl1>

# レプリカセットへスレーブとなるノードの追加
 MySQL  localhost:3310 ssl  JS > dba.getReplicaSet().addInstance("root@localhost:3320")
You are connected to a member of replicaset 'repl1'.
Adding instance to the replicaset...

* Performing validation checks

This instance reports its own address as 127.0.0.1:3320
127.0.0.1:3320: Instance configuration is suitable.

* Checking async replication topology...

* Checking transaction state of the instance...

〈略〉

Please select a recovery method [C]lone/[I]ncremental recovery/[A]bort (default Clone): C
* Updating topology
Waiting for clone process of the new member to complete. Press ^C to abort the operation.
* Waiting for clone to finish...
NOTE: 127.0.0.1:3320 is being cloned from 127.0.0.1:3310
** Stage DROP DATA: Completed
** Clone Transfer  
    FILE COPY  ####################################################  100%  Compl
    PAGE COPY  ####################################################  100%  Compl
    REDO COPY  ##################################################  100%  In Progress
NOTE: 127.0.0.1:3320 is shutting down...

* Waiting for server restart... ready
* 127.0.0.1:3320 has restarted, waiting for clone to finish...
** Stage RESTART: Completed
* Clone process has finished: 61.11 MB transferred in about 1 second (~inf TB/s)

** Configuring 127.0.0.1:3320 to replicate from 127.0.0.1:3310
** Waiting for new instance to synchronize with PRIMARY...

The instance '127.0.0.1:3320' was added to the replicaset and is replicating from 127.0.0.1:3310.

 MySQL  localhost:3310 ssl  JS > dba.getReplicaSet().addInstance("root@localhost:3320")
〈略〉

途中で追加するノードへのデータのコピーをクローンプラグインを利用するか,バイナリログの差分を利用するかの選択をします。データの同期が取れたところでスレーブとなるノードの再起動を行いReplicaSetに参加となります。Cluster.status()メソッドで構成や状況の確認ができます。

MySQL  localhost:3310 ssl  JS > dba.getReplicaSet().status()
You are connected to a member of replicaset 'repl1'.
{
    "replicaSet": {
        "name": "repl1", 
        "primary": "127.0.0.1:3310", 
        "status": "AVAILABLE", 
        "statusText": "All instances available.", 
        "topology": {
            "127.0.0.1:3310": {
                "address": "127.0.0.1:3310", 
                "instanceRole": "PRIMARY", 
                "mode": "R/W", 
                "status": "ONLINE"
            }, 
            "127.0.0.1:3320": {
                "address": "127.0.0.1:3320", 
                "instanceRole": "SECONDARY", 
                "mode": "R/O", 
                "replication": {
                    "applierStatus": "APPLIED_ALL", 
                    "applierThreadState": "Slave has read all relay log; waiting for more updates", 
                    "receiverStatus": "ON", 
                    "receiverThreadState": "Waiting for master to send event", 
                    "replicationLag": null
                }, 
                "status": "ONLINE"
            }, 
            "127.0.0.1:3330": {
〈略〉
    }
}

レプリケーションの遅延はこの出力のreplicationLagで確認できるほか,レシーバースレッド(IOスレッド)やアプライヤースレッド(SQLスレッド)の状態もあわせて確認できます。またCluster.setPrimaryInstance()メソッドでのスレーブのマスターへの昇格,障害などでReplicaSetから外れたインスタンスのCluster.rejoinInstance()メソッドでの復帰,またマスターに障害が発生した場合はCluster.forcePrimaryInstance()メソッドでのフェイルオーバーが可能になっています。

登場から20年近く経つ定番機能のレプリケーションにも構築運用の新しい仕組みが加わり進化を続けています。ぜひお試しください。

著者プロフィール

梶山隆輔

MySQL Sales Consulting Senior Manager。

日本オラクル(株)において,MySQLのお客様環境への導入支援や製品の技術解説を担当するセールスコンサルタントチームのアジア太平洋地域リーダー。多国籍なMySQL部門にて,オーストラリア,インド,台湾などに在籍するチームメンバーを束ね,アジア太平洋地域の25以上の国や地域でのMySQL普及やビジネスの拡大をミッションとする。


溝口則行(みぞぐちのりゆき)

TIS株式会社

OSSコンソーシアム副会長,オープンソースビジネス推進協議会(OBCI)副理事長。その他,PostgreSQLエンタープライズ・コンソーシアム(PGECons),日本OSS推進フォーラムなどにも少しずつ関与。勤務先メンバに,PostgreSQL,Zabbix,Ansibleやコンテナ技術などに強みのある癖のある芸人を抱え,タレントマネージャ業が中心になりつつある。