naoki86star

インターネットの片隅でなにかしら書いてみる

mysql-ndbclusterの覚え書き(8.0.20の試食)

 mysql ndbclusterはデータを格納するサーバーを分散させることのできるインメモリデータベース、と理解。docみながら2node構成で遊んでみて、docからあまり読み取れず他からも調べにくかったような勝手ながら?でも動いた考え方・設定デザインの概要を書いておく。
 環境はUbuntu20.04 4G/4Core2台、mysql-cluster 8.0.20。

 mysql ndbclusterの物理プロセス(mysql ndbclusterではこれをノードを表現することが多いみたい)には3つ、覚えておく種類がある

  • ndb_mgmd:司令塔。
  • ndbd:データを格納するプロセス。
  • mysqld : いつものmysqldと同じにみえるのだけども、ndb-cluster用途としてbuildされている必要あり。要するにndb clusterとしてビルドするかバンドルされているものを使う。my.iniを参照して、ndb_mgmdと接続する。

 最初の最初は、ndb_mgmdから起動する。ドキュメント上の設定ファイル名はconfig.iniでありそこに書かれた設定を読み込む。
 最初の時点のndb_mgmd/ndbd/mysqldの構成を記述する。最低台数構成が必要で(つまり例えばレプリカ2にしたらndbdは2以上必要)それぞれのプロセスにはnodeidが付く。config.iniにnodeidを書かないとndb_mgmdがnodeidを自動割り当てする機能もあるようなのだが、将来的に拡張して使い続けるつもりならndb_mgmd/ndbd/mysqldにはそれぞれnodeidの割り当て範囲を決めておいて、かつ明示的にnodeidを指定してあげるのがいい気がする、というかそうしないとノード追加でうまくいかない場面がでてくる。例えばndb_mgmd 一桁台 ndbd 100番台以降,mysqld 200番台以降とか。一度ndb_mgmd が特定のnodeidを特定のノードに割り振ると種類が変えられないようにみえたのでそう考えた。

 ndb_mgmdも冗長できたが、個人的にやや混乱しやすいというかきっちり操作しないとあとから変なことが起きかねない。
 ndbd/mysqld構成を変更するときは、あるノード(1ndb_mgmd構成ならその唯一のndb_mgmdを、複ndb_mgmd構成の場合はそれらからの任意の1プロセス)ndb_mgmdをSTOPし、--reloadで起動しなおす。するとconfigが全ndb_mgmdに反映してくれるのだけども相方ndb_mgmdのconfig.iniファイルをケアしてくれるわけではないので、config.iniは自分で同期しておくなり、運用パラメータとあっていないのを認識しておくなりの必要がある。
 多分ndb_mgmdの構成変更では、(やりたくないけど)やる羽目になるかもしれないのはIPの変更かもしれない。それは試していないけども、nodeidを指定してあれば大丈夫そうな気がする。ndb_mgmdに限らずndbdとかnodeidを指定して明示的に一貫して管理するのが幸せの一歩目に思った。

 ndbdプロセスを複数束ねて、groupというのを構成する。一つのgroupの中に完結するレプリカ(複製)が置かれる。グループに属する冗長化の維持できない最後のプロセスは落とせない。不都合な事情で落ちることあるかもしれないけど(地獄)、ndb_mgmdからは、少なくとも最後の砦プロセス分は落とせない。

 個人的に興味をひいたというか、ndb_mgmdとndbプロセス群の独立共存性みたいなところ。ndb_mgmdを最初に起動してクラスタワールドを初期化する感じでその次にndbd・データノードを起動していく。ndbdプロセスはgroupidで示されるグループのプロセスすべてが起動して初めてクラスターに参加したことになる。ひとたびクラスターに参加したら、グループ単位で自立的に生存しようと動いて、冗長性が失われない限りはデータが維持できる。ndb_mgmdは新たなgroupとかの情報を通知するみたいな役割でそうでない状態が満たされているならndb_mgmdはある時間0プロセスすなわち存在しなくてもクラスターは成立し続ける、ように見えた。

 mysqldはndbclusterでは、クライアント(mysqlコマンドあるは他の手段)のアクセスポイントになる。*1
 config.iniで記述するndb_mgmd/ndbd/mysqldにはアクセス元IPを指定できる。ndb_mgmd/ndbdはnodeidに対して接続元を明示的に指定して、mysqldには指定しないほうが使いやすいかもしれない。mysqldはiptablesで縛るほうが利便性はいいかもしれない。

 当たり前だけども、ノードの構成でやりたいことは検証段階であらかじめお試し・テストしておくべき。ちょっとした条件の違いで、動かそうとしたときに"なんとかだからchangeできない"みたいなログを突き付けられる。その場で答えがでるような感じではない。

おまけ:
 Windows用のバイナリを使って、ndbd1プロセスをクラスターに参加させてみたらできた。ndb_mgmdの動くubuntuサーバ上のconfig.iniのほうにwindowsのdatadirパス(c:/mysql-clusterみたいな感じ!)を書くことになる。サーバにあるデータを自分のPCに引き込むキャッシュみたいな変態な使い方できるかな。*2

*1:NDBClusterAPIというのが別にあってこれは直接ndbdに作用するとのこと

*2:と書いてからブロックチェーンのことがなんか思い出された。ndb_mgmdはノードの構成が変わるときだけいればいいようにみえるのでndbclusterは動き出すと自立分散データベースといえなくもないのでは、とちょっと思っているところ。まぁ今後も仕様がかわっていくだろうけども。