1、服务器准备

  1. MySQL节点1 10.41.1.85
  2. MySQL节点2 10.41.1.84
  3. ndb节点1 10.41.1.83
  4. ndb节点2 10.41.1.82
  5. 管理节点 10.41.1.81 2、测试环境 5台服务器均一样,不是必须的,所以服务器均已关闭iptables和selinux,生产环境请根据实际情况自行决定 systemctl stop firewalld #关闭防火墙 systemctl disable firewalld #永久关闭防火墙 setenforce 0 #临时关闭selinux sed -i 's#SELINUX=enforcing#SELINUX=disable#g' /etc/selinux/config #永久关闭selinux getenforce #查看当前状态 3、软件准备 mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz 4、管理节点安装配置 建立目录: mkdir /usr/local/mysql/bin -p mkdir /data/mysql-cluster -p 准备文件 cp ./mysql-cluster-gpl-7.2.4-linux2.6-x86_64/bin/ndb_mgm /usr/local/mysql/bin/ cp ./mysql-cluster-gpl-7.2.4-linux2.6-x86_64/bin/ndb_mgmd /usr/local/mysql/bin/ 环境变量 echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile source /etc/profile 配置 cd /data/mysql-cluster/ touch config.ini cat /data/mysql-cluster/config.ini [NDBD DEFAULT] NoOfReplicas=1
    DataMemory=64M
    IndexMemory=16M #管理节点 [NDB_MGMD] nodeid=1 hostname=10.41.1.81 datadir=/data/mysql-cluster #第一个 ndbd 节点: [NDBD] nodeid=2 hostname=10.41.1.83
    datadir=/data/mysql-cluster/data #第二个 ndbd 节点: [NDBD] nodeid=3 hostname=10.41.1.82 datadir=/data/mysql-cluster/data

SQL节点:

[MySQLD] nodeid=4 hostname=10.41.1.85 [MySQLD] nodeid=5 hostname=10.41.1.84 [MySQLD]

6、NDB节点安装(数据节点) 数据节点1: 10.41.1.83 数据节点2: 10.41.1.82 建立用户 useradd mysql 解压mysql cluster tar zxf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz mv mysql-cluster-gpl-7.2.4-linux2.6-x86_64/ /usr/local/mysql/ 授权 cd /usr/local/mysql chown -R mysql . chgrp -R mysql . 建立数据目录,并授权(用来在没使用NDB时存放的数据) mkdir /data/mysql -p chown -R mysql.mysql /data/mysql/ 初始化 /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql 授权root chown -R root . 配置 \cp support-files/my-large.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld 环境变量 echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile source /etc/profile 建立目录(存放NDB节点的数据) mkdir /data/mysql-cluster/data -p 修改/etc/my.cnf文件 cat /etc/my.cnf [mysqld] datadir=/data/mysql basedir= /usr/local/mysql ndbcluster
ndb-connectstring=10.41.1.81
[MYSQL_CLUSTER] ndb-connectstring=10.41.1.81
说明: 如果希望尽可能的各环境保持一致,建议在NDB节点也和SQL节点一样安装整个带有 NDB Cluster 存储引擎的MySQL Server。(NDB节点可以不用初始化数据,自己已经测试,但是我依然会初始化)安装细节和上面的SQL节点完全一样。 7、安装 MySQL 节点 sql节点1: 10.41.1.85 sql节点2: 10.41.1.84 建立用户 useradd mysql 解压mysql cluster tar zxf mysql-cluster-gpl-7.2.4-linux2.6-x86_64.tar.gz mv mysql-cluster-gpl-7.2.4-linux2.6-x86_64/ /usr/local/mysql/ 授权 cd /usr/local/mysql chown -R mysql . chgrp -R mysql . 建立数据目录,并授权(用来在没使用NDB时存放的数据) mkdir /data/mysql -p chown -R mysql.mysql /data/mysql/ 初始化 /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql 授权root chown -R root . 配置 \cp support-files/my-large.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld 环境变量 echo "export PATH=$PATH:/usr/local/mysql/bin" >>/etc/profile source /etc/profile 建立目录(存放NDB节点的数据) mkdir /data/mysql-cluster/data -p 修改/etc/my.cnf文件 cat /etc/my.cnf [mysqld] datadir=/data/mysql basedir= /usr/local/mysql ndbcluster
ndb-connectstring=10.41.1.81
[MYSQL_CLUSTER] ndb-connectstring=10.41.1.81

开始使用Cluster: 8、启动 启动顺序为:管理节点->数据节点->SQL节点(非常重要) a)启动管理节点: ndb_mgmd -f /data/mysql-cluster/config.ini 检查: netstat -ntlp | grep 1186 ps -ef | grep ndb_mgmd | grep -v grep b)启动NDB(数据节点) 注意: 只是在第一次启动或在备份/恢复或配置变化后重启ndbd时,才加–initial参数! ndbd --initial 检查: ps -ef | grep ndbd | grep -v grep c)启动SQL节点(启动mysql服务) /etc/init.d/mysqld start 9、ndb_mgm工具 a)show命令查看集群状态 ndb_mgm> show Cluster Configuration

[ndbd(NDB)] 2 node(s) id=2 @10.41.1.83 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 0, Master) id=3 @10.41.1.82 (mysql-5.5.19 ndb-7.2.4, Nodegroup: 1)

[ndb_mgmd(MGM)] 1 node(s) id=1 @10.41.1.81 (mysql-5.5.19 ndb-7.2.4)

[mysqld(API)] 3 node(s) id=4 @10.41.1.85 (mysql-5.5.19 ndb-7.2.4) id=5 @10.41.1.84 (mysql-5.5.19 ndb-7.2.4) id=6 (not connected, accepting connect from any host) 10、测试1-NDB存储引擎测试 (1)在任意一个SQL节点(我这里选择10.41.1.85)的test_cluster库中创建测试表test_table01(不指定引擎)和test_table02(NDB存储引擎),设置存储引擎为NDB,并插入两条测试数据: mysql> create table test_table01( id int, name varchar(20) ) engine=ndb; mysql> create table test_table02( id int, name varchar(20) ) ; mysql> show tables; +------------------------+ Tables_in_test_cluster +------------------------+ test_table01 test_table02 +------------------------+ 2 rows in set (0.01 sec) 另一sql节点: mysql> show tables; +------------------------+ Tables_in_test_cluster +------------------------+ test_table02 +------------------------+ 1 row in set (0.02 sec) 说明只有ndb引擎才同步。 (2)在test_table02中插入两条测试数据 mysql> insert into t1 select 1,'yayun'; Query OK, 1 row affected (0.11 sec) Records: 1 Duplicates: 0 Warnings: 0

mysql> insert into t1 select 1,'atlas'; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 两个sql节点都能查到数据。 mysql> select * from test_table02; +------+-----------+ id | name +------+-----------+ 1 | cluster01 2 | cluster02 +------+-----------+ 2 rows in set (0.00 sec) 显然,两个SQL节点查询的数据是一致。 (3)在SQL节点10.41.1.85上把测试表test_table02引擎改为MyISAM,再次插入测试数据: mysql> alter table test_table02 engine=myisam; Query OK, 2 rows affected (0.90 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> insert into test_table02 value(3,'cluster03');#10.41.1.84 ERROR 1412 (HY000): Table definition has changed, please retry transaction 插入数据直接报错。

11、单点故障测试 管理节点,不需要特殊的配置,只需要将管理工具和配置文件放置多台服务器上即可。 SQL节点 10.41.1.84上的MySQL服务停止 管理节点: [mysqld(API)] 3 node(s) id=4 @10.41.1.85 (mysql-5.5.19 ndb-7.2.4) id=5 (not connected, accepting connect from 10.41.1.84) id=6 (not connected, accepting connect from any host) 10.41.1.85: mysql> insert into test_table02 value(4,'cluster04'); Query OK, 1 row affected (0.00 sec) mysql> select * from test_table02; +------+-----------+ id | name +------+-----------+ 2 | cluster02 3 | cluster03 4 | cluster04 1 | cluster01 +------+-----------+ 4 rows in set (0.00 sec) 10.41.1.85服务开启: mysql> select * from test_table02; +------+-----------+ id | name +------+-----------+ 3 | cluster03 4 | cluster04 1 | cluster01 2 | cluster02 +------+-----------+ 4 rows in set (0.01 sec) 数据又同步过来了

NDB(数据节点) 数据节点10.41.1.82上的NDB进程停止 [root@node3 mysql]# ps -ef | grep ndbd root 15969 1 0 14:37 ? 00:00:04 ndbd --initial root 15970 15969 1 14:37 ? 00:00:47 ndbd --initial root 16029 15801 0 15:36 pts/3 00:00:00 grep --color=auto ndbd killall ndbd 任意sql节点查询: mysql> select * from test_table02; ERROR 1296 (HY000): Got error 157 'Unknown error code' from NDBCLUSTER 无法查询 10.41.1.81: grep 'NoOfReplicas' /data/mysql-cluster/config.ini NoOfReplicas=1 #每个数据节点的镜像数量 将配置文件中的NoOfReplicas改为2,按照前面的步骤重新启动集群,无法启动,NoOfReplicas参数无法临时更改,我们开始就需要设置好,不要到后面才想到更改,那时就悲剧了。如果重新ndbd --initial,将会丢失所有数据。 NoOfReplicas=2: 管理节点需要--initial参数启动 ndb_mgmd --initial -f /data/mysql-cluster/config.ini 数据节点(NDB)启动还要用ndbd --initial,数据丢失 mysql> select * from test_table02; ERROR 1146 (42S02): Table 'test_cluster.test_table02' doesn't exist mysql> create table test( -> id int, -> name varchar(20) -> ) engine=ndb; Query OK, 0 rows affected (0.85 sec)

mysql> show tables; +------------------------+ Tables_in_test_cluster +------------------------+ test +------------------------+ 1 row in set (0.01 sec)

mysql> insert into test value(1,'one'); Query OK, 1 row affected (0.00 sec)

mysql> insert into test value(2,'two'); Query OK, 1 row affected (0.00 sec)

mysql> select * from test; +------+------+ id | name +------+------+ 1 | one 2 | two +------+------+ 2 rows in set (0.00 sec) 再次停掉数据节点10.41.1.82: 两节点都可以正常数据查询 12、MySQL Cluster集群的关闭 关闭顺序:SQL节点->数据节点->管理节点(在MySQL Cluster环境中,NDB节点和管理节点的关闭都可以在管理节点的管理程序中完成,也可以分节点关闭,但是SQL节点却没办法。所以,在关闭整个MySQL Cluster环境或者关闭某个SQL节点的时候,首先必须到SQL节点主机上来关闭SQL节点程序。关闭方法和MySQL Server的关闭一样。) (1)SQL节点关闭 /etc/init.d/mysqld stop (2)(NDB)数据节点关闭 ndbd stop (3)管理节点关闭 ndb_mgm> shutdown或者命令行:ndb_mgm -e shutdown 总结: 参数NoOfReplicas无法临时更改。 selinux,iptables等相关问题。 注:参考大量网络数据。