五,MYSQL集群

考虑到企业需要保护MySQL数据的安全。而MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。

Mysql群集(Cluster)简介

       MySQL群集需要有一组计算机,每台计算机的角色可能是不一样的。MySQL群集中有三种节点:管理节点、数据节点和SQL节点。群集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。

       管理节点(也可以称管理服务器)主要负责管理数据节点和SQL节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。

       数据节点用于存储数据。

       SQL节点跟一般的MySQL服务器是一样的,我们可以通过它进行SQL操作。

       下图中画出了三种群集节点及应用程序间的关系:

windows2003负载均衡企业级方案(三)_的

MySQL Cluster的下载

       我们使用的Mysql Server已经不能满足群集的要求,配置群集需要使用MySQL Cluster。

       MySQL Cluster支持Linux、Mac OS X、Solaris和Windows操作系统。鸡啄米以Windows系统下的MySQL Cluster版本MySQL Cluster 7.2.5为例说明MySQL Cluster的配置和启动。

       MySQL Cluster的下载地址是http://dev.mysql.com/downloads/cluster。如果你的操作系统是32位的,就选择Windows (x86, 32-bit), ZIP Archive下载,大小为228.9M,如果是64位的,就下载Windows (x86, 64-bit), ZIP Archive,大小为232.7M。它们都是免安装的二进制版本。 ()

MySQL Cluster的配置

       首先找三台电脑,或者是开三个虚拟机,管理节点部署在一台机子上,其他两台每台都部署一个数据节点和一个SQL节点。鸡啄米这里以两台机子举例,其中一台(IP为192.168.10.1)部署管理节点、数据节点和SQL节点,另一台(IP为192.168.10.2)部署数据节点和SQL节点。

       其实最好不要将管理节点跟数据节点部署到一台机子上,因为如果数据节点宕机会导致管理节点也不可用,整个MySQL群集就都不可用了。所以一个MySQL群集理想情况下至少有三台服务器,将管理节点单独放到一台服务器上。鸡啄米暂以两台举例,只是为了说明三种节点的配置启动方法。

1.将上面下载的安装包解压,并改文件夹名为mysql,因为需要多次在命令行中操作,所以名字改短后更容易输入。

2.配置管理节点

       在IP为192.168.10.1的主机的C盘中新建文件夹mysql,然后在此文件夹下新建子目录bin和mysql-cluster,再将安装包解压后的mysql\bin中的ndb_mgm.exe和ndb_mgmd.exe拷贝到C:\mysql\bin下。在目录C:\mysql\bin下新建 cluster-logs目录、config.ini文件和my.ini文件。

       config.ini文件的内容如下:

[ndbd default]

# Options affecting ndbd processes on all data nodes:

NoOfReplicas=2                      # Number of replicas

DataDir=C:/mysqlcluster/datanode/mysql/bin/cluster-data   # Directory for each data node's data files

                                    # Forward slashes used in directory path,

                                    # rather than backslashes. This is correct;

                                    # see Important note in text

DataMemory=80M    # Memory allocated to data storage

IndexMemory=18M   # Memory allocated to 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.

[ndb_mgmd]

# Management process options:

HostName=192.168.10.1              # Hostname or IP address of management node

DataDir=C:/mysql/bin/cluster-logs   # Directory for management node log files

NodeId=1
[ndbd]

# Options for data node "A":

                                # (one [ndbd] section per data node)

HostName=192.168.10.1           # Hostname or IP address

NodeId=2

[ndbd]

# Options for data node "B":

HostName=192.168.10.2           # Hostname or IP address

NodeId=3

[mysqld]

# SQL node options:

HostName=192.168.10.1           # Hostname or IP address

NodeId=4
[mysqld]

# SQL node options:

HostName=192.168.10.2           # Hostname or IP address

NodeId=5

3.配置数据节点

       在IP为192.168.10.1的主机中新建文件夹C:\mysqlcluster\datanode\mysql,然后在此文件夹中继续新建子目录bin和cluster-data,bin下再建一个子目录也叫cluster-data。

       将安装包解压文件夹中mysql\bin中的ndbd.exe拷贝到C:\mysqlcluster\datanode\mysql\bin下,并在C: \mysqlcluster\datanode\mysql\bin中新建my.ini文件,文件内容为:

       [mysql_cluster]
       # Options for data node process:
       ndb-connectstring=192.168.10.1      # location of management server

       因为两台主机的数据节点的配置是一样的,所以我们可以直接将192.168.10.1主机中的文件夹C:\mysqlcluster拷贝到192.168.10.2主机的C盘下。

4.配置SQL节点

       在192.168.10.1主机的C:\mysqlcluster下新建子目录sqlnode,将安装包解压文件夹mysql整个拷贝到这个子目录下,然后在C:\mysqlcluster\sqlnode\mysql下将my-medinum.ini文件复制修改为my.ini文件,并在最后添加文件内容为(问题1):

       [mysqld]
       # Options for mysqld process:
       ndbcluster                        # run NDB storage engine
       ndb-connectstring=192.168.10.1   # location of management server

       之后也把C:\mysqlcluster\sqlnode文件夹整个拷贝到192.168.10.2主机的相同目录下。

MySQL Cluster的启动

       三种节点服务启动时,一定要按照先启动管理节点,后启动数据节点,再启动SQL节点的顺序进行。

1.启动管理节点

       在192.168.10.1主机中打开命令行窗口,切到C:\mysql\bin目录,输入:

       ndb_mgmd -f config.ini --configdir=C:\mysql\mysql-cluster  --initial

       回车,管理节点服务就启动了,命令行上可能没有任何提示信息,可以打开C:\mysql\bin\cluster-logs\ndb_1_cluster.log日志文件查看启动信息。注意,此命令行窗口不能关闭,除非你想停止服务。

windows2003负载均衡企业级方案(三)_稳定性_02

2.启动数据节点

       在192.168.10.1主机中打开一个新的命令行窗口,切到目录C:\mysqlcluster\datanode\mysql\bin,输入:

       ndbd --initial --ndb-connectstring=192.168.10.1:1186

       回车,数据节点就启动了。

windows2003负载均衡企业级方案(三)_稳定性_03

       以相同的方法在192.168.10.2中启动数据节点服务。

3.启动SQL节点

       在192.168.10.1主机中继续打开一个新的命令行窗口,切到目录C:\mysqlcluster\sqlnode\mysql\bin,输入:

       mysqld --console

       回车,SQL节点启动。

       以相同的方法在192.168.10.2中启动SQL节点。

       想要查看SQL节点的启动情况可以在192.168.10.1主机中同样打开新命令行,输入:

       ndb_mgm

       回车,再输入:

       SHOW

       回车,就可以看到SQL节点的连接情况如下:

windows2003负载均衡企业级方案(三)_稳定性_04

测试MySQL Cluster

正常运行的 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 节点能不能得到完整的数据。

 

出现的问题:

1.其他配置完好,但是sql节点无法连接到管理节点:

[mysqld(API)] 2 node(s)
id=4 (
not connected, accepting connect from any host)

解决办法:

网络上很多文章千篇一律的把mysqld的配置文件放置在bin目录下导致错误,而应该放置bin目录的上一级,将原来的ini修改后添加相应配置,见前文。

六,利用一下bat来测试服务是否异常(脚本在修正中,先写着备用)

windows2003负载均衡企业级方案(三)_稳定性_05servicetest.bat