CentOS7＋MySQL8.0.16 環境構築

# はじめに
　仕事でMySQL Cluster使う事が決まったので最新版で環境構築を行なっていたが8.0がのDMRがリリースされたのでそちらで環境構築をし直し（メモ）

# 参考URL
　8.0の手順
  https://dev.mysql.com/doc/refman/8.0/en/installing.html

# 環境
　ちょっぱやで作りたかったのでVagrantで環境構築（Vagrantは相性とかあるのでバージョンは以下)
　Vagrant　Version:2.2.4
　VertualBox　Version:6.0.4

　vagrant box addで困った人がいたので追記。

``` 
vagrant box add centos7 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box
vagrant init centos7 
``` 

　設定ファイルはこんな感じ。

``` 
  ### server1の設定内容
  config.vm.define "d01" do |server|
    server.vm.hostname = config.vm.box + "-d01" + ".vagrant"
    server.vm.network "private_network", ip: "192.168.200.101", host: "52001"
    config.vm.provider "virtualbox" do |vb|
      ### virtualbox上で表示される名前
      vb.name = config.vm.box + "_d01"
      vb.customize ["modifyvm", :id, "--memory", "2048"]
      vb.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end
  ### server2の設定内容
  config.vm.define "d02" do |server|
    server.vm.hostname = config.vm.box + "-d02" + ".vagrant"
    server.vm.network "private_network", ip: "192.168.200.102", host: "52002"
    config.vm.provider "virtualbox" do |vb|
      ### virtualbox上で表示される名前
      vb.name = config.vm.box + "_d02"
      vb.customize ["modifyvm", :id, "--memory", "2048"]
      vb.customize ["modifyvm", :id, "--cpus", "2"]
    end
  end
  ### serverMの設定内容
  config.vm.define "sM" do |server|
    server.vm.hostname = config.vm.box + "-sM" + ".vagrant"
    server.vm.network "private_network", ip: "192.168.200.100", host: "52000"
    config.vm.provider "virtualbox" do |vb|
      ### virtualbox上で表示される名前
      vb.name = config.vm.box + "_sM"
      vb.customize ["modifyvm", :id, "--memory", "2048"]
      vb.customize ["modifyvm", :id, "--cpus", "1"]
    end
  end
```

# 構成
　サイトで推奨している最小構成で構築（こんな想定)
　sM：192.168.200.100：管理サーバ(MGMノード)
　d01：192.168.200.101：SQLノード＋データノードA(NDBDノード)
　d02：192.168.200.102：SQLノード＋データノードB(NDBDノード)

# インストールパッケージ
　今回はRPMパッケージでインストール(パッケージはこれ（RPMのバンドル):wgetとかで持ってくる。)
 https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-community-8.0.16-0.1.dmr.el7.x86_64.rpm-bundle.tar


# 確認
## SSHの疎通確認
ssh 192.168.200.100 -l root
ssh 192.168.200.101 -l root
ssh 192.168.200.102 -l root
※passwordは全てvagrant

## SCPでコピー
・管理サーバ(MGMノード)
　MySQL-Cluster-management-server-XXXXXX.rpm
・SQLノード
　MySQL-Cluster-server-XXXXXX.rpm
 　→　MySQL-Cluster-client-XXXXXX.rpm
　　　→　MySQL-Cluster-common-XXXXXX.rpm
　　　→　MySQL-Cluster-lib-XXXXXX.rpm
・データノード
　MySQL-Cluster-data-node-XXXXXX.rpm

#RPMインストール
　rpm -Uhv XXX.rpm

### 注意
　SQLノードでclientのRPMが入らない。。(client)

```
警告: mysql-cluster-community-client-8.0.16-0.1.dmr.el7.x86_64.rpm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID 5072e1f5: NOKEY
エラー: 依存性の欠如:
	perl(Class::MethodMaker) は mysql-cluster-community-client-8.0.16-0.1.dmr.el7.x86_64 に必要とされています
	perl(DBI) は mysql-cluster-community-client-8.0.16-0.1.dmr.el7.x86_64 に必要とされています
	perl(Data::Dumper) は mysql-cluster-community-client-8.0.16-0.1.dmr.el7.x86_64 に必要とされています
```
　perl-DBIとperl-Class-MethodMakerが必要。
　perl-DBIは、yumで入れた。(yum -y install perl-DBI)
　perl-Class-MethodMakerは、wgetでRPM落としてきてインストール。
　http://repo.openfusion.net/centos7-x86_64//perl-Class-MethodMaker-2.21-1.of.el7.x86_64.rpm

　SQLノードでserverのRPMが入らない。。(client)

```
警告: mysql-cluster-community-server-8.0.16-0.1.dmr.el7.x86_64.rpm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID 5072e1f5: NOKEY
エラー: 依存性の欠如:
	net-tools は mysql-cluster-community-server-8.0.16-0.1.dmr.el7.x86_64 に必要とされています
```
　net-toolsは、wgetでRPM落としてきてインストール。
　http://mirror.centos.org/centos/7/os/x86_64/Packages/net-tools-2.0-0.24.20131004git.el7.x86_64.rpm

# 設定

## 設定ファイル
　全てのサーバに配布

```/etc/my.cnf
[mysqld]
# Options for mysqld process:
ndbcluster                      # run NDB storage engine

[mysql_cluster]
# Options for NDB Cluster processes:
ndb-connectstring=192.168.200.100  # location of management server
```

## ディレクトリ作成（データノード）
```
mkdir -p /usr/local/mysql/data
```

## ディレクトリ作成（管理ノード）
　管理ノードで設定ファイル作成
```
% mkdir /var/lib/mysql-cluster
% cd /var/lib/mysql-cluster
% vi config.ini
```

```config.ini
[ndbd default]
# Options affecting ndbd processes on all data nodes:
NoOfReplicas=2    # Number of replicas
DataMemory=80M    # How much memory to allocate for data storage

[ndb_mgmd]
# Management process options:
HostName=192.168.200.100        # Hostname or IP address of MGM node
DataDir=/var/lib/mysql-cluster  # Directory for MGM node log files

[ndbd]
# Options for data node "d01":
                                # (one [ndbd] section per data node)
HostName=192.168.200.101        # Hostname or IP address
NodeId=2                        # Node ID for this data node
DataDir=/usr/local/mysql/data   # Directory for this data node's data files

[ndbd]
# Options for data node "d02":
HostName=192.168.200.102        # Hostname or IP address
NodeId=3                        # Node ID for this data node
DataDir=/usr/local/mysql/data   # Directory for this data node's data files

[mysqld]
# SQL node options:
HostName=192.168.200.101        # Hostname or IP address
                                # (additional mysqld connections can be
                                # specified for this node for various
                                # purposes such as running ndb_restore)
[mysqld]
# SQL node options:
HostName=192.168.200.102        # Hostname or IP address
                                # (additional mysqld connections can be
                                # specified for this node for various
                                # purposes such as running ndb_restore)
```
# 起動

## 管理ノード起動
```
% ndb_mgmd -f /var/lib/mysql-cluster/config.ini 
MySQL Cluster Management Server mysql-8.0.16 ndb-8.0.16-dmr
```
## データノード起動
```
% ndbd
2019-05-09 04:05:12 [ndbd] INFO     -- Angel connected to '192.168.200.100:1186'
2019-05-09 04:05:12 [ndbd] INFO     -- Angel allocated nodeid: 2
```
起動しない時は管理ノードなどのFireWallをOFFにする
CentOS7ならこれでいける。

```
% systemctl stop firewalld
```

# 起動確認
　確認にはndb_mgmが必要。（今回入れたのはSQLノードなのでSQLノードで確認)

```
% ndb_mgm
ndb_mgm> show
[ndbd(NDB)]	2 node(s)
id=2	@192.168.200.101  (mysql-8.0.16 ndb-8.0.16, Nodegroup: 0, *)
id=3	@192.168.200.102  (mysql-8.0.16 ndb-8.0.16, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.200.100  (mysql-8.0.16 ndb-8.0.16)

[mysqld(API)]	2 node(s)
id=4 (not connected, accepting connect from 192.168.200.101)
id=5 (not connected, accepting connect from 192.168.200.102)
```
SQLノード以外は起動できている。

## SQLノード起動

まずはmySQLの初期化

```
% mysqld --initialize --user=mysql
```

--user=mysqlのオプションをつけないとroot実行となるため、以下エラーが出てハマる。

```
[ERROR] [MY-010123] [Server] Fatal error: Please read "Security" section of the manual to find out how to run mysqld as root!
```

次に/var/log/mysqld.logを開いて初期パスワードを確認(メモっておく)

```
[Note] [MY-010454] [Server] A temporary password is generated for root@localhost: [XXXXXXXX]
```

```
% mysqld --ndbcluster --user=mysql
```

```
% ndb_mgm
ndb_mgm> show
[ndbd(NDB)]	2 node(s)
id=2	@192.168.200.101  (mysql-8.0.16 ndb-8.0.16, Nodegroup: 0, *)
id=3	@192.168.200.102  (mysql-8.0.16 ndb-8.0.16, Nodegroup: 0)

[ndb_mgmd(MGM)]	1 node(s)
id=1	@192.168.200.100  (mysql-8.0.16 ndb-8.0.16)

[mysqld(API)]	2 node(s)
id=4	@192.168.200.101  (mysql-8.0.16 ndb-8.0.16)
id=5	@192.168.200.102  (mysql-8.0.16 ndb-8.0.16)
```

## ログイン
各SQLノードで実行が必要っぽい。
メモったroot初期パスワードでログインする

```
% mysql -uroot -p
Enter password: 
```

初回ログイン時はパスワード変更を行うまで何もできない。

```
mysql>XXXXXXXXX
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql>ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';　/*パスワード変更*/
Query OK, 0 rows affected (0.01 sec)

mysql> select * from information_schema.ENGINES; /*エンジンの確認 */
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ENGINE             | SUPPORT | COMMENT                                                        | TRANSACTIONS | XA   | SAVEPOINTS |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ndbcluster         | YES     | Clustered, fault-tolerant tables                               | YES          | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| ndbinfo            | YES     | MySQL Cluster system information storage engine                | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
11 rows in set (0.02 sec)


mysql> select * from ndbinfo.nodes;　/*NDBDノードの確認*/
+---------+--------+---------+-------------+-------------------+
| node_id | uptime | status  | start_phase | config_generation |
+---------+--------+---------+-------------+-------------------+
|       2 |   2752 | STARTED |           0 |                 1 |
|       3 |   2743 | STARTED |           0 |                 1 |
+---------+--------+---------+-------------+-------------------+
2 rows in set (0.02 sec)

```

一つのSQLノードで以下実行

```
mysql> CREATE DATABASE NDB01 default character set utf8mb4;USE NDB01;
Query OK, 1 row affected (0.08 sec)

Database changed
mysql> CREATE TABLE test_poc(id INT NOT NULL AUTO_INCREMENT, jdoc JSON NOT NULL, PRIMARY KEY(id)) ENGINE=NDBCLUSTER;
Query OK, 0 rows affected (0.25 sec)

mysql> show tables;
+-----------------+
| Tables_in_NDB01 |
+-----------------+
| test_poc         |
+-----------------+
1 row in set (0.00 sec)

mysql> desc test_poc;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| jdoc  | json    | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
```

もう一方のSQLノードから上記テーブルが参照できれば一先ずOKかな？

外部アクセス用にフルアクセスユーザを作る。

```
mysql> create user 'test'@'%' identified by 'test';
Query OK, 0 rows affected (0.02 sec)

mysql> grant all privileges on NDB01.* to 'test'@'%';
Query OK, 0 rows affected (0.01 sec)
```

# 停止
 停止もndb_mgmを使う

```
% ndb_mgm -e shutdown
```

とりあえず以上。