MySql Cluster配置
博客已经搬家,请访问如下地址:http://www.czhphp.com
相比前面介绍的各种复制结构,MySql Cluster最显著的优点就是高可用性,高实时性,高冗余,扩展性强。但是MySql Cluster的性能一直偏低,好在现在的7.x版本,性能上已经有了很大的改进和提高。
MySql Cluster采用的是NDB存储引擎,在建表的时候必须指定ENGINE为ndbcluster,这是一种内存式的存储引擎,因此对内存的要求很高。足够大的内存,处理速度更快的CPU,更快的网络的环境(千兆以上),在Sql节点使用cache技术等措施都能显著提高集群的效率,但是具体的优化配置得根据你的实际情况和需求而定,所以本文只是在测试环境下验证Cluster的配置,不涉及性能调优等细节。
首先我们看看MySql官网对MySql Cluster主要构成的三大组成部分的简单解释:
管理(MGM)节点:这类节点的作用是管理MySQL集群内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。
数据节点(Data Nodes):这类节点用于保存集群的数据。数据节点是用命令ndbd启动的。
SQL节点(Sql Nodes):这是用来访问集群数据的节点。对于MySQL集群,客户端节点是使用NDB集群存储引擎的传统MySQL服务器。
服务器配置信息约定:
1
2
3
4
5
6
7
8
|
主机名 ip 节点种类 ClusterMgm 192.168.0.100 管理节点 SqlNode1 192.168.0.101 Sql节点 SqlNode2 192.168.0.102 Sql节点 SqlNode3 192.168.0.103 Sql节点 DataNode1 192.168.0.104 Data节点 DataNode2 192.168.0.105 Data节点 DataNode3 192.168.0.106 Data节点 |
从图上你可能看到,除了MySql Cluster本身的三大组成部分外,我在应用程序和Sql节点之间加了负载均衡装置,这是因为集群本身的Sql节点并没有实现负载均衡,而且单独使用的时候会出现单节点故障,要实现这个访问负载均衡可以通过相关软方法(比如LVS)或者专门的硬件装置来实现,为了得到更好的效果,我推荐你用后者。
各种节点里需要安装的软件:
Sql Nodes:MySQL-Cluster-gpl-server,MySQL-Cluster-gpl-client
Data Nodes:MySQL-Cluster-gpl-storage
NDB Management Server:MySQL-Cluster-gpl-management,MySQL-Cluster-gpl-tools
第一步,在各节点里下载并安装软件:
1.在Sql节点(SqlNode1,SqlNode2,SqlNode3)上分别下载安装MySQL-Cluster-gpl-server和MySQL-Cluster-gpl-client
1
2
3
4
|
[root@SqlNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-server-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@SqlNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-server-7.1.15-1.rhel5.i386.rpm [root@SqlNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-client-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@SqlNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-client-7.1.15-1.rhel5.i386.rpm |
注意:安装之后,有提示让你设置root密码,先不要设置,也不要启动Mysql服务器!
2.在NDB节点(DataNode1,DataNode2,DataNode3)上分别下载安装MySQL-Cluster-gpl-storage
1
2
|
[root@DataNode1 /2/3 ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-storage-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@DataNode1 /2/3 ~] # rpm -ivh MySQL-Cluster-gpl-storage-7.1.15-1.rhel5.i386.rpm |
3.在管理节点(ClusterMgm)里下载安装MySQL-Cluster-gpl-management,MySQL-Cluster-gpl-tools
1
2
3
|
[root@ClusterMgm ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-management-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@ClusterMgm ~] # wget http://dev.mysql.com/get/Downloads/MySQL-Cluster-7.1/MySQL-Cluster-gpl-tools-7.1.15-1.rhel5.i386.rpm/from/http://ftp.jaist.ac.jp/pub/mysql/ [root@ClusterMgm ~] # rpm -ivh MySQL-Cluster-gpl-management-7.1.15-1.rhel5.i386.rpm MySQL-Cluster-gpl-tools-7.1.15-1.rhel5.i386.rpm |
注意,我是去MySql官网下载的,如果你复制代码不能下载,那么说明软件版本可能升级了,你自己去官方下载。
第二步,开始配置集群:
1.配置Sql节点(SqlNode1,SqlNode2,SqlNode3),分别在3个节点里进行:
A.创建设置文件/etc/my.cnf:
1
2
3
4
5
6
7
8
9
10
|
[root@SqlNode1 /2/3 ~] # vi /etc/my.cnf #......其他参数略...... [client] port = 3306 socket = /var/lib/mysql/mysql .sock [mysqld] port = 3306 socket = /var/lib/mysql/mysql .sock ndbcluster ndb-connectstring = 192.168.0.100 <----管理节点IP |
2.配置数据节点(DataNode1,DataNode2,DataNode3),分别在3个节点里进行:
A.创建集群相关数据保存目录,并创建专属用户:
1
2
|
[root@DataNode1 /2/3 ~] # useradd -M -d /dev/null -s /sbin/nologin -c "Mysql Cluster" mysql [root@DataNode1 /2/3 ~] # chown mysql:mysql /var/lib/mysql-cluster |
B.创建设置文件/etc/my.cnf:
1
2
3
|
[root@DataNode1 /2/3 ~] # vi /etc/my.cnf [mysql_cluster] ndb-connectstring = 192.168.0.100 <----管理节点IP |
3.配置管理节点(ClusterMgm):
A.创建设定文件目录,并配置设定文件:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
[root@ClusterMgm ~] # mkdir /var/lib/mysql-cluster [root@ClusterMgm ~] # vi /var/lib/mysql-cluster/cluster.conf # 影响所有数据节点的全局配置 # 如果你的内存不多,DataMemory和IndexMemory设置过大,会导致集群启动失败(数据节点耗尽内存) [NDBD DEFAULT] NoOfReplicas=3 <----数据节点的个数 DataMemory=64M <----分配给data storage使用的内存 IndexMemory=18M <----分配给index storage使用的内存 #TCP/IP选项: [TCP DEFAULT] portnumber=2202 #管理节点配置: [NDB_MGMD] hostname =192.168.0.100 datadir= /var/lib/mysql-cluster #Sql节点1的配置(SqlNode1): [MYSQLD] hostname =192.168.0.101 #Sql节点2的配置(SqlNode21): [MYSQLD] hostname =192.168.0.102 #Sql节点3的配置(SqlNode3): [MYSQLD] hostname =192.168.0.103 #数据节点1的配置(DataNode1): [NDBD] hostname =192.168.0.104 datadir= /var/lib/mysql-cluster #数据节点2的配置(DataNode2): [NDBD] hostname =192.168.0.105 datadir= /var/lib/mysql-cluster #数据节点3的配置(DataNode3): [NDBD] hostname =192.168.0.106 datadir= /var/lib/mysql-cluster |
注意:这个设定文件基本上是最简单的配置文件,更多的设置参数请参照官方文档并根据你服务器的硬件条件和实际需求去设置。
第三步,启动集群:
我们启动的顺序是管理节点->数据节点->Sql节点
1.启动管理节点:
1
|
[root@ClusterMgm ~] # ndb_mgmd -f /var/lib/mysql-cluster/cluster.conf |
2.稍等片刻后,启动数据节点(DataNode1,DataNode2,DataNode3),分别在3个节点里运行:
1
|
[root@DataNode1 /2/3 ~] # ndbd --initial |
★必须注意:只是在第一次启动或在备份/恢复或配置变化后重启ndbd时,才加–initial参数!
3.稍等片刻后,启动Sql节点(SqlNode1,SqlNode2,SqlNode3)并设置root密码,分别在3个节点里运行:
1
2
|
[root@SqlNode1 /2/3 ~] # /etc/init.d/mysql start [root@SqlNode1 /2/3 ~] # /usr/bin/mysqladmin -u root password 'MyMysqlPassword' |
4.确认集群状态,在管理节点(ClusterMgm)里执行:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@ClusterMgm ~] # ndb_mgm -- NDB Cluster -- Management Client -- ndb_mgm> show Connected to Management Server at: localhost:1186 Cluster Configuration --------------------- [ndbd(NDB)] 3 node(s) id =5 @192.168.0.104 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, Master) id =6 @192.168.0.105 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0) id =7 @192.168.0.106 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id =1 @192.168.0.100 (mysql-5.1.56 ndb-7.1.15) [mysqld(API)] 3 node(s) id =2 @192.168.0.101 (mysql-5.1.56 ndb-7.1.15) id =3 @192.168.0.102 (mysql-5.1.56 ndb-7.1.15) id =4 @192.168.0.103 (mysql-5.1.56 ndb-7.1.15) ndb_mgm> |
从上面的结果中可以看出,我们的集群已经配置成功了,如果你的显示结果里有节点没连接上,那么检查一遍你的所有配置,看看各节点里的日志相关信息。
现在你可以在Sql节点添加一些MySql用户,然后进行各种数据库的测试了。
★非常重要:
1.在建表的时候一定要用ENGINE=NDB或ENGINE=NDBCLUSTER指定使用NDB集群存储引擎,或用ALTER TABLE选项更改表的存储引擎。
2.NDB表必须有一个主键,因此创建表的时候必须定义主键,否则NDB存储引擎将自动生成隐含的主键。
3.Sql节点的用户权限表仍然采用MYISAM存储引擎保存的,所以在一个Sql节点创建的MySql用户只能访问这个节点,如果要用同样的用户访问别的Sql节点,需要在对应的Sql节点追加用户。虽然在MySql Cluster7.2版本开始提供了”用户权限共享”,但是7.2还是开发版本,而本文用的是7.15稳定版,所以就不介绍这个功能了。
第三步,关闭集群:
1.关闭管理节点和数据节点,只需要在管理节点(ClusterMgm)里执行:
1
2
3
4
|
[root@ClusterMgm ~] # ndb_mgm -e shutdown Connected to Management Server at: localhost:1186 3 NDB Cluster node(s) have shutdown . Disconnecting to allow management server to shutdown . |
2.然后关闭Sql节点(SqlNode1,SqlNode2,SqlNode3),分别在3个节点里运行:
1
2
|
[root@SqlNode1 /2/3 ~] # /etc/init.d/mysql stop Shutting down MySQL... SUCCESS! |
注意:要再次启动集群,就按照第三步的启动步骤即可,不过这次启动数据节点的时候就不要加”–initial”参数了。