Heim >Datenbank >MySQL-Tutorial >mysql集群搭建

mysql集群搭建

WBOY
WBOYOriginal
2016-06-07 15:35:041239Durchsuche

MySQL 群集是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1 个群集中运行多个 MySQL 服务器。在 MySQL 5.0 及以上的二进制版本中,以及与最新的 Linux 版本兼容的 RPM 包中提供了该存储引擎。 MySQL 群集是一

MySQL 群集是 MySQL 适合于分布式计算环境的高可用、高冗余版本。它采用了 NDB Cluster 存储引擎,允许在 1 个群集中运行多个 MySQL 服务器。在 MySQL 5.0 及以上的二进制版本中,以及与最新的 Linux 版本兼容的 RPM 包中提供了该存储引擎。

    MySQL 群集是一种技术,该技术允许在无共享的系统中部署“内存中”和“磁盘中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL 服务器,NDB Cluster 的数据节点,管理服务器,以及(可能存在的)专门的数据访问程序。

    管理服务器(MGM节点)负责管理 Cluster 配置文件和 Cluster 日志。Cluster 中的每个节点从管理服务器检索配置数据。当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入 Cluster 日志。

    目前能够运行 MySQL Cluster 的操作系统有 Linux、Mac OS X 和 Solaris,最新的版本已经支持 Windows 操作系统。

    MySQL 群集的数据节点之间的通信是不加密的,并且需要高速的带宽,所以建议把群集建立在一个高速局域网内,不建议跨网段、跨公网的部署这种系统体系。

    MySQL 群集分为三种节点:管理节点,数据节点和SQL节点。

    管理节点:主要用于管理各个节点,能够通过命令对某个节点进行重启、关闭、启动等操作。也能够监视全部节点的工作状态。
    数据节点:主要是对数据的存储,不提供其他的服务。
    SQL节点:主要是对外提供SQL功能,类似一台普通的 MySQL Server。

    而SQL节点和数据节点可以是同一台机器,也就是说这台机器即是SQL节点也是数据节点。它们只是逻辑关系上的划分,实际部署时,甚至所有的阶段都可以位于同一台物理机器上,只是配置较复杂些。

 mysql集群搭建


    一、软件下载机器操作环境

    配置 MySQL 群集必需使用其群集版本,注意和 MySQL Server 版本的区别。本文以 Windows 平台下的 MySQL 群集版本 MySQL Cluster 7.1.3 为例(截至2010年6月初的最高版本),这是 MySQL Server 5.1 系列版本之一,添加了群集的功能。下载地址为:http://dev.mysql.com/downloads/cluster,选择 mysql-cluster-gpl-noinstall-7.1.3-win32.zip 文件,这是一个 for Windows 32位版本的、免安装的二进制版本。

    根据自己的操作系统的位数,也可以选择 64 位版本的。还有一个 27.2M 的 Windows(x86, 32-bit) 版本,下载下来需要自己编译,有经验的高级用户可以选用。

    本实验在 2 台安装 Windows Server 2003(sp2) 的机器上进行。节点分配及 IP 配置如下:

    第一台机器,IP 为 10.0.0.201,作为管理节点(MGM),SQL节点1(SQL1),数据节点1(NDBD1)。
    第二台机器,IP 为 10.0.0.202,作为SQL节点2(SQL2),数据节点2(NDBD2)。

    管理节点最好不要与数据节点部署在同一台服务器上,否则可能会因为该数据节点服务器的当机,而导致管理节点服务器的问题,从而导致整个群集系统的崩溃。

 

    二,配置管理节点:

    在第一台机器上,建文件夹 D:/mysql-cluster,在其下建立文件 config.ini,内容如下:

    [NDBD DEFAULT]
    NoOfReplicas=1

    [MYSQLD DEFAULT]

    [NDB_MGMD DEFAULT]

    [TCP DEFAULT]

    # Managment Server
    [NDB_MGMD]
    hostname=10.0.0.201

    # Storage Engines
    [NDBD]
    hostname=10.0.0.201
    datadir= D:/data

    [NDBD]
    hostname=10.0.0.202
    datadir= D:/data

    # SQL Engines
    [MYSQLD]
    hostname=10.0.0.201

    [MYSQLD]
    hostname=10.0.0.202

    Cluster 管理节点的默认端口是1186,数据节点的默认端口是 2202。从 MySQL 5.0.3开始,该限制已被放宽,Cluster 能够根据空闲的端口自动地为数据节点分配端口。如果你的版本低于5.0.22,请注意这个细节。

    Cluster 管理节点作为一个服务端(通过运行 db_mgmd.exe 程序读取本配置文件来启动),通过本机上的客户端 ndb_mgm.exe 来连接和操作。

 

    三、配置 MySQL 数据库服务器:

    在2台机器上,分别依次操作。

    解压 mysql-cluster-gpl-noinstall-7.1.3-win32.zip 文件到 D:/mysql-cluster-gpl-noinstall-7.1.3-win32 文件夹下,把 D:/mysql-cluster-gpl-noinstall-7.1.3-win32/bin 加到 Windows 的系统 path 中。

    打开DOS命令行窗口(配置完系统path后,在再次打开新的命令行窗口),执行以下语句,让 MySQL 作为 Windows 服务运行:

    mysqld.exe -install mysql

    再在 Windows 服务管理界面里,配置 mysql 服务,手动启动(不要自动启动)。

    把 D:/mysql-cluster-gpl-noinstall-7.1.3-win32 下的某个备用的配置文件(例如my-small.ini)复制为 my.ini 文件。

    建立 D:/tmp 文件夹。

 

    四、配置SQL节点和数据节点:

    在2台机器上,分别依次操作。

    建立文件夹 D:/data。

    编辑 NySQL 配置文件 D:/mysql-cluster-gpl-noinstall-7.1.3-win32/my.ini,在 [mysqld] 节末尾加语句:

    #SQL群集节点
    ndbcluster
    ndb-connectstring=10.0.0.201

    有了 ndbcluster 语句,mysql 服务将作为群集的 SQL 节点启动。mysqld.exe 命令带参数 –ndbcluster 运行是一样的效果。
    mysql 服务连接到数据节点的 2202 默认端口,或自动分配的别的可用端口。
    (问题:SQL节点如何获得数据节点的IP地址?是否通过连接管理节点,取得所有数据节点的IP地址的列表?)
    这里的连接字符串的值在 MySQL 服务启动时使用,用于连接到管理节点。

    在末尾加语句:

    #NDB集群节点
    [mysql_cluster]
    ndb-connectstring=10.0.0.201

    注:好像以下形式也可:
    [ndbd]
    ndb-connectstring=10.0.0.201

    这里的连接字符串的值在数据节点启动时使用,用于连接到管理节点。

 

    五,启动群集各服务器

    启动顺序依次是:管理节点、数据节点、SQL节点。

    1,启动管理节点

    在第一台服务器的DOS窗口,运行命令:

    C:/>ndb_mgmd.exe -f d:/mysql-cluster.conf/config.ini –configdir=d:/mysql-cluster

    注:如果不带 –configdir=d:/mysql-cluster 参数,将默认为 C:/mysql/mysql-cluster 文件夹。

    屏幕显示:

    C:/>ndb_mgmd.exe -f d:/mysql-cluster.conf/config.ini –configdir=d:/mysql-cluster
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — NDB Cluster Management Server. mysql-5.1.44 ndb-7.1.3
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Reading cluster configuration from ‘d:/mysql-cluster.conf/config.ini’
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Got initial configuration from ‘d:/mysql-cluster.conf/config.ini’, will try to set it when all ndb_mgmd(s) started
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Mgmt server state: nodeid 1 reserved for ip 10.0.0.201, m_reserved_nodes 1.
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Id: 1, Command port: *:1186
    ==INITIAL==
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Starting initial configuration change
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Configuration 1 commited
    2010-06-10 01:16:57 [MgmtSrvr] INFO     — Config change completed! New generation: 1
    ==CONFIRMED==

    2,启动数据节点

    分别在2台服务器的DOS窗口运行命令。

    第一次,或初始化群集节点时,运行命令:

    ndbd.exe –initial

    初始化之后,只运行 ndbd.exe 即可。若带参数 –initial 运行,将使正常运行的群集系统中,数据节点的数据全部丢失。

    数据节点依赖管理节点服务器,进行数据的自动复制和同步,使各个数据节点的数据保持一致,并在某个数据节点意外关闭又恢复后,进行数据的恢复重建。

    3,启动SQL节点

    有了 ndbcluster 语句,启动 mysql 服务,就启动了SQL节点。应在前2种节点启动后,分别在2台服务器上进行。

 

    六、群集管理

    在所有的数据节点和SQL节点未启动之前,运行群集管理节点服务的客户端 ndb_mgm.exe,只能获得以下信息:

    C:/>ndb_mgm.exe
    — NDB Cluster — Management Client –
    ndb_mgm> show
    Cluster Configuration
    ———————
    [ndbd(NDB)]     2 node(s)
    id=2 (not connected, accepting connect from 10.0.0.201)
    id=3 (not connected, accepting connect from 10.0.0.202)

    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.0.0.201  (mysql-5.1.44 ndb-7.1.3)

    [mysqld(API)]   2 node(s)
    id=4 (not connected, accepting connect from 10.0.0.201)
    id=5 (not connected, accepting connect from 10.0.0.202)

    ndb_mgm>

    说明数据节点、SQL节点均未连接到管理节点服务。

    在所有的数据节点和SQL节点正确启动之后,将获得以下信息:

    ndb_mgm> show
    Cluster Configuration
    ———————
    [ndbd(NDB)]     2 node(s)
    id=2    @10.0.0.201  (mysql-5.1.44 ndb-7.1.3, Nodegroup: 0, Master)
    id=3    @10.0.0.202  (mysql-5.1.44 ndb-7.1.3, Nodegroup: 1)

    [ndb_mgmd(MGM)] 1 node(s)
    id=1    @10.0.0.201  (mysql-5.1.44 ndb-7.1.3)

    [mysqld(API)]   2 node(s)
    id=4    @10.0.0.201  (mysql-5.1.44 ndb-7.1.3)
    id=5    @10.0.0.202  (mysql-5.1.44 ndb-7.1.3)

    ndb_mgm>

    关闭群集的DOS命令:

    ndb_mgm -e shutdown

    或在 ndb_mgm 环境下执行 shutdown 命令。

    以上命令或关闭管理节点服务和所有的数据节点。随意、强行关闭群集系统(关机或关闭进程),会导致数据没有全部写回磁盘而导致的数据丢失。

    关闭SQL节点的 mysqld 服务:

    C:/>net stop mysql,或:

    C:/>mysqladmin -u root shutdown

 

    七、测试

 

    正常运行的 MySQL 群集系统,通过SQL节点可以对数据节点进行数据库操作,各数据节点可以自动进行数据同步。某一个数据节点关闭后,不影响SQL节点的使用。某些数据节点 出错后,可以进行恢复。需要注意的是,SQL节点建立数据库时,必须选择“ndbcluster”数据库引擎。如果不选择“ndbcluster”引擎, 建立的数据库将不会进入MySQL群集系统中,但是可以独立使用。

    另外,每个 NDB 表必须有一个主键。如果在创建表时未定义主键,NDB Cluster 存储引擎将自动生成隐含的主键。该隐含的键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见。

    测试实例:

    在某台 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;

    在群集系统正常工作的情况下,应当能取到先前插入的所有记录。

 

    另外的测试(单点故障测试):

    1,还可以人为停止某一个数据节点(Ctrl+C中断DOS命令ndbd.exe,停止该服务),看看所有的 SQL 节点是不是能正常工作。
    2,在某一个数据节点停止后,进行数据库操作。然后重新开启该数据节点,看看群集中的所有的 SQL 节点能不能得到完整的数据。

 

    八、常见问题与扩展

    配置和管理 MySQL 群集系统并不是一件简单的事情。由于不合理的配置导致的系统问题非常常见,比如网络故障、内存限制等,会导致仲裁体统强制关闭数据节点。

    如果机器上原来已经安装过 MySQL Server,则一定要卸载干净原来的数据库系统。注意群集系统中的 mysql.exe 程序与非群集系统的管理 Client 是不同的。

    还可以与负载均衡系统结合,以提供更强的可用性和数据存取效率。

    可能由于未知的Bug或别的原因,导致群集系统出现一些意外故障。所以建议选取版本时,选择已经得到大多数人认可的版本,不一定选取最新的版本,最新的版本往往不太稳定。当然也不要选用太陈旧的功能有限制的版本。

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn