盒子
导航
文章目录
  1. 一、集群环境
  2. 二、安装过程
  3. 三、节点克隆
  4. 四、结点配置
    1. <一>、参考文档
    2. <二>、管理节点(MGM)配置
    3. <三>、数据节点(NDB)配置
    4. <四>、SQL节点(API)配置
    5. <五>、集群状态
  5. 五、集群测试
    1. <一>、参考文档
    2. <二>、执行测试
  6. 六、总结

构建MySQL Cluster集群环境

一、集群环境

  • 服务器 Fedora Server 22-x86_64 Under VBox
  • MySQL MySQL Cluster(GPL) 7.4.7 linux glibc2.5 x86_64
  • 具体版本:MySQL Cluster Community Server(GPL) 5.6.25-ndb-7.4.7-cluster-gpl
  • 配置信息
    • Management192.168.1.80 mgmt.dbsvr.com,用以管理集群
    • Storage Node192.168.1.81 ndb01.dbsvr.com,用作数据存储
    • Storage Node192.168.1.82 ndb02.dbsvr.com,用作数据存储
    • Storage Node192.168.1.83 ndb03.dbsvr.com,用作数据存储
    • SQL Node192.168.1.84 sql01.dbsvr.com,用以执行SQL
    • SQL Node192.168.1.85 sql02.dbsvr.com,用以执行SQL
  • Hosts配置

各个MySQL Cluster节点的hosts(/etc/hosts)统一配置为:

192.168.1.80 mgmt.dbsvr.com # NDB Management Server
192.168.1.81 ndb01.dbsvr.com # Data Node 01
192.168.1.82 ndb02.dbsvr.com # Data Node 02
192.168.1.83 ndb03.dbsvr.com # Data Node 03
192.168.1.84 sql01.dbsvr.com # SQL Node 01
192.168.1.85 sql02.dbsvr.com # SQL Node 02

二、安装过程

由于实验环境在虚拟机中进行,虚拟机网络设置要使用桥接方式。可先安装好一个结点,然后再克隆虚拟机,修改Mac和IP地址,作为其他结点。如果全部在实体机上安装,可安装完成一台,然后其他机器再按照这台的安装经验来安装,避免出现其他问题。

安装好Fedora之后安装Vim、配置中科大镜像源,安装dnf取代yum,关闭防火墙,修改hosts(/etc/hosts)和hostname(/etc/hostname,修改后将在命令行中显示为[admin@hostname]$)。在/etc/sysconfig/network-scripts编辑ifcfg-enp0s3,将ip地址由dhcp动态分配改为static静态分配(注释部分为原内容,这里只列出修改和增加的部分内容):

1
2
3
4
5
6
7
8
9
10
11
[admin@mgmt]$ cd /etc/sysconfig/network-scripts
[admin@mgmt]$ sudo vim ifcfg-enp0s3
HWADDR="08:00:27:6E:39:CF"
#BOOTPROTO="dhcp"
BOOTPROTO="static"
#add by admin
NM_CONTROLLED="yes"
IPADDR="192.168.1.80"
NETMASK="255.255.255.0"
GATEWAY="192.168.1.1"
DNS1=172.16.1.3

这里使用二进制安装方式,MySQL Cluster的安装与普通MySQL Server的安装并没有什么区别,区别只在于Cluster多了一些不一样的配置。

已事先将mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz下载到~/目录下(使用虚拟机的情况下可以在服务内使用VSFTP搭建FTP服务器传文件),安装过程参考解压后mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64文件夹下的INSTALL-BINARY文件。这里是Fedora Server 22,为了避免后面的scripts/mysql_install_db --user=mysql执行出错,先安装perl

sudo dnf install -y perl-Module-Install.noarch

然后创建用户和组,解压,更改权限,开始安装MySQL Cluster(在一个具有Administrator权限的用户admin下):

1
2
3
4
5
6
7
8
9
[admin@mgmt]$ sudo groupadd mysql
[admin@mgmt]$ sudo useradd -r -g mysql mysql
[admin@mgmt]$ cd /usr/local
[admin@mgmt]$ sudo tar xzvf ~/mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz
[admin@mgmt]$ sudo ln -s /usr/local mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64 mysql
[admin@mgmt]$ cd mysql
[admin@mgmt]$ sudo chown -R mysql .
[admin@mgmt]$ sudo chgrp -R mysql .
[admin@mgmt]$ sudo scripts/mysql_install_db --user=mysql

如果mysql_install_db成功则会提示:

New default config file was created as ./my.cnf and
will be used by default by the server when you start it.
You may edit this file to change server settings

然后将当前目录(/usr/local/mysql)文件权限设置给root,但data即数据库文件目录设置给mysql:

1
2
3
[admin@mgmt]$ chown -R root .
[admin@mgmt]$ chown -R mysql data
[admin@mgmt]$ sudo bin/mysqld_safe --user=mysql &

检验是否安装成功,进入support-files,启动mysql server:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[admin@mgmt]$ sudo ./mysql.server start
Starting MySQL SUCCESS!
[admin@mgmt]$ cd ../bin
[admin@mgmt]$ ./mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25-ndb-7.4.7-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)

mysql>

MySQL本地服务器安装成功,这就说明安装成功了,但是root账户还没设置密码,需要为root账户设置密码:

1
2
3
4
5
[admin@mgmt]$ pwd
/usr/local/mysql/bin
[admin@mgmt]$ ./mysqladmin -u root password "123456"
Warning: Using a password on the command line interface can be insecure.
[admin@mgmt]$

以上是第一次设置root密码的时候,在命令行下设置,提示通过命令行接口设置密码不安全,不管它。另一个方法是进入mysql设置,这样会比较安全:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[admin@mgmt]$ pwd
/usr/local/mysql/bin
[admin@mgmt]$ ./mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.25-ndb-7.4.7-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SET PASSWORD FOR 'root'@'localhost'=PASSWORD('123456');
1 rows in set (0.00 sec)
mysql>

为了便于进入mysql,在用户配置文件中加入别名设置,这样就可以直接通过在任意地方键入mysql来进入mysql:

1
2
3
4
5
6
7
[admin@mgmt]$ cd
[admin@mgmt]$ ls -a
. .bash_profile
.. .bashrc
.bash_history .mysql_history
.bash_logout mysql-cluster-gpl-7.4.7-linux-glibc2.5-x86_64.tar.gz
[admin@mgmt]$ vim ./.bashrc

然后在.bashrc中加入这一行alias mysql=/usr/local/bin/mysql,保存退出。

三、节点克隆

由于各个MySQL Cluster结点是装在虚拟机中,所以直接使用VBox的虚拟机克隆操作就可以实现,克隆时要选择重新初始化网卡mac地址,以及选择Full Clone即完全克隆,这样会实际拷贝一份虚拟机。由于克隆后系统只是直接复制,所以需要根据VBox虚拟机网卡设置中新分配的MAC地址来修改克隆后的结点的MAC地址和IP地址,路径在:

1
2
3
[admin@mgmt]$ sudo vim /etc/sysconfig/network-scripts/ifcfg-enp0s3
HWADDR="08:00:27:2F:CF:AE"
IPADDR="192.168.1.81"

通过如下命令来在工作站(我的是Mac,工作站的hosts也同一开始说的各个MySQL Cluster结点的hosts设置)中启动虚拟机结点(即MySQL集群服务器),以及用ssh登陆(虚拟机网卡设置为桥接):

1
2
3
4
Fury:~ Fury$ VBoxManage startvm mgmt.dbsvr.com -type vrdp
Waiting for VM "mgmt.dbsvr.com" to power on...
VM "mgmt.dbsvr.com" has been successfully started.
Fury:~ Fury$ ssh -p 22 admin@mgmt.dbsvr.com

上面的startvm后的mgmt.dbsvr.com是虚拟机的名称,我这里恰好设置成了同结点的host domain,vrdp全称为Virtual box Remote Desktop Protocol。
克隆集群服务器

四、结点配置

在各个节点配置好之后首先要启动Management管理结点,然后启动Data Node数据节点和SQL Node查询结点(API结点)。

<一>、参考文档

  1. Configuration of MySQL Cluster
  2. MySQL Cluster Configuration Files

<二>、管理节点(MGM)配置

管理节点即集群的中心,该节点需要记录其下有哪些数据节点和SQL节点,该节点的配置文件有两个,一个是my.cnf本身,一个是config.ini,其中config.ini需要包含入my.cnf当中。管理节点的my.cnf配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
# my.cnf
# # example additions to my.cnf for MySQL Cluster (valid in MySQL 5.6)
#
# # provide connection string for management server host (default port: 1186)
[ndb_mgm]
connect-string=mgmt.dbsvr.com

#
# # provide location of cluster configuration file
[ndb_mgmd]
config-file=/etc/mysql/config.ini

[ndb_mgm]部分通过connect-string指明管理节点的host,这里由于配置了hosts,所以直接写域名,也可以直接写ip地址,管理节点默认的链接端口为1186。在[ndb_mgmd]部分通过config-file来指明Cluster的全局配置文件,里面指明了该集群包括哪些数据节点和SQL节点。这里新建并放置config.ini文件于/etc/mysql/下,该全局配置文件的内容如下(需要自己创建/var/lib/mysql-cluster/usr/local/mysql/mysql-cluster目录,关于NoOfReplicas请参考官方说明:NoOfReplicas):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# file "config.ini" - 2 data nodes and 2 SQL nodes
# This file is placed in the startup directory of ndb_mgmd (the
# management server)
# The first MySQL Server can be started from any host. The second
# can be started only on the host mysqld_5.mysql.com

[ndbd default]
NoOfReplicas= 1
DataDir=/usr/local/mysql/mysql-cluster

[ndb_mgmd]
Hostname= mgmt.dbsvr.com
DataDir=/var/lib/mysql-cluster

[ndbd]
HostName=ndb01.dbsvr.com
[ndbd]
HostName=ndb02.dbsvr.com
[ndbd]
HostName=ndb03.dbsvr.com

[mysqld]
HostName=sql01.dbsvr.com
[mysqld]
HostName=sql02.dbsvr.com

由于mysql会寻找/etc/my.cnf来读取配置文件,所以可以通过如下命令来为my.cnf创建一个链接放到/etc/下:

1
2
3
[admin@mgmt mysql]$ pwd
/usr/local/mysql
[admin@mgmt mysql]$ sudo ln -s /usr/local/mysql/my.cnf /etc/my.cnf

通过在/usr/local/mysql/bin/下使用ndb_mgmd(关于ndb_mgmd子程序的参数和作用参见命令$ ndb_mgmd --help)来启动管理节点:

1
2
3
4
5
6
[admin@mgmt mysql]$ pwd
/usr/local/mysql
[admin@mgmt mysql]$ sudo bin/ndb_mgmd
[sudo] password for admin:
MySQL Cluster Management Server mysql-5.6.25 ndb-7.4.7
[admin@mgmt mysql]$

通过如下命令来查看节点的连接情况(关于ndb_mgm子程序的参数和作用参见命令ndb_mgm --help):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[admin@mgmt mysql]$ bin/ndb_mgm -e show
Connected to Management Server at: mgmt.dbsvr.com:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 3 node(s)
id=2 (not connected, accepting connect from ndb01.dbsvr.com)
id=3 (not connected, accepting connect from ndb02.dbsvr.com)
id=4 (not connected, accepting connect from ndb03.dbsvr.com)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.80 (mysql-5.6.25 ndb-7.4.7)

[mysqld(API)] 2 node(s)
id=5 (not connected, accepting connect from sql01.dbsvr.com)
id=6 (not connected, accepting connect from sql02.dbsvr.com)

[admin@mgmt mysql]$

可以看到管理节点已经启动,地址为192.168.1.80,而三个数据节点和两个SQL节点均未连接过来。

<三>、数据节点(NDB)配置

数据节点的配置相对管理节点要简单一些,它不需要config.ini,只需要在my.cnf中声明其本身为数据节点同时指定管理结点即可。同样地,为my.cnf创建一个链接放到/etc/下:

1
2
3
[admin@mgmt mysql]$ pwd
/usr/local/mysql
[admin@mgmt mysql]$ sudo ln -s /usr/local/mysql/my.cnf /etc/my.cnf

在管理节点的config.ini中的[ndbd default]部分,我们通过DataDir来指定了数据节点的数据库文件存放位置为/usr/local/mysql/mysql-cluster,所以这里需要创建/usr/local/mysql/mysql-cluster目录。如下列出了my.cnf配置文件的内容:

1
2
3
4
5
6
7
8
9
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

[mysqld]
ndbcluster
ndb-connectstring=mgmt.dbsvr.com

[mysql_cluster]
ndb-connectstring=mgmt.dbsvr.com

在[mysqld]部分使用ndbcluster来指明当前是数据节点,然后指明管理节点的地址,另外还需要[mysql_cluster]部分同时在该部分指明管理节点的地址。

使用ndbd子程序来启动数据节点,关于ndbd的参数请参考命令$ ndbd --help,使用如下命令来启动该数据节点:

1
2
3
4
5
6
[admin@ndb01 bin]$ pwd
/usr/local/mysql/bin
[admin@ndb01 bin]$ sudo ./ndbd --initial
2015-10-03 11:15:52 [ndbd] INFO -- Angel connected to 'mgmt.dbsvr.com:1186'
2015-10-03 11:15:52 [ndbd] INFO -- Angel allocated nodeid: 2
[admin@ndb01 bin]$

这说明该节点已经启动成功并且连接到了管理节点,它分配到的节点ID为2。回到管理节点进行查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[admin@mgmt mysql]$ bin/ndb_mgm -e show
Connected to Management Server at: mgmt.dbsvr.com:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 3 node(s)
id=2 @192.168.1.81 (mysql-5.6.25 ndb-7.4.7, starting, Nodegroup: 0)
id=3 (not connected, accepting connect from ndb02.dbsvr.com)
id=4 (not connected, accepting connect from ndb03.dbsvr.com)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.80 (mysql-5.6.25 ndb-7.4.7)

[mysqld(API)] 2 node(s)
id=5 (not connected, accepting connect from sql01.dbsvr.com)
id=6 (not connected, accepting connect from sql02.dbsvr.com)

[admin@mgmt mysql]$

可以发现这个数据节点已经连接上了。使用同样方式配置和启动其他两个数据节点。

<四>、SQL节点(API)配置

SQL节点的配置文件内容是同数据节点的是一样的,但是它由于不存储数据而只做查询,所以不需要创建/usr/local/mysql/mysql-cluster目录,只需要在安装好之后在my.cnf中同数据节点一样加入配置内容即可:

1
2
3
4
5
6
[mysqld]
ndbcluster
ndb-connectstring=mgmt.dbsvr.com

[mysql_cluster]
ndb-connectstring=mgmt.dbsvr.com

SQL节点的启动是启动MySQL Server,即:

1
2
3
4
5
[admin@sql01 support-files]$ pwd
/usr/local/mysql/support-files
[admin@sql01 support-files]$ sudo ./mysql.server start
Starting MySQL.. SUCCESS!
[admin@sql01 support-files]$

以同样方式配置和启动另外一个SQL节点。

<五>、集群状态

回到管理节点执行命令查看各个节点的连接情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[admin@mgmt mysql]$ bin/ndb_mgm -e show
Connected to Management Server at: mgmt.dbsvr.com:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 3 node(s)
id=2 @192.168.1.81 (mysql-5.6.25 ndb-7.4.7, Nodegroup: 0, *)
id=3 @192.168.1.82 (mysql-5.6.25 ndb-7.4.7, Nodegroup: 1)
id=4 @192.168.1.83 (mysql-5.6.25 ndb-7.4.7, Nodegroup: 2)

[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.80 (mysql-5.6.25 ndb-7.4.7)

[mysqld(API)] 2 node(s)
id=5 @192.168.1.84 (mysql-5.6.25 ndb-7.4.7)
id=6 @192.168.1.85 (mysql-5.6.25 ndb-7.4.7)

[admin@mgmt mysql]$

可以发现所有的三个数据节点和两个SQL节点都已经连接上来了。接着就可以进行测试。

五、集群测试

使用集群需要指定引擎为NDBCLUSTER,这样才能使用集群功能,否则使用的只是节点的本地MySQL服务器。

<一>、参考文档

  1. Quick Test Setup of MySQL Cluster

<二>、执行测试

进入sql01这个SQL节点,在test数据库中创建一个表并插入数据,然后到另外一个查询节点看看情况。

分别在sql01和sql02中进入test数据库并查看表,发现为空:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[admin@sql01 ~]$ mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.25-ndb-7.4.7-cluster-gpl MySQL Cluster Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)

mysql> use test;
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql>

在sql01结点中创建一个表并插入一条数据,注意一定要指定engine为ndbcluster:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
mysql> create table cluster_test(id int) engine=ndbcluster;
Query OK, 0 rows affected (0.23 sec)

mysql> insert into cluster_test(id) values(1010);
Query OK, 1 row affected (0.00 sec)

mysql> select * from cluster_test;
+------+
| id |
+------+
| 1010 |
+------+
1 row in set (0.00 sec)

mysql>

然后切换到sql02节点,重新show tables;看看情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> show tables;
Empty set (0.00 sec)

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

mysql> select * from cluster_test;
+------+
| id |
+------+
| 1010 |
+------+
1 row in set (0.00 sec)

mysql>

发现在sql02节点当中已经可以看到在sql01当中创建的表了,查询也取出了数据。这说明该集群的基本配置是已经成功了。

六、总结

这一部分只是MySQL集群的基础性配置,还有很多其他高级配置选项可参考官方文档,另外对于某个数据节点或者SQL节点意外关闭后恢复时数据自动同步、不中断服务情况下修改配置轮询重启节点等测试并未进行。