検索
ホームページデータベースmysql チュートリアルMySQL Binlog ストレージ システムのアーキテクチャを設計する方法

1. キングバスの紹介

1.1 キングバスとは何ですか?

Kingbus は、raft の強力な整合性プロトコルに基づいた分散 MySQL バイログ ストレージ システムです。 MySQL スレーブとして機能して、実際のマスターからバイナリログを同期し、分散クラスターに保存できます。同時に、クラスター内のバイナリログを他のスレーブに同期するための MySQL マスターとしても機能します。 kingbus には次の特徴があります:

MySQL レプリケーション プロトコルと互換性があり、Gtid を介してマスター上のバイナリ ログを同期し、スレーブが Gtid を介してキングバスからバイナリ ログを取得することをサポートします。

リージョン間のデータ レプリケーション。Kingbus は、raft プロトコルを介したリージョン間のデータ レプリケーションをサポートします。クラスターに書き込まれるバイナリログ データは、複数のノード間で強い一貫性があることが保証され、バイナリログの順序はマスター上の順序と完全に一致します。

高可用性。Kingbus は Raft の強力なコンセンサス プロトコルに基づいて構築されているため、クラスター内のノードの半分以上が存続している場合、ビンログのプルおよびプッシュ サービス全体の高可用性を実現できます。

1.2 kingbus はどのような問題を解決できますか?

Kingbus はマスターのネットワーク送信トラフィックを削減できます。 1 つのマスターと複数のスレーブを持つレプリケーション トポロジでは、マスターは各スレーブに binlog を送信する必要があります。スレーブが多すぎると、ネットワーク トラフィックがマスターのネットワーク カードの上限に達する可能性があります。たとえば、マスターが大きなテーブルやオンライン DDL の削除などの操作を実行すると、大量のバイナリログ イベントが瞬時に生成される可能性があり、10 台のスレーブがマスターに接続されている場合、マスター上のネットワーク カード トラフィックは 10 倍に増幅されます。 。マスターがギガビット ネットワーク カードを使用している場合、10MB/秒を超えるトラフィックが生成されると、ネットワーク カードがいっぱいになる可能性があります。 kingbus 経由でマスターに接続すると、スレーブを複数のマシンに分散して送信トラフィックのバランスをとることができます。

マスター フェイルオーバー プロセスを簡素化するには、キングバスに接続されているスレーブをマスターに昇格させ、キングバスを新しいマスターにリダイレクトするだけで済みます。他のスレーブは引き続きキングバスに接続されており、レプリケーション トポロジは変更されません。

マスターがバイナリログファイルを保存するために使用するスペースを節約します。一般に、MySQL はより高価な SSD を使用するため、binlog ファイルが多くのスペースを占有する場合は、MySQL に保存されるデータを減らす必要があります。すべてのビンログを kingbus

に保存することで、マスターに保存されるビンログ ファイルの数を減らすことができます。 異種レプリケーションをサポートします。 Alibaba のオープンソース Canal を介して kingbus に接続します。kingbus は継続的に binlog を canal にプッシュします。canal は binlog を受信し、それを Kafka メッセージ キューにプッシュし、最後に HBase に保存します。ビジネス部門は Hive を介して SQL を直接記述し、リアルタイムを実現します。ビジネスの分析。

2. Kingbus の全体的なアーキテクチャ

kingbus の全体的な構造を次の図に示します。 ストレージは raft ログ エントリとメタデータの保存を担当します。Kingbus では、raft ログと mysql binlog は統合されています。これらは異なるヘッダー情報によって区別されます。raft ログのデータ部分は binlog イベントであるため、2 つのタイプを保存する必要はありませんログを個別に保存できるので、保管スペースを節約できます。なぜなら、kingbus は、raft ノードの投票情報やいくつかの特別な binlog イベント (FORMAT_DESCRIPTION_EVENT) の特定の内容など、いくつかのメタ情報を保存する必要があるからです。

Raft は、etcd raft ライブラリを使用して、kingbus クラスターのリード選出、ログ レプリケーション、およびその他の機能を複製します。

Binlog syncer は Raft クラスターの Lead ノードでのみ実行され、クラスター全体で 1 つのみの syncer が存在します。シンサーはスレーブであるふりをして、マスターへのマスター/スレーブ レプリケーション接続を確立します。マスターは、シンサーによって送信された Executed_gtid_set に基づいて、シンサーが受け入れた binlog イベントをフィルターし、シンサーが受け入れていない binlog イベントのみを送信します。このレプリケーション プロトコルは、MySQL のマスター/スレーブ レプリケーション メカニズムと完全な互換性があります。 syncer は binlog イベントを受信すると、binlog イベント タイプに従っていくつかの処理を実行し、binlog イベントをメッセージにカプセル化して raft クラスターに送信します。 raft アルゴリズムを使用すると、このバイナリログ イベントを複数のノードに保存し、強い一貫性を実現できます。

binlog サーバーは、レプリケーション プロトコルを実装するマスターです。実際のスレーブは、binlog サーバーによって監視されているポートに接続できます。binlog サーバーは、binlog イベントをスレーブに送信します。binlog イベントの送信プロセス全体は、MySQL を参照して実装されます。レプリケーションプロトコル。 binlog イベントがスレーブに送信されない場合、binlog サーバーは定期的にハートビート イベントをスレーブに送信して、レプリケーション接続を維持します。

API サーバーは、以下を含む kingbus クラスター全体の管理を担当します:

Raft クラスターのメンバーシップ操作、クラスターのステータスの表示、ノードの追加、ノードの削除、ノード情報の更新など。

binlog syncer 関連の操作: binlog syncer を開始し、binlog syncer を停止し、binlog syncer のステータスを確認します。

binlog サーバー関連の操作、binlog サーバーの開始、binlog サーバーの停止、および binlog サーバーのステータスの確認。サーバー層の各種異常はraft層には影響せず、サーバーはオンデマンドで起動・停止できるプラグインとして捉えることができます。将来的に KingBus を拡張する場合は、関連するロジックを備えたサーバーを実装するだけで済みます。たとえば、kafka プロトコル サーバーを実装すると、kafka クライアントを介して kingbus 内のメッセージを消費できます。

3.kingbus コアの実装

3.1 ストレージのコア実装

ストレージには 2 つのログ形式があり、1 つは raft アルゴリズムによって生成および使用される raft ログ (以下、raft ログと呼びます)、もう 1 つはユーザー形式のログ (つまり、mysql binlog イベント) です。 。ストレージの設計では、2 つのログ フォームが 1 つのログ エントリに結合されます。ヘッダー情報の違いによってのみ区別されます。次の図に示すように、ストレージはデータ ファイルとインデックス ファイルで構成されます。 セグメントは固定サイズ(1GB)で追加書き込みのみ可能で、名前はfirst_raft_index-last_raft_indexとなり、セグメントのraftインデックスの範囲を示します。

最後のセグメントのみ書き込み可能で、そのファイル名は first_raft_index-inprogress であり、他のセグメントは読み取り専用です。

読み取り専用セグメントと対応するインデックス ファイルは、mmap を通じて書き込みおよび読み取りが行われます。

最後のセグメントのインデックス コンテンツは、ディスクとメモリの両方に保存されます。インデックスの読み取りには、メモリからの読み取りのみが必要です。

3.2 etcd raft ライブラリの使用

Etcd raft ライブラリは、適用されたログ、コミットされたエントリなどを処理するときはシングルスレッドです。特定の関数については、リンクを参照してください。この関数の処理時間は、できるだけ短くする必要があります。処理時間がラフト選出時間を超えると、クラスターが再選出されます。この点は特に注意が必要です。

3.3 binlog syncerのコア実装

binlog syncer の主なジョブは次のとおりです:

バイナリログイベントをプルします

バイナリログイベントを解析して処理します

binlog イベントを raft クラスターに送信します。パイプライン機構を使用することでプロセス全体の処理速度を向上させることができるのは当然ですが、Kingbus では各ステージの処理に別個のゴルーチンを使用し、異なるステージをパイプラインで接続します。 binlog syncer は binlog イベントを 1 つずつ受信するため、syncer はトランザクションの整合性を保証できません。syncer がハングした後、マスターに再接続する必要がある可能性があります。この時点で、最後のトランザクションが不完全である可能性があります。binlog syncer は、トランザクションが完了していないことを確認する必要があります。 kingbus は、独自の機能を備えたトランザクション整合性分析機能を実装しており、これは MySQL ソース コードを参照して完全に実装されています。

3.4 binlog サーバーのコア実装

binlog サーバーはマスターの機能を実装しており、スレーブが binlog サーバーとのレプリケーション接続を確立すると、スレーブは関連するコマンドを送信し、binlog サーバーはこれらのコマンドに応答する必要があります。最後にbinlogイベントをスレーブに送信します。各スレーブに対して、binlog サーバーは goroutine を開始して raft ログを継続的に読み取り、関連するヘッダー情報を削除し、それを binlog イベントに変換して、スレーブに送信します。

以上がMySQL Binlog ストレージ システムのアーキテクチャを設計する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は亿速云で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
图文详解mysql架构原理图文详解mysql架构原理May 17, 2022 pm 05:54 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本有什么区别mysql的msi与zip版本有什么区别May 16, 2022 pm 04:33 PM

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

mysql怎么去掉第一个字符mysql怎么去掉第一个字符May 19, 2022 am 10:21 AM

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

mysql怎么替换换行符mysql怎么替换换行符Apr 18, 2022 pm 03:14 PM

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql怎么将varchar转换为int类型mysql怎么将varchar转换为int类型May 12, 2022 pm 04:51 PM

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

MySQL复制技术之异步复制和半同步复制MySQL复制技术之异步复制和半同步复制Apr 25, 2022 pm 07:21 PM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

mysql怎么判断是否是数字类型mysql怎么判断是否是数字类型May 16, 2022 am 10:09 AM

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

带你把MySQL索引吃透了带你把MySQL索引吃透了Apr 22, 2022 am 11:48 AM

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。