NDBDのシグナルとブロック
提供:MySQL Practice Wiki
NDB関連のソースコードは大きく分けて二つある。ndbd, ndb_mgmdなどのデーモンと、NDB APIを利用したMySQLサーバ内部のストレージエンジンインターフェイス部分のソースコードである。MySQL Cluster 5.1以降では、以下のようなディレクトリ階層でソースコードが格納されている。
- storage/ndb|ここにはndbdやndb_mgmdなどのソースコードが格納されている。
- sql/ndb_*|ここにはmysqld内のNDBストレージエンジン関連のソースコードが定義されている。つまり、SQLノードとしてのMySQLサーバの定義がなされているのである。
目次 |
Signalクラス
src/kernel/vm/VMSignal.hpp src/kernel/vm/VMSignal.cpp
ブロック間で交換されるメッセージ=シグナルを定義するクラスである。メッセージを格納するための受け皿としての機能を実装している。シグナルは自ノード内のブロックに対しても、他ノード内のブロックに対しても同じ関数を用いて送る事が可能である。SimulatedBlock::sendSignal()関数を参照のこと。
Signalクラス内にはSignalHeaderというメンバが定義されていて、シグナルのタイプ、送信先、送信元、シグナルの長さなどの情報が格納されている。SignalHeaderはinclude/transporter/TransporterDefinitions.hppにおいて以下のように定義されている。
struct SignalHeader {
Uint32 theVerId_signalNumber; // 4 bit ver id - 16 bit gsn
Uint32 theReceiversBlockNumber; // Only 16 bit blocknum
Uint32 theSendersBlockRef;
Uint32 theLength;
Uint32 theSendersSignalId;
Uint32 theSignalId;
Uint16 theTrace;
Uint8 m_noOfSections;
Uint8 m_fragmentInfo;
}; /** 7x4 = 28 Bytes */
GlobalSignalNumber
略してGSN。シグナルのタイプを表す番号であり、ndbdで共通の番号が使われている。シグナルを受け取ったブロックはGSNに従って特定の処理を行うという寸法である。GSNはinclude/kernel/GlobalSignalNumbers.hで定義されている。
SimulatedBlockクラス
src/kernel/vm/SimulatedBlock.hpp src/kernel/vm/SimulatedBlock.cpp
全てのブロックの親になるクラス。各ブロック間でシグナルを交換するロジックを実装している。様々なsendSignal()関数のバリエーションを定義している。ただしいずれのバリエーションにおいてもBlockReferenceというブロックのIDを第一引数にとる。BlockReferenceはクラスター全体(すべてのndbd)においてユニークなIDである。
BlockNumbereとBlockReference
以下のデータタイプがinclude/kernel/kernel_types.hで定義されている。
typedef Uint16 NodeId; typedef Uint16 BlockNumber; typedef Uint32 BlockReference;
BlockNumberは各ブロックに割り当てられたユニークなIDであり、以下のようにinclude/kernel/BlockNumbers.hにおいて定義されている。BlockNumberはブロックのタイプを示すものであると考えると良い。
#define BACKUP 0xF4 #define DBTC 0xF5 #define DBDIH 0xF6 #define DBLQH 0xF7 #define DBACC 0xF8 #define DBTUP 0xF9 #define DBDICT 0xFA #define NDBCNTR 0xFB #define CNTR 0xFB #define QMGR 0xFC #define NDBFS 0xFD #define CMVMI 0xFE #define TRIX 0xFF #define DBUTIL 0x100 #define SUMA 0x101 #define DBTUX 0x102 #define TSMAN 0x103 #define LGMAN 0x104 #define PGMAN 0x105 #define RESTORE 0x106
各ブロックのインスタンスは、クラスタ全体を通じてユニークなIDを持っている。IDのタイプはBlockReferenceであり、NodeIdとBlockNumberを組み合わせることで一意的に導き出されるようになっている。以下のnumberToRef()はinclude/kernel/RefConvert.hppで定義されている。
inline
BlockReference numberToRef(BlockNumber bnr, NodeId proc){
return (((Uint32)bnr) << 16) + proc;
}
16ビット幅のBlockNumberを上位に16ビットシフトして、16ビットのNodeIdと組み合わせることで、32ビットのBlockReferenceを生成する単純な関数である。BlockReferenceからNodeIdを取り出すことも、またBlockNumberを取り出すことも容易であり、そのための関数refToNode()、refToBlockがinclude/kernel/RefConvert.hppで定義されている。
SimBlockListクラス
src/kernel/vm/SimBlockList.hpp src/kernel/SimBlockList.cpp
ndbdデーモン内で利用されるブロックへのポインタを格納するクラスである。load()メンバ関数により、各ブロックのインスタンスを作成する。各ブロックが持っているバッファのサイズなどは、globalEmulatorDataというインスタンスに格納されており、globalEmulatorDataを参照しながら各インスタンスを初期化する。
EmulatorData構造体
src/kernel/vm/Emulator.hpp src/kernel/vm/Emulator.cpp
ndbdデーモンが実行するプログラムの環境を定義する構造体である。具体的には以下のメンバを保持している。
class Configuration * theConfiguration; class WatchDog * theWatchDog; class ThreadConfig * theThreadConfig; class SimBlockList * theSimBlockList; class SocketServer * m_socket_server; class Ndbd_mem_manager * m_mem_manager;
globalEmulatorDataというインスタンスがあり、globalEmulatorDataから各メンバにアクセスすることができる。
GlobalData構造体
その他、 グローバルなスコープでアクセスするためのデータが格納されている。
Configurationクラス
MySQL Clusterの構成情報を保持するためのクラスで、MGMから構成情報を取得するロジックも実装している。詳細はNDBD fetching configを参照のこと。
ThreadConfigクラス
ThreadConfig::ipControlLoop()はndbdのメインループである。doStart()はndbdが初期化を行うためのシグナルを送信する。