1. MySQL集群简介
MySQL Cluster 是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器。MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。MySQL集群将标准的MySQL服务器与名为NDB的“内存中”集群式存储引擎集成了起来。
1.1. MySQL集群版本
mysql-cluster-gpl-noinstall-7.1.26-win32.zip,7.1.26指的是存储引擎的版本号,32是指的32位的windows操作系统。可以在32位或者64位的windows操作系统上32位的MySQL集群,然而64位的MySQL集群只能运行在64位的windows操作系统上,如果在64位CPU上安装32位windows操作系统,也一定要使用32位的MySQL集群。
1.2. 操作系统
本文是在Windows Server 2003 32位操作系统上安装MySQL集群。
1.3. 集群环境基本要求
1.MySQL 群集的数据节点之间的通信是不加密的,也未采用任何防护机制。对于集群,最安全的配置是位于防火墙后的专用网络,不能从外部直接访问任何集群数据或管理节点(对于SQL节点,应采取相同的防护措施,就像在MySQL服务器的其他实例中那样)。
2.MySQL集群是为高带宽环境下的使用而设计的,计算机通过TCP/IP相连。其性能直接取决于集群计算机之间的连接速度。对于集群,最低连接要求包括:典型的100MB以太网网络或等效网络。如果可能,建议使用GB以太网。所以建议把群集建立在一个高速局域网内,不建议跨网段、跨公网的部署这种系统体系
3.所有的数据节点应具有相同的RAM(内存)量,这是因为,集群中任何数据节点所能使用的内存均不超过任意单独数据节点的最低可用内存。换句话讲,如果有三台运行集群数据节点的计算机,在其中两台计算机上,有3GB用于保存集群数据的RAM,另一台计算机只有1GB RAM,那么每个数据节点仅能为集群贡献1GB。
4.可以使用下述公式粗略估计集群中每个数据节点所需的RAM量:
(SizeofDatabase * NumberOfReplicas * 1.1 ) / NumberOfDataNodes 。
5.集群分配给数据节点的内存容量限制默认是80MB,最小为1MB。没有最大尺寸限制,但在实际使用过程中,最大限制应恰当,以便当达到最大限制时,进程不会启动交换功能。该限制由机器上可用的物理RAM量、以及操作系统能提交给任何进程的内存量决定。对于32位操作系统,该限制值为每进程2~4GB,对于64位操作系统,该限制值更大。对于大的数据库,出于该原因,最好使用64位操作系统。
2. 集群节点
MySQL集群环境中有三类集群节点,在最低的MySQL集群配置中,至少有三个节点。在生产环境中仅仅配置这三个节点,这是不切合实际。这样的配置不提供冗余,从MySQL集群的高可用性功能中获益,就必须使用多个数据和SQL节点。也强烈建议使用多个管理节点。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL集群时,它表示的是进程。在单台计算机上可以有任意数目的节点。
这三类节点分别是:
2.1. 管理节点(MGM Node)
这类节点的作用是管理MySQL集群内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。
管理服务器(MGM节点)负责管理集群配置文件和集群日志。集群中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入集群日志。
2.2. 数据节点(NDBD Node)
数据的存储节点,集群中会有多个数据节点,每个节点存储数据多个数据副本。虽然MySQL集群可以设置副本数量为1,即集群没有数据冗余,所有节点的只存储各自数据片段的副本,但是这样的集群也就失去了意义,所以为了保证高可用性,建议最好是设定副本数量至少为2,最大为4,一份用于存储,一份作为冗余。系统默认值为2. 冗余副本数量越大,需要的节点数就会越多。数据节点是用命令ndbd启动的。
2.3. SQL节点(SQL Node)
这是用来访问集群数据的节点。对于MySQL集群,SQL节点是使用NDB集群存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.ini后使用mysqld启动。
3. 集群构成部分
MySQL集群由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB集群的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于集群中这些组件的关系,请参见下图:
4. 集群配置实例
以下配置具有4个节点的集群,每个节点位于不同的主机上,而且在典型的以太网中具有固定的网络地址,如下所述:
节点 | IP地址 |
管理(MGM)节点 | 192.168.0.10 |
MySQL服务器(SQL)节点 | 192.168.0.20 |
数据(NDBD)节点"A" | 192.168.0.30 |
数据(NDBD)节点"B" | 192.168.0.40 |
通过下图可更清楚的表明这点:
在每台机器上安装了标准的100 Mbps或1吉比特以太网卡,为每块网卡安装了恰当的驱动程序,并用标准的以太网联网装置(如交换器等)将4台主机连接起来(所有机器应使用具有相同容量的网卡,也就是说,集群中的所有4台机器应全部使用100M网卡,或全部使用1G网卡)。MySQL集群将工作在100 Mbps网络中,但吉比特以太网能提供更好的性能。
管理节点需要config.ini文件,该文件通知节点有多少需要维护的副本,需要在每个数据节点上为数据和索引分配多少内存,数据节点的位置,在每个数据节点上保存数据的磁盘位置,以及SQL节点的位置。该文件仅由MySQL集群管理服务器读取,随后管理服务器会将包含该文件的信息分配给集群中的所有进程。
每个数据节点或SQL节点需要1个my.ini文件,该文件提供了两类信息:connectstring(连接字符串),用于通知节点到哪里找到MGM节点;以及一行用于通知该主机(容纳数据节点的机器)上的MySQL服务器运行在NDB模式下,普通的MySQL服务器是不支持集群环境的,在开启MySQL服务器的时候需要指定服务器支持集群存储引擎。
在SQL节点的主机上必须安装完整的MySQL服务器,对于管理节点主机和数据节点主机上没有必要安装MySQL服务器,在管理节点主机上需要管理服务器程序(ndb_mgmd.exe),也可以安装管理客户端(ndb_mgm.exe),管理客户端为管理节点提供了一个命令行窗口。每一个数据节点主机上需要数据节点程序(ndbd.exe)。
SQL节点配置:我下载的是免安装版本的MySQL集群,所以在192.168.0.20主机上直接解压出来放到 C:\mysql 目录下就可以了,目录可以自己制定,将 C:\mysql\bin加到 Windows 系统 path 环境变量中。在C:\mysql目录下创建my.ini文件,my.ini文件内容如下:
[mysqld] # Options for mysqld process: ndbcluster # run NDB storage engine ndb-connectstring=192.168.0.10 # location of management server |
目前给定的配置都是MySQL集群环境最简单的配置。ndbcluster参数指定MySQL服务器在集群存储引擎模式下运行。ndb-connectstring参数指出管理服务器所在主机。验证运行的服务器是否启用了NDB集群存储引擎的简单方法是,在MySQL监视器(mysql)中发出命令SHOW ENGINES。在列出NDBCLUSTER的行中应能看到值YES,如果在该行上看到NO(或在输出中未显示该行),你所运行的是未启用NDB功能的MySQL版本。
C:\mysql\bin> mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 5.1.2-alpha-Max 键入’help;’或’\h’获取帮助。键入’\c’清空缓冲区。 mysql> SHOW ENGINES\G *************************** 1. row *************************** Engine: ndbcluster Support: YES Comment: Clustered, fault-tolerant tables Transactions: YES XA: NO Savepoints: NO *************************** 2. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO ... |
注意,上例输出中显示的行号可能与你的系统上显示的不同,具体情况取决于使用的MySQL版本,以及配置它的方式。
数据节点配置:在数据节点192.168.0.30上,创建目录C:\mysql, C:\mysql\bin, 和C:\mysql\cluster-data;然后将免安装包中bin目录下的 ndbd.exe 文件拷贝至 C:\mysql\bin 目录,将C:\mysql\bin路径配置到windows的path环境变量中;在C:\mysql目录下创建文件my.ini,my.ini文件内容如下:
[mysql_cluster] # Options for data node process: ndb-connectstring=192.168.0.10 # location of management server |
ndb-connectstring参数指出管理服务器所在主机。
在192.168.0.30上的操作,同样在192.168.0.40上也操作一遍。如果数据节点和SQL节点在同一台主机上,以上两部分的配置信息,都可以写到同一个my.ini文件中。
其他保持默认配置,整个my.ini文件内容如下:
[client] port= 3306 socket= MySQL default-character-set=utf8
[mysqld] ndbcluster ndb-connectstring=192.168.1.91 port= 3306 socket= MySQL key_buffer_size = 16K max_allowed_packet = 1M table_open_cache = 4 sort_buffer_size = 64K read_buffer_size = 256K read_rnd_buffer_size = 256K net_buffer_length = 2K thread_stack = 512K character-set-server=utf8 skip-name-resolve server-id= 1 [mysql_cluster] ndb-connectstring=192.168.1.91
[mysqldump] quick max_allowed_packet = 16M
[mysql] no-auto-rehash
[myisamchk] key_buffer_size = 8M sort_buffer_size = 8M
[mysqlhotcopy] interactive-timeout |
管理节点配置:在192.168.0.10主机上创建C:\mysql\bin,C:/mysql/bin/cluster-logs目录;从免安装包中bin目录下拷贝 ndb_mgmd.exe 和ndb_mgm.exe 文件到该主机上的C:\mysql\bin目录,将该目录配置到windows的path环境变量中;在C:\mysql\bin目录下创建文件config.ini,config.ini内容如下:
[ndbd default] # Options affecting ndbd processes on all data nodes: NoOfReplicas=2 DataDir=C:/mysql/bin/cluster-data
DataMemory=80M IndexMemory=18M
[ndb_mgmd] # Management process options: NodeId=1 HostName=192.168.0.10 DataDir=C:/mysql/bin/cluster-logs
[ndbd] # Options for data node "A": NodeId=2 HostName=192.168.0.30
[ndbd] # Options for data node "B": NodeId=3 HostName=192.168.0.40
[mysqld] # SQL node options: NodeId=4 HostName=192.168.0.20 |
对于配置文件中路径的指定,可以有如下两种写法:
DataDir=C:\\mysql\\bin\\cluster-logs
DataDir=C:/mysql/bin/cluster-logs
不能这样写:
DataDir=C:\mysql\bin\cluster-logs
[ndbd default]配置组指定数据节点的默认配置,适用于所有的数据节点,相当于所有数据节点的公共配置;NoOfReplicas指出整个集群环境中副本的数量;DataDir指出数据节点中数据存放在磁盘上的目录;DataMemory指出分配给数据节点存储数据的内存容量;IndexMemory指出分配给数据节点存储索引的内存容量;[ndb_mgmd]配置组指出管理节点的配置;HostName指出管理节点所在主机IP;DataDir指出管理节点中日志存放的目录;[ndbd]配置组指出单个数据节点的配置;HostName指定数据节点所在的主机IP;[mysqld]配置组指定sql节点的配置;HostName指定sql节点所在主机IP。
5. 初始化启动集群
1.在管理节点(192.168.0.10)上,运行以下命令:
C:\mysql\bin> ndb_mgmd
可以使用-f参数指定config.ini文件所在目录,如果不指定,默认情况下,ndb_mgmd将尝试读取位于当前工作目录下的文件config.ini。
注意:第一次启动管理节点之后,管理节点会将从config.ini文件中读取的内容缓存起来,下次启动的时候,config.ini文件中的配置会被忽略。如果配置文件内容有改动,就需要在命令行使用--reload 或者--initial 操作去刷新配置缓存。
2.在每一个数据节点上运行如下命令:
C:\mysql\bin> ndbd --initial
运行这个命令,会读取该节点上的my.ini文件的内容。
注意:仅应在首次启动ndbd时,或在备份/恢复或配置变化后重启ndbd时使用“--initial”参数,这很重要。原因在于,该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。
3.在sql节点上运行如下命令:
C:\mysql\bin> mysqld
运行这个命令,会读取该节点上的my.ini文件的内容。也可以使用如下命令,使日志输出到控制台:
C:\mysql\bin> mysqld --console
4.在管理节点上打开一个新的命令行窗口,运行管理客户端,使用如下命令:
C:\mysql\bin> ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm>
可以使用ALL STATUS命令,查看所有数据节点的状态,如下:
ndb_mgm> ALL STATUS
Connected to Management Server at: localhost:1186
Node 2: started (mysql-5.1.67 ndb-7.1.26)
Node 3: started (mysql-5.1.67 ndb-7.1.26)
ndb_mgm>
以上显示的内容,根据具体的集群版本而定。也可以使用SHOW 命令,查看这个集群的状态,如下:
ndb_mgm> SHOW
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.1.30 (mysql-5.1.67 ndb-7.1.26, Nodegroup: 0, Master)
id=3 @192.168.1.40 (mysql-5.1.67 ndb-7.1.26, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.1.10 (mysql-5.1.67 ndb-7.1.26)
[mysqld(API)] 1 node(s)
id=4 @192.168.1.40 (mysql-5.1.67 ndb-7.1.26)
具体的输出内容可能会略有不同,这取决于你所使用的MySQL版本。
6. 安全关闭
要想关闭集群,可在MGM节点所在的机器上,在命令行窗口中简单地输入下述命令:
C:\mysql\bin> ndb_mgm -e shutdown
该命令将恰当地中止ndb_mgm、ndb_mgmd以及任何ndbd进程。使用mysqladmin shutdown或其他方法,可中止SQL节点。
7. 测试
正常运行的 MySQL 群集系统,通过SQL节点可以对数据节点进行数据库操作,各数据节点可以自动进行数据同步。某一个数据节点关闭后,不影响SQL节点的使用。某些数据节点出错后,可以进行恢复。需要注意的是,SQL节点建立数据库时,必须选择“ndbcluster”数据库引擎。如果不选择“ndbcluster”引擎,建立的数据库将不会进入MySQL群集系统中,但是可以独立使用。
7.1. 测试实例
在某台 SQL 节点上登录 mysql,建表 city,并插入数据:
C:/>mysql -u root test
mysql>create table city (nId mediumint unsigned not null auto_increment primary key,
sName varchar(20) not null) engine = ndbcluster default charset utf8;
mysql>insert city values(1, ‘city-1’);
mysql>insert city values(1, ‘city-2’);
在另一台 SQL 节点上登录 mysql,从表 city 里得到记录:
C:/>mysql -u root test
mysql>select * from city;
在群集系统正常工作的情况下,应当能取到先前插入的所有记录。
7.2. 单点故障测试
1、还可以人为停止某一个数据节点(Ctrl+C中断DOS命令ndbd.exe,停止该服务),看看所有的 SQL 节点是不是能正常工作。
2、在某一个数据节点停止后,进行数据库操作。然后重新开启该数据节点,看看群集中的所有的 SQL 节点能不能得到完整的数据。
8. Java程序访问Mysql集群
假设集群环境中有两个sql节点,分别在192.168.0.20和192.168.0.30上,那么Java程序如何访问呢,我采用的Jdbc驱动为mysql-connector-java-5.1.7-bin.jar,连接池为c3p0-0.9.1.2.jar,连接串如下:
jdbc:mysql:loadbalance://192.168.0.20:3306,192.168.0.30:3306/test?useUnicode=true&characterEncoding=utf8。
接下来还需要配置数据库允许远程访问,比如我把应用服务器放在192.168.0.50机器上面,需要在20和30两台机器上面分别配置:
grant all privileges on *.* to root@’192.168.0.50’ Identified by "12345678" with grant option;
flush privileges;
允许192.168.0.50主机使用账号root、密码12345678远程访问任何数据库任何表。
参考:
http://blog.csdn.net/zhangking/article/details/5670070
http://dev.mysql.com/doc/refman/5.1/zh/ndbcluster.html
http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster.html