主页
软件技术
返回
MySQL集群安装

        花了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