分类: Mysql/postgreSQL
2008-05-11 22:23:57
MySQL簇是MySQL适合于分布式计算环境的高实用、高冗余版本。它采用了NDB簇存储引擎,允许在1个簇中运行多个MySQL服务器。在MySQL 5.1二进制版本中、以及与最新的Linux版本兼容的RPM中提供了该存储引擎。(注意,要想获得MySQL簇的功能,必须安装mysql-server和mysql-max RPM)。
目前能够运行MySQL簇的操作系统有Linux、Mac OS X和Solaris。(一些用户通报成功地在FreeBSD上运行了MySQL簇,但MySQL AB公司尚未正式支持该特性)。我们正在努力,以便使MySQL簇能运行在MySQL支持的所有操作系统上,包括Windows,而且当支持新的平台时,将更新该页面。
本章介绍了正在进行的工作,其内容将随着MySQL簇的不断演化而变化。关于MySQL簇的更多信息,请访问MySQL AB公司的网站。
或许你也希望使用MySQL AB提供的两种额外资源:
· MySQL簇。
· MySQL用户论坛上的。
关于簇的一些常见问题,请参见17.10节,“MySQL簇常见问题解答”。如果你是MySQL簇的新手,请阅读我方开发人员区的文章如何为两个服务器设置MySQL簇,这会有所帮助。
MySQL簇是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的簇。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
MySQL簇将标准的MySQL服务器与名为NDB的“内存中”簇式存储引擎集成了起来。在我们的文档中,术语NDB指的是与存储引擎相关的设置部分,而术语“MySQL簇”指的是MySQL和NDB存储引擎的组合。
MySQL簇由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB簇的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于簇中这些组件的关系,请参见下图:
所有这些程序一起构成了MySQL簇。将数据保存到NDB簇存储引擎中时,表将保存在数据节点内。能够从簇中所有其他MySQL服务器直接访问这些表。因此,在将数据保存在簇内的工资表应用程序中,如果某一应用程序更新了1位雇员的工资,所有查询该数据的其他MySQL服务器能立刻发现这种变化。
对于MySQL簇,保存在数据节点内的数据可被映射,簇能够处理单独数据节点的故障,除了少数事务将因事务状态丢失而被放弃外,不会产生其他影响。由于事务性应用程序能够处理事务失败事宜,因而它不是问题源。
通过将MySQL簇引入开放源码世界,MySQL为所有需要它的人员提供了具有高可用性、高性能和可缩放性的簇数据管理。
NDB是一种“内存中”存储引擎,它具有可用性高和数据一致性好的特点。
能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但以簇层面上的存储引擎开始最简单。MySQL簇的NDB存储引擎包含完整的数据集,仅取决于簇本身内的其他数据。
下面,我们介绍了设置由NDB存储引擎和一些MySQL服务器构成的MySQL簇的设置方法。
目前,MySQL簇的簇部分可独立于MySQL服务器进行配置。在MySQL簇中,簇的每个部分被视为1个节点。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语簇主机。
有三类簇节点,在最低的MySQL簇配置中,至少有三个节点,这三类节点分别是:
· 管理(MGM)节点:这类节点的作用是管理MySQL簇内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。
· 数据节点:这类节点用于保存簇的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。没有必要有一个以上的副本。数据节点是用命令ndbd启动的。
· SQL节点:这是用来访问簇数据的节点。对于MySQL簇,客户端节点是使用NDB簇存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动。
簇配置包括对簇中单独节点的配置,以及设置节点之间的单独通信链路。对于目前设计的MySQL簇,其意图在于,从处理器的能力、内存空间和带宽来讲,存储节点是同质的,此外,为了提供单一的配置点,作为整体,簇的所有配置数据均位于1个配置文件中。
管理服务器(MGM节点)负责管理簇配置文件和簇日志。簇中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现有趣的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入簇日志。
此外,可以有任意数目的簇客户端进程或应用程序。它们分为两种类型:
· 标准MySQL客户端:对于MySQL簇,它们与标准的(非簇类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL簇。
· 管理客户端:这类客户端与管理服务器相连,并提供了优雅地启动和停止节点、启动和停止消息跟踪(仅对调试版本)、显示节点版本和状态、启动和停止备份等的命令。
本节介绍了如何规划、安装、配置和运行MySQL簇的基本知识。与17.4节,“MySQL簇的配置”中给出的示例不同,按照下面介绍的步骤和指南,所得的结果应是有用的MySQL簇,它满足对数据可用性和安全防护的最低要求。
在本节中,我们介绍了下述内容:硬件和软件要求,联网事宜,MySQL簇的安装,配置事宜,簇的启动、停止和重启,加载样本数据库,以及执行查询的方法。
基本假定
本节作了如下假定:
1. 我们将建立具有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 |
2. 通过下图可更清楚的表明这点:
4. 注释:出于简单性(以及可靠性)方面的考虑,在本基本知识介绍中我们仅使用数值IP地址。但是,如果在你的网络中具备DNS解析功能,在配置簇的过程中,可使用主机名代替IP地址。作为可选方式,也能使用/etc/hosts文件,或能提供主机查询的操作系统的等效物(如果可用的话)。
5. 在我们的场景中,每台主机均是基于Intel的桌面PC,PC上运行的是常见的一般性Linux版本,操作系统以标准配置安装在磁盘上,未运行任何不必要的服务。具备标准TCP/IP联网客户端的核心操作系统应足以符合我们的要求。此外,为了简单性,我们还假定所有主机上的文件系统是等同的。如果这些主机上的文件系统不同,就需对这些说明作相应的调整。
6. 在每台机器上安装了标准的100 Mbps或1吉比特以太网卡,为每块网卡安装了恰当的驱动程序,并用标准的以太网联网装置(如交换器等)将4台主机连接起来(所有机器应使用具有相同容量的网卡,也就是说,簇中的所有4台机器应全部使用100M网卡,或全部使用1G网卡)。MySQL簇将工作在100 Mbps网络中,但吉比特以太网能提供更好的性能。
注意,MySQL簇不适合于连通性低于100 Mbps的网络。出于该原因(尤其是),在公共网络如Internet上运行MySQL簇很难成功,也不推荐这样做。
7. 对于样本数据,我们将使用世界数据库,该数据库可从MySQL AB公司的网站上下载。由于该数据库占用的空间相对较小,我们假定每台机器有256 MB RAM,这足以运行操作系统、主机NDB进程、以及存储数据库(对于数据节点)。
尽管在本基本介绍中采用的是Linux操作系统,但对这里给出的说明和步骤来说,仅过简单的修改,也能适用于Solaris或Mac OS X。此外,我们还假定你已掌握了安装和配置具备联网功能的操作系统的基本知识,或能够在需要的时候获得帮助。
下一节,我们更详细地讨论了MySQL簇的硬件、软件和联网要求。(请参见17.3.1节,“硬件、软件和联网”)。
MySQL簇的一个强大优点在于,它能运行在普通硬件上,除了需要较大的RAM外在这点上没有特殊要求,这是因为实际的数据存储均是在内存中进行的。(注意,未来这点会改变,我们打算在未来的MySQL簇版本中实现基于磁盘的存储)。显然,多个CPU和更快的CPU能增强性能。对于簇进程来说,对内存的要求相对较少。
簇的软件要求程度适中。主机操作系统不需要任何特殊模块、服务、应用程序、或配置就能支持MySQL簇。对于Mac OS X或Solaris,标准安装就已足够。对于Linux,标准的“即开即用”安装应是所需的全部。MySQL软件要求很简单:MySQL-max 5.1的生产版就是所需的全部,要想获得簇支持,必须使用MySQL的-max版本。无需自己编译MySQL就能使用簇。在本节中,我们假定你使用了与Linux相适应的-max二进制版本。对于Solaris或Mac OS X操作系统,相应的部分可通过MySQL软件下载页面获得,http://dev.mysql.com/downloads/。
对于节点之间的通信,簇支持采用标准拓扑方案的TCP/IP联网,对于每台主机的预期最低要求是1块标准的100 Mbps以太网卡,对于作为整体的簇,还需加上交换器、网络集线器或路由器以提供网络连通性。我们强烈建议,应在其自己的子网内运行MySQL簇,不与非簇机器共享该子网,原因如下:
· 安全性:簇节点之间的通信未采用任何特殊加密或防护。对MySQL簇内传输的唯一保护方法是,在受保护的网络上运行簇。如果打算将MySQL簇用于Web应用,簇应明确地位于防火墙后面,而且不应位于网络的非军事区(DMZ)或其他地方。
· 效率:在专有的或受保护的网络上设置MySQL簇,这样,簇就能独享簇主机之间的带宽。为MySQL簇使用单独的交换器不仅能防止对簇数据的非法访问,而且还能确保簇节点不受网络上其他计算机之间信息传输的干扰。为了增强可靠性,可以使用双交换器和双卡,以防止网络出现单点故障,对于这类通信链路,很多设备驱动均支持故障切换功能。
也能与MySQL簇一起使用高速SCI(规模可扩展的计算机接口),但这不是要求的。关于该协议的更多信息,以及它与MySQL簇的用法,请参见17.7节,“使用与MySQL簇的高速互连”对于每台运行存储或SQL节点的MySQL簇主机计算机,必须在其上安装MySQL-max二进制版本。对于管理节点,没有必要安装MySQL服务器二进制版本,但应安装MGM服务器端口监督程序和客户端二进制版本(分别是ndb_mgmd和ndb_mgm)。在本节中,我们介绍了为每种簇节点安装正确的二进制版本所需的步骤。
MySQL AB提供了预编译的二进制文件,它们支持簇,你不需要自己编译这些文件(如果你确实需要定制的二进制文件,请参见2.8.3节,“从开发源码树安装”)。因此,对于每台簇主机,安装进程的第一步是从MySQL下载区下载文件mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz。我们假定你将该文件放在各机器的/var/tmp目录下。
对于32位和64位Linux平台,均有相应的RPM,RPM安装的-max二进制文件支持NDB簇存储引擎。如果你选择使用它们而不是二进制文件,务必在运行簇节点的所有机器上安装-server和-max软件包(关于使用RPM安装MySQL的更多信息,请参见2.4节,“在Linux下安装MySQL”)。使用RPM完成安装后,仍需对簇进行配置,请参见17.3.3节,“配置”。
注释:完成安装后,不启动任何二进制文件。配置完所有节点后,我们将向你介绍执行这类操作的方法。
存储节点和SQL节点安装
在设计为运行存储节点或SQL节点的三台机器的每一台上,以系统根用户身份执行下述步骤:
1. 检查你的/etc/passwd和/etc/group文件(或使用操作系统提供的用于管理用户和组的工具),查看在系统上是否已存在mysql组和mysql用户,这是因为某些操作系统会将其作为安装进程的一部分予以创建。如果它们不存在,创建新的mysql用户组,然后为该组添加1个mysql用户。
2. groupadd mysql
3. useradd -g mysql mysql
4. 进入包含下载文件的目录,解包档案文件,并创建与mysql-max可执行文件的symlink。注意,根据MySQL的版本号,实际的文件名和目录名会有所不同。
5. cd /var/tmp
6. tar -xzvf -C /usr/local/bin mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz
7. ln -s /usr/local/bin/mysql-max-5.1.2-alpha-pc-linux-gnu-i686 mysql
8. 进入mysql目录,运行所提供的用于创建系统数据库的脚本:
9. cd mysql
10. scripts/mysql_install_db --user=mysql
11.为MySQL服务器和数据目录设置必要的权限:
12. chown -R root .
13. chown -R mysql data
14. chgrp -R mysql .
注意,在每台运行数据节点的机器上,数据目录是/usr/local/mysql/data。配置管理节点时将用到这类信息(请参见17.3.3节,“配置”)。
15.将MySQL启动脚本拷贝到恰当的目录下,使之成为可执行的脚本,并设置它以便在启动操作系统时启动:
16. cp support-files/mysql.server /etc/rc.d/init.d/
17. chmod +x /etc/rc.d/init.d/mysql.server
18. chkconfig --add mysql.server
在此,我们使用Red Hat的chkconfig来创建与启动脚本的链接,请在你的操作系统上使用恰当的用于该目的的方式,如Debian上的update-rc.d。
请记住,对于存储节点或SQL节点所在的每台机器,必须分别指向上述步骤。
管理节点安装
对于MGM(管理)节点,不需要安装mysqld可执行文件,仅需安装用于MGM服务器和客户端的二进制文件,这类文件可在下载的-max档案中找到。再次假定你将该文件放在了/var/tmp目录下,引导系统时(也就是说使用sudo, su root或系统的等效命令后,假定具有系统管理员账户的权限),执行下述步骤,在簇管理节点主机上安装ndb_mgmd和ndb_mgm:
1. 即如/var/tmp目录,从档案文件中将ndb_mgm和ndb_mgmd提取到恰当的目录下,如/usr/local/bin:
2. cd /var/tmp
3. tar -zxvf mysql-max-5.1.2-alpha-pc-linux-gnu-i686.tar.gz /usr/local/bin '*/bin/ndb_mgm*'
4. 进入解包文件所在的目录,然后使这两个文件成为可执行的:
5. cd /usr/local/bin
6. chmod +x ndb_mgm*
在17.3.3节,“配置”中,我们将为示例簇中的所有节点创建和编写配置文件。
对于我们的4节点、4主机MySQL簇,需要编写4个配置文件,每个节点/主机1个。
· 每个数据节点或SQl节点需要1个my.cnf文件,该文件提供了两类信息:connectstring(连接字符串),用于通知节点到哪里找到MGM节点;以及一行,用于通知该主机(容纳数据节点的机器)上的MySQL服务器运行在NDB模式下。
关于连接字符串的更多信息,请参见17.4.4.2节,“MySQL簇连接字符串”。
· 管理节点需要config.ini文件,该文件通知节点有多少需要维护的副本,需要在每个数据节点上为数据和索引分配多少内存,数据节点的位置,在每个数据节点上保存数据的磁盘位置,以及SQL节点的位置。
配置存储节点和SQL节点
数据节点所需的my.cnf文件相当简单。配置文件应位于/etc目录下,并能用任何文本编辑器进行编辑(如有必要,创建该文件),例如:
vi /etc/my.cnf
对于本示例中的每个数据节点和SQL节点,my.cnf文件类似于:
# Options for mysqld process:
[MYSQLD]
ndbcluster # run NDB engine
ndb-connectstring=192.168.0.10 # location of MGM node
# Options for ndbd process:
[MYSQL_CLUSTER]
ndb-connectstring=192.168.0.10 # location of MGM node
输入上述内容后,保存文件并退出文本编辑器。在容纳数据节点“A”、数据节点“B”和SQL节点的机器上分别执行上述操作。
配置管理节点
配置MGM节点的第一步是创建目录,该目录用于存放配置文件,然后创建配置文件本身。例如(以根用户身份运行):
mkdir /var/lib/mysql-cluster
cd /var/lib/mysql-cluster
vi config.ini
在此使用了vi来创建文件,不过,任何文本编辑器均应能胜任。
对于我们的典型设置,config.ini文件应类似于:
# Options affecting ndbd processes on all data nodes:
[NDBD DEFAULT]
NoOfReplicas=2 # Number of replicas
DataMemory=80M # How much memory to allocate for data storage
IndexMemory=18M # How much memory to allocate for index storage
# For DataMemory and IndexMemory, we have used the
# default values. Since the "world" database takes up
# only about 500KB, this should be more than enough for
# this example Cluster setup.
# TCP/IP options:
[TCP DEFAULT]
portnumber=2202 # This the default; however, you can use any
# port that is free for all the hosts in cluster
# Note: It is recommended beginning with MySQL 5.0 that
# you do not specify the portnumber at all and simply allow
# the default value to be used instead
# Management process options:
[NDB_MGMD]
hostname=192.168.0.10 # Hostname or IP address of MGM node
datadir=/var/lib/mysql-cluster # Directory for MGM node logfiles
# Options for data node "A":
[NDBD]
# (one [NDBD] section per data node)
hostname=192.168.0.30 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# Options for data node "B":
[NDBD]
hostname=192.168.0.40 # Hostname or IP address
datadir=/usr/local/mysql/data # Directory for this data node's datafiles
# SQL node options:
[MYSQLD]
hostname=192.168.0.20 # Hostname or IP address
# (additional mysqld connections can be
# specified for this node for various
# purposes such as running ndb_restore)
(注释:"world"数据库可从站点http://dev.mysql.com/doc/下载,它列在“示例”栏目下)。
一旦创建了所有的配置文件并指定了这些最低选项,可启动簇,并验证所有进程均能正常运行。关于这方面的讨论,请参见17.3.4节,“首次启动”。
关于可用MySQL簇配置参数以及其用法的更多信息,请参见17.4.4节,“配置文件”和17.4节,“MySQL簇的配置”。关于与进行备份有关的MySQL簇配置,请参见17.6.5.4节,“簇备份的配置”。
注释:簇管理节点的默认端口是1186,数据节点的默认端口2202。从MySQL 5.0.3开始,该限制已被放宽,簇能够根据空闲的端口自动地为数据节点分配端口。
完成配置后,启动簇并不很困难。必须在数据节点所在的主机上分别启动每个簇节点进程。尽管能够按任何顺序启动节点,但我们建议,应首先启动管理节点,然后启动存储节点,最后启动SQL节点:
1. 在管理主机上,从系统shell发出下述命令以启动MGM节点进程:
2. shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini
注意,必须用“-f”或“--config-file”选项,告诉ndb_mgmd到哪里找到配置文件(详情请参见17.5.3节,“ndb_mgmd,“管理服务器”进程”)。
3. 在每台数据节点主机上,对于首次启动,运行下述命令启动NDBD进程:
4. shell> ndbd --initial
注意,仅应在首次启动ndbd时,或在备份/恢复或配置变化后重启ndbd时使用“--initial”参数,这很重要。原因在于,该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。
5. 如果使用RPM在SQL节点所在的簇主机上安装了MySQL,能够(也应当)使用安装在/etc/init.d下的启动脚本在SQL节点上启动MySQL服务器进程。注意,要想运行“-max”服务器二进制文件,除了标准的RPM外,还需要安装-max服务器RPM。
如果一切顺利,并已正确设置了簇,那么簇现在应能运行。通过调用ndb_mgm管理节点客户端,可对其进行测试。其输出应类似于:
shell> ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> SHOW
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.30 (Version: 5.1.2-alpha, Nodegroup: 0, Master)
id=3 @192.168.0.40 (Version: 5.1.2-alpha, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.10 (Version: 5.1.2-alpha)
[mysqld(SQL)] 1 node(s)
id=4 (Version: 5.1.2-alpha)
具体的输出内容可能会略有不同,这取决于你所使用的MySQL版本。
注释:如果你正在使用较早的MySQL版本,你或许会看到引用为‘[mysqld(API)]’的SQL节点。这是一种早期的用法,现已放弃。
现在,应能在MySQL簇中处理数据库,表和数据。关于这方面的简要讨论,请参见17.3.5节,“加载示例数据并执行查询”。