花了3天半时间,终于把mysql集群配置起来了,爽~很多文档只写一些配置语句,我使用的mysql集群版本是:我没有选择7以上的版本 mysql-cluster-gpl-6.3.51-linux-i686-glibc23.tar.gz 我的Linux操作系统是:centos6.5(选择这个版本的原因是网上做集群的基本选择这个) 我最开始试过在windows下安装mysql集群,失败了,失败后网上解决办法也很少,所以不建议用windows做测试。 做实验失败是很正常的,遇到错误可以参考我的<mysql集群错误解决方案>,直接贴错误提示出来。 注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL簇时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语簇主机。 有三类簇节点,在最低的MySQL簇配置中,至少有三个节点,这三类节点分别是: 管理(MGM)节点:这类节点的作用是管理MySQL簇内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令ndb_mgmd启动的。 数据节点:这类节点用于保存簇的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。没有必要有一个以上的副本。数据节点是用命令ndbd启动的。 SQL节点:这是用来访问簇数据的节点。对于MySQL簇,客户端节点是使用NDB簇存储引擎的传统MySQL服务器。典型情况下,SQL节点是使用命令mysqld –ndbcluster启动的,或将ndbcluster添加到my.cnf后使用mysqld启动。 基本假定 本节作了如下假定: 1.我们将建立具有4个节点的簇,每个节点位于不同的主机上,而且在典型的以太网中具有固定的网络地址,如下所述: 注:192.168.0.10-40是原文档的地址,做实验时我配的是表格“/”右边的地址。 节点 IP地址 管理(MGM)节点 192.168.0.10/192.168.1.13 MySQL服务器(SQL)节点 192.168.0.20/192.168.1.9 数据(NDBD)节点"A" 192.168.0.30/192.168.1.11 数据(NDBD)节点"B" 192.168.0.40/192.168.1.3 2. 通过下图可更清楚的表明这点:(注,原文档的图) 安装 硬件、软件和联网 MySQL簇的一个强大优点在于,它能运行在普通硬件上,除了需要较大的RAM(256M)外在这点上没有特殊要求,这是因为实际的数据存储均是在内存中进行的。 对于每台运行存储或SQL节点的MySQL簇主机计算机,必须在其上安装MySQL-max二进制版本。对于管理节点,没有必要安装MySQL服务器二进制版本,但应安装MGM服务器端口监督程序和客户端二进制版本(分别是ndb_mgmd和ndb_mgm)。在本节中,我们介绍了为每种簇节点安装正确的二进制版本所需的步骤。 存储节点和SQL节点安装 在设计为运行存储节点或SQL节点的三台机器的每一台上,以系统根用户身份执行下述步骤: 1. 检查你的/etc/passwd和/etc/group文件(或使用操作系统提供的用于管理用户和组的工具),查看在系统上是否已存在mysql组和mysql用户,这是因为某些操作系统会将其作为安装进程的一部分予以创建。如果它们不存在,创建新的mysql用户组,然后为该组添加1个mysql用户。 2. groupadd mysql 3. useradd -g mysql mysql 4. max可执行文 进入包含下载文件的目录,解包档案文件,并创建与mysql-件的symlink。注意,根据MySQL的版本号,实际的文件名和目录名会有所不同。 5. cd /var/tmp 注:实际我是把mysql-cluster-gpl-6.3.51-linux-i686-glibc23.tar.gz放到/usr/local下所以上面这句改为: cd /var/tmp 6. tar -xzvf -C /usr/local/bin mysql-cluster-gpl-6.3.51-linux-i686-glibc23.tar.gz 7. ln -s /usr/local/bin/mysql-cluster-gpl-6.3.51-linux-i686-glibc23 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 /etc/rc.d/init.d/mysql.server 注:以上的第18点源文档缺少/etc/rc.d/init.d/,做实验时会报错 在此,我们使用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 注:实际我是把mysql-cluster-gpl-6.3.51-linux-i686-glibc23.tar.gz放到/usr/local下所以上面这句改为: cd /var/tmp 3. tar -zxvf mysql-cluster-gpl-6.3.51-linux-i686-glibc23.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 我的配置文件: #options for mysqld process: [MYSQLD] ndbcluster # run NDB engine ndb-connectstring=192.168.1.13 # location of MGM node user=mysql # Options for ndbd process: [MYSQL_CLUSTER] ndb-connectstring=192.168.1.13 # 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) 我的配置: #options affecting ndbd processes on all data nodes: [NDBD DEFAULT] NoOfReplicas=2 # Number of replicas DataMemory=40M # 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. MaxNoOfOrderedIndexes=512 [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.1.13 # 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.1.11 # 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.1.3 # Hostname or IP address datadir=/usr/local/mysql/data # Directory for this data node's datafiles # SQL node options: [MYSQLD] hostname=192.168.1.9 # Hostname or IP address # (additional mysqld connections can be # specified for this node for various # purposes such as running ndb_restore) [MYSQLD] hostname=192.168.1.11 [MYSQLD] hostname=192.168.1.3 (注释:"world"数据库可从站点下载,它列在“示例”栏目下)。 注释:簇管理节点的默认端口是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 注意,执行以上命令应先关掉防火墙,使用service iptables stop,仅应在首 次启动ndbd时,或在备份,恢复或配置变化后重启ndbd时使用“--initial”参数,这很重要。原因在于,该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括恢复用日志文件。 5.Mysql节点启动方式为:直接重启服务器即可。 6.如果一切顺利,并已正确设置了簇,那么簇现在应能运行。通过调用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) 我的运行结果: Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.1.11 (mysql-5.1.67 ndb-6.3.51, Nodegroup: 0, Master) id=3 @192.168.1.3 (mysql-5.1.67 ndb-6.3.51, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.13 (mysql-5.1.67 ndb-6.3.51) [mysqld(API)] 3 node(s) id=4 @192.168.1.9 (mysql-5.1.67 ndb-6.3.51) id=5 @192.168.1.11 (mysql-5.1.67 ndb-6.3.51) id=6 @192.168.1.3 (mysql-5.1.67 ndb-6.3.51) 具体的输出内容可能会略有不同,这取决于你所使用的MySQL版本。 注释:如果你正在使用较早的MySQL版本,你或许会看到引用为‘[mysqld(API)]’的SQL节点。这是一种早期的用法,现已放弃。 现在,应能在MySQL簇中处理数据库,表和数据。关于这方面的简要讨论,请参见17.3.5节,“加载示例数据并执行查询”。 测试: 应该达到的结果为:在mysql节点创建数据库,表,插入数据等操作,在两个ndb数据节点上会立马同步复制过去。 或者:在一个数据节点创建数据库,表,插入数据,在另外一个ndb数据节点也可以看到具体测试自己都可以做。实际过程中,我的数据最开始并没有同步过去,但通过ndb_mgm查看节点都是起来的,原因在我的mysql集群解决方案中会有体现。 与没有使用簇的MySQL相比,在MySQL簇内操作数据的方式没有太大的区别。执行这类操作时应记住两点: 表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB簇存储引擎在簇内复制它们。如果使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表创建语句,或用这类选项之一替换任何已有的ENGINE(或TYPE)选项。例如,假定在另一个MySQL服务器(不支持MySQL簇)上有样本世界数据库,而且你打算导出城市表的定义: shell> mysqldump --add-drop-table world City > city_table.sql 在所得的city_table.sql文件中,将包含这条表创建语句(以及导入表数据所需的INSERT语句): DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) ENGINE=MyISAM; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (remaining INSERT statements omitted) 需要确认MySQL为该表使用了NDB存储引擎。有两种完成该任务的方法。其中一 种方法是,在将表导入簇数据库之前更改其定义,使其类似于(仍使用“城市” 作为示例): DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) ENGINE=NDBCLUSTER; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (etc.) 对于将成为簇数据库组成部份的每个表,均需要为其定义执行上述操作。完成该任务的最简单方法是,简单地在world.sql文件上执行“查找-替换”,并用ENGINE=NDBCLUSTER替换所有的TYPE=MyISAM实例。如果你不打算更改该文件,可使用ALTER TABLE。详情请参见下面的介绍。 假定你已在簇的SQL节点上创建了名为“world”的数据库,随后可使用mysql 命令行客户端读取city_table.sql,并按通常方式创建和填充对应的表: shell> mysql world < city_table.sql 请记住,上述命令必须在运行SQL节点的主机上执行,这点十分重要。对于本例,应在IP地址为192.168.0.20的机器上执行。 要想在SQL节点上创建世界数据库的副本,请将文件保存到/usr/local/mysql/data,然后运行: shell> cd /usr/local/mysql/data shell> mysql world < world.sql 当然,SQL脚本必须能被mysql系统用户读取。如果将文件保存到了不同的目录下,请作相应的调整。 注意,在MySQL 5.1中,NDB簇不支持自动发现数据库的功能,这点很重要(请参见17.8节,“MySQL簇的已知限制”)。这意味着,一旦在一个数据节点上创建了世界(world)数据库和它的表,在簇中的每个SQL节点上还需要发出命令CREATE DATABASE world(从MySQL 5.0.2开始,可以使用CREATE SCHEMA world取而代之),后跟FLUSH TABLES。这样,节点就能识别数据库并读取其表定义。 在SQL节点上运行SELECT查询与在MySQL服务器的任何其他实例上运行查询没有区别。要想从命令行运行查询,首先应按照通常方式登录到MySQL监视器: shell> mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 to server version: 5.1.2-alpha 键入’help;’或’h’获取帮助。键入’c’清空缓冲区。 mysql> 如果在导入MySQL脚本之前未更改表定义中的ENGINE=子句,应在此时运行下述命令: mysql> USE world; mysql> ALTER TABLE City ENGINE=NDBCLUSTER; mysql> ALTER TABLE Country ENGINE=NDBCLUSTER; mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER; 注意,在这里我们简单地使用了MySQL服务器密码为空的默认根用户账户。当然,在生产设置下,安装MySQL服务器时,总应遵守标准的安全方法措施,包括设置牢靠的根用户密码,并为用户创建具有完成任务所需的权限的用户账户。关于这方面的更多信息,请参见5.7节,“MySQL访问权限系统”。 需要关注的是,当簇节点彼此访问时不使用MySQL的权限系统,设置或更改MySQL用户账户(包括根用户账户)不影响节点之间的交互,它们仅对访问SQL节点的应用程序有效。 能够以通常的方式选择数据库,并对表执行SELECT查询,就像退出MySQL监视器一样: mysql> USE world; mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; +-----------+------------+ | 名称 | 人口 | +-----------+------------+ | 孟买 | 10500000 | | 汉城 | 9981619 | | 圣保罗 | 9968485 | | 上海 | 9696300 | | 雅加达 | 9604900 | +-----------+------------+ 5 rows in set (0.34 sec) mysql> q Bye shell> 使用MySQL的应用程序能够使用标准的API。重要的是应记住,你的应用程序必须访问SQL节点,而不是MGM或存储节点 另外还请记住,每个NDB表必须有一个主键。如果在创建表时用户未定义主键,NDB簇存储引擎将自动生成隐含的主键。(注释:该隐含 键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见)。 安全关闭和重启 要想关闭簇,可在MGM节点所在的机器上,在Shell中简单地输入下述命令: shell> ndb_mgm -e shutdown 该命令将恰当地中止ndb_mgm、ndb_mgmd以及任何ndbd进程。使用mysqladmin shutdown或其他方法,可中止SQL节点。注意,这里的“-e”选项用于将命令从shell传递到ndb_mgm客户端。请参见4.3.1节,“在命令行上使用选项”。 要想重启簇,可简单地运行下述命令: 在管理主机上(本设置中为192.168.0.10): shell> ndb_mgmd -f /var/lib/mysql-cluster/config.ini 在每台数据节点主机上(192.168.0.30和192.168.0.40): shell> ndbd 请记住,正常重启NDBD节点时,不要用“--initial”选项调用该命令。 在SQL主机上(192.168.0.20): shell> mysqld & 关于创建簇备份的更多信息,请参见17.6.5.2节,“使用管理服务器创建备份”。 要想从备份中恢复簇,需要使用ndb_restore命令。请参见17.6.5.3节,“如何恢复簇备份”。 关于配置MySQL簇的更多信息,请参见17.4节,“MySQL簇的配置”。 使用簇时有需要我了解的限制吗,MySQL中的NDB表服从下述限制: o 并非所有的字符集和校对均被支持。 o 不支持FULLTEXT索引和前缀索引。只能为完整的列设置索引。不支持第19章:MySQL中的空间扩展中介绍的空间扩展。 o 仅支持对事务的完整回滚。不支持部分回滚以及回滚至保存点。 o 每表允许的最大属性数为128,而且属性名称不得超过31个字符。对于每个表,表和数据库名称的最大组合长度为122个字符。 o 表行的最大大小为8KB,不包括BLOB。对于每表中的行数没有限制,表的大小限制取决于多种因素,尤其是每个数据节点可用的RAM量。 o NDB引擎不支持外键约束。就像MyISAM表一样,这些约束将被忽略。 o 不支持查询高速缓冲功能。
信息发布:广州名易软件有限公司 http://www.myidp.net
|