背景
MySQL互換のNewSQLであるTiDBに関して会社で調査を行いました。
ただ、発表する場がなかったので、ここに供養としてTiDBの概要についてまとめたいと思います。
NewSQLとは
NewSQLとは、分散SQLデータベースです。
MySQLなどのRDBは、データの一貫性を保持するために、1つのDBインスタンスでデータを管理する必要があります。読み込みであれば複数のレプリカインスタンスを作成することで負荷を分散させることができ、書き込みの負荷に関しては、シャーディングなどの方法を使うことで分散させることができます。
しかし、シャーディングを使用したシステムで顧客の動向分析を行おうとすると、複数のインスタンス間で同じテーブルの同じ項目のデータを取ってくるときに、処理が煩雑になります。この時複数のテーブルをJoinしないといけない場合は、より処理が煩雑になるため分析するためのデータを取得するときに時間がかかります。
また、シャーディングの場合は、複数のインスタンスがあるので監視する必要があるインスタンスも増え、メンテナンス対象も増えるため運用コストが上がります。
この問題を解決する1つの案としてNewSQLがあります。
NewSQLだと、データの一貫性を保持しながら同時に書き込むことができます。
TiDBとは
TiDBとは、PingCAP株式会社が提供するMySQL互換があるNewSQLです。
NewSQLなので、水平方向のスケーラビリティ、強力な一貫性、および高可用性を備えています。
OLTP (オンライン トランザクション処理)、だけでなくOLAP (オンライン分析処理)も簡単にできるように設計されています。
以上より TiDB は、MySQLでは耐えることができない大規模なアクセスをさばくことができ、NoSQLではできない大規模なデータの強力な整合性を備えたアーキテクチャになります。
TiDBの仕組み
ここでは、TiDBの仕組みに関して説明していこうと思います。
まずPingCAP株式会社が用意しているドキュメントにあるTiDBのアーキテクチャの構成図を見てみましょう。
上記の点線で囲われた3つの部分を組み合わせてTiDBが構成されています。
TiDBとの通信はMySQLのクライアントをそのまま使用して問題ないため、この図では「MySQL protcol」で通信していると記載されています。
各機能に関して説明します。
TiDBクラスター
アプリケーションと実際にデータやSQLのやり取りを行うコンポーネントです。
MySQLで使用しているDDLをそのままTiDBでも使用することができるため、学習コストが低く導入することができます。
TiDBは、通常のMySQLサーバーと同様にエンドポイントを公開しているので、TiDBクラスターのエンドポイントにコネクションを張るイメージで使用します。
TiDBクラスターの主な役割は、アプリケーションからDDLを受け取ることと、受け取ったDDLを解析してデータが保存されているTiKVに対して分散実行計画を作成します。
MySQLのDDLはRDB用に最適化されたものですが、実際にデータを保存する方法はNoSQL系なのでそのまま使うことができないので、TiDBクラスターで分散実行計画を立てる必要があります。
TiDBクラスターは、水平方向に拡張することができるので、大規模な読み込みや書き込みが発生する場合はここを増やすと解決することができます。
このように、アプリケーションとデータを保存している部分の橋渡し役がTiDBクラスターになります。
ストレージクラスター
ストレージクラスターは、名前の通りTiDBクラスターから来たデータを受け取ったり、TiDBクラスターにデータを渡すことを役割としています。
TiDBのストレージクラスターのストレージサーバーの種類は、TiKVとTiFlashの2種類存在します。
TiKV
TiKVは、Key-Value形式で保存するストレージでデータの保存を担当しています。
データを格納する基本単位をリージョンといい、各リージョンには、StartKey から EndKeyで指定される範囲のデータが入っています。
TiKVのノードには複数のリージョンが存在します。
TiDB が SQL レベルで分散トランザクションをサポートするために、TiKV API は、キーと値のペア レベルで分散トランザクションを提供し、スナップショット分離レベルの分離を行っています。
TiDBサーバーは、 アプリケーションから受け取ったSQL ステートメントをSQL 実行プランに変換して TiKV API を呼び出します。
TiKV 内のすべてのデータは複数のレプリカ (デフォルトでは 3 つのレプリカ) で自動的に維持されるため、TiKV は高可用性があり、自動フェイルオーバーをサポートします。
TiKVのストレージの設計の詳細な仕組みと概念に関しては、こちらに記載されているので知りたい方はお読みください。
TiFlash
TiFlash は、TiKV のカラム型ストレージです。
主な用途は、OLAP(Online Analytical Processing)で使用することです。
また、TiKVと同様にTiFlashのデータに関しても複数のレプリカで保存されるため高可用性があります。
TiFlash は、 TiKVの書き込みを邪魔しない程度の低コストで、TiKV内のデータをリアルタイムに複製することができます。
ただし、TiFlash に直接データを書き込むことはできないので、使用用途がOLAPの場合でも、TiKVを用意する必要があります。
Placement Driver (PD) server
PDクラスターは、TiDB全体の管理を行うコンポーネントです。
具体的には、TiKVのどのクラスタを検索すればいいかや、トランザクションIDの割り振り、TiDB ダッシュボード管理 UIの提供、TiKVの各クラスター間のデータ量の偏りを無くすことがあります。
少なくても3つのノードで構成されるため、高可用性があります。
公式ドキュメントでは、奇数個のPDノードで運用することが推奨されています。
終わりに
簡単ではありますが、今回はこれで終わりにしたいと思います。
ここまで読んでくださりありがとうございます。無事供養できたと思います。
誰かの役に立てれば幸いです。
下記リンクから買い物していただけると白々のお小遣いが増えて色々な有料サービスを使ったブログ記事を書きやすくなるので、ご協力よろしくお願いします!!!
コメント