MySQL Cluster をWindowsで動かす

正直、ほとんど情報がないので、人柱的に。

#MySQL Cluster をWindowsで動かすのに必要なもの
##MySQL Cluster 本体
なにはともあれ、WindowsのBinaryを準備するのがよいと思われるが、今回は、No-installer版で設定
今回は、下記からWindows (x86, 64-bit), ZIP Archive　のものをダウンロード

https://dev.mysql.com/downloads/cluster/

##マニュアル
日本語版だけど、英語版も、内容は変わらない。
https://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-install-windows-binary.html
これをマニュアルと呼ぶ。
(とはいえ、これを信じたらひどい目に…)

##前提
4台のPCにそれぞれ設定する
それぞれ、同じネットワークのホストA,B,C,Dとする。
Aは管理サーバー、BはSQLノード、C,Dはデータノードとする。

ちなみに、setup.bat を使うAuto-installerのやつは、sshの設定がうまくいかないのと、
index of ... 云々っていうエラーと、Paramikoのpip install（実質はupgrade)が必要であって、
Windowsではいかんせんめんどくさく、それに気付くのに数時間かかったので、今回はパスです。
正直、Auto-installerでできている人、教えてください。（Windowsで）


#手順
###ファイルの配置とconfig.ini, my.iniの作成
https://dev.mysql.com/doc/refman/5.6/ja/mysql-cluster-install-windows-binary.html
に従って、とりあえずファイルを配置していく。

例えば、SQLノードであるBには、Zipのものを解答し、c:\mysql に、そのまま展開する。
すると、c:\mysql 以下には、 bin, docs, include ... と複数並ぶ感じになる。
他のものは、省略。

###config.iniの更新(管理ノード：ホストA)
マニュアルのconfig.iniには、NodeIDがないので、NodeIDを追記する。

``` 変更
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2                      # Number of replicas
DataDir=C:/mysql/cluster-data       # Directory for each data node's data files
                                    # Forward slashes used in directory path,
                                    # rather than backslashes. This is correct;
                                    # see Important note in text
DataMemory=80M    # Memory allocated to data storage
IndexMemory=18M   # Memory allocated to index storage
                  # For DataMemory and IndexMemory, we have used the
                  # default values. Since the "world" database takes up
                  # only about 500KB, this should be more than enough for
                  # this example Cluster setup.

[ndb_mgmd]
# Management process options:
HostName=A               # Hostname or IP address of management node
DataDir=C:/mysql/bin/cluster-logs   # Directory for management node log files
NodeId=100　　　　　　　　　　　　#ここに追記

[ndbd]
# Options for data node "A":
                                # (one [ndbd] section per data node)
HostName=C           # Hostname or IP address
NodeId=1             #ここに追記
[ndbd]
# Options for data node "B":
HostName=D           # Hostname or IP address
NodeId=2               #ここに追記
[mysqld]
# SQL node options:
HostName=B           # Hostname or IP address
NodeId=50　　　　　　　　　　#ここに追記
```

###Log用、データ用、キャッシュ用のフォルダを作成
管理サーバー A で以下のコマンドを実行

```
c:
cd c:\mysql
mkdir bin\cluster-logs
```
必要あらば、管理者で.


#さぁ、ここからだ…
##管理サーバーを起動
マニュアルには、

```
C:\mysql\bin> ndb_mgmd
2010-06-23 07:53:34 [MgmtSrvr] INFO -- NDB Cluster Management Server. mysql-5.6.22-ndb-7.4.4
2010-06-23 07:53:34 [MgmtSrvr] INFO -- Reading cluster configuration from 'config.ini'
```
とあるけど、実際にやると、

```
C:\mysql\bin>ndb_mgmd
MySQL Cluster Management Server mysql-5.7.18 ndb-7.5.6
2017-05-16 04:06:55 [MgmtSrvr] ERROR    -- Could not determine which nodeid to use for this node. Specify it with --ndb-nodeid=<nodeid> on command line
```

となってハマる。
Specify it with --ndb-nodeid=<nodeid> on command line
と書いているので、オプションをつけてみると…

```
C:\mysql\bin>ndb_mgmd --ndb-nodeid=100
MySQL Cluster Management Server mysql-5.7.18 ndb-7.5.6
2017-05-16 04:09:12 [MgmtSrvr] INFO     -- Trying to get configuration from other mgmd(s) using 'nodeid=100,localhost:1186'...
```

ってなってハマる。これに1時間以上ハマったのだけど、どうやら、bin/config.iniが読み取れてないことが判明。
次のオプションを付けて上げる。

```
C:\mysql\bin>ndb_mgmd -f config.ini --ndb-nodeid=100
MySQL Cluster Management Server mysql-5.7.18 ndb-7.5.6

C:\mysql\bin>
```

**デーモン立ちあがらんやん！！！**


ここで、さらに嵌まる。
エラーは出てないこともあり、かなり不明。
色々試して分かったが理由を探るのに、かなり時間を費やす。
マニュアルにあるように、ndb_mgm.exeを実行しても、1186につなごうとするだけでどうしようもない。
この後、1186番のポートを開けたらうまくいくのか？と試すが、変化なし。

##n時間後
結局、パラメータを片っ端から入力しまくる。
最適とは言えないが、下記のやり方でどうにかなった。


・以下のフォルダを適当に作成。今回はc:\mysql\bin以下に作成する。
正直どこでも良いと思うし、フォルダ名もなんでも良いです。

```
mkdir c:\mysql\bin\confdir
```

・以下のコマンドを実行

```
C:\mysql\bin>ndb_mgmd -f config.ini --configdir=confdir
```

まさかの--configdirを設定しないとだめみたい。

##データノード
余裕。マニュアル通り ndbd.exeを立ち上げればよい。
もし、warningが出るようならば、 管理者で実行すれば文句を言わなくなる。
MFC120***.DLL が足らないという場合には、下記の再配布パッケージをダウンロードしてインストールすれば、OK.

https://www.microsoft.com/ja-jp/download/details.aspx?id=40784

##SQLノード
ｎ度目の嵌り。
mysqld --console
を実施しようにも色々とはまる。
"mysql.plugin doesn't work" とかでたり、下記のようなエラーがでる。

```
2017-05-15T18:41:50.929615Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
```

解決するために、以下のコマンドを実施

```
mysqld --initialize --basedir=c:\mysql
```
これで初期化がおわって、その後、mysqld --consoleで無事立ち上がります。

追記：
--consoleを--basedirの後につけて置かないと、rootのパスワードがわからなくて、困ります。
なにはともあれ、すぐに、Rootのパスワードは設定し直すといいと思います。

```
mysqld --initialize --basedir=c:\mysql --console
mysqladmin password newpassword -u root -p
```


#おつかれさまでした
実は、初めて MySQLを一からインストールしました。msiファイルを使わずに。
なんか、大変MySQLに詳しくなった気がしました。

要望あれば、設定ファイルを挙げる、もしくは自動化するプログラムを書こうと思います。
質問、不備があれば、教えてください。

**今回のやり方ではなく、Auto-installerでできている人、教えてください。**