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

纯软件方式搭建mysql集群_第1张图片

所有的这些节点构成一个完成的MySQL集群体系。数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。应用程序通过“MySQL服务器”访问这些数据表,集群管理服务器通过管理工具(ndb_mgmd)来管理“NDB存储服务器”。
三、       MySQL Cluster 基本概念
        “NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。
         MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上做这个最简单。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于 Cluster本身内的其他数据。
        目前,MySQL Cluster的 Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中, Cluster的每个部分被视为1个节点。
·         管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。管理节点节点是用命令“ndb_mgmd”启动的。
·         数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。NDBD是用命令“ndbd”启动的。
·         SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。
        管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输 到管理服务器,然后,将这类信息写入 Cluster日志。
四、       开始准备mysql-cluster:
1.准备服务器:
现在,我计划建立有5个节点的MySQL CLuster体系,因此需要用到5台机器,分别做如下用途:

节点(用途)
Ip地址(主机名)
管理节点(MGM)
192.168.169.66(mgm)
数据节点1(NDBD1)
192.168.80.111(ndb1)
数据节点2(NDBD2)
192.168.80.112(ndb2)
SQL节点1(SQL1)
192.168.80.113(sql1)
SQL节点2(SQL2)
192.168.80.114(sql2)

2.注意事项:
       每个节点的操作系统都是CentOS5.5,下面的描述中将使用主机名表示。由于MySQL Cluster采用TCP/IP方式连接,并且节点之间的数据传输没有加密,因此这个体系用于公网的时候需要考虑数据的加密这一块,以及传输速率这一块。
3.使用mysql数据包:
   mysql-cluster-gpl-7.1.15a-linux-i686-glibc23.tar
五、       Mysql-cluster的安装:
1、把软件mysql-cluster-gpl-7.1.15a-linux-i686-glibc23.tar分别上传到以上5个服务器的上,我是上传到mnt目录;
2、在服务上都创建mysql组与用户:
groupadd mysql;
Useradd mysql -g mysq;
3、分别在以上5台机器解压软件(软件都统一放到/usr/local下):
这里有两种:NDBD与SQL、MGM
NDBD与SQL:
cd /mnt;
tar xzvf mysql-cluster-gpl-7.1.15a-linux-i686-glibc23.tar;
mv -f mysql-cluster-gpl-7.1.15a-linux-i686-glibc23 /usr/local/
cd /usr/local
ln -s mysql-cluster-gpl-7.1.15a-linux-i686-glibc23  mysql
MGM(只需要把ndb*相关的命令放到/usr/local/bin下即可):
cd /mnt;
tar xzvf mysql-cluster-gpl-7.1.15a-linux-i686-glibc23.tar.gz;
cd mysql-cluster-gpl-7.1.15a-linux-i686-glibc23/bin
cp -rf ./ndb* /usr/local/bin
4、创建数据,日志存放目录:
这里分三种:在MGM、NDBD、SQL上;
MGM:
mkdir /var/lib/mysql/logs #日志目录
mkdir /var/lib/mysql/cluster #集群管理配置文件目录
NDBD:
mkdir -p /var/lib/mysql
mkdir -p /var/lib/mysql/data #存放数据
mkdir -p /var/lib/mysql/ndbdata #集群数据目录
mkdir -p /var/lib/mysql/logs #日志目录
chown -R mysql.mysql /var/lib/mysq #转换为mysql用户与组
MGM:与NDBD相同
1)、MGM:(192.168.169.66)
1.1)、在/var/lib/mysql/cluster创建config.ini集群管理文件:
在文件中添加内容如下:
# Options affecting ndbd processes on all data nodes:
[ndbd default]
NoOfReplicas=2     #每份数据存放2份
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.
# Management process options:
[NDB_MGMD DEFAULT]
PortNumber=1186
Datadir=/var/lib/mysql/ndbdata
ArbitrationRank=1
[TCP DEFAULT]     
portnumber=2202 
#MGM
[ndb_mgmd]
id=1
Hostname=192.168.169.66           # Hostname or IP address of management node
Datadir=/var/lib/mysql/logs #Directory for management node log files
# NDBD1,这里的Datadir必须在IP111中存在
[ndbd]
id=2
Hostname=192.168.80.111            # Hostname or IP address
Datadir=/var/lib/mysql/ndbdata # Directory for this data node's data files
# NDBD2,这里的Datadir必须在IP112中存在
[ndbd]
id=3
Hostname=192.168.80.112
Datadir=/var/lib/mysql/ndbdata
# sql1服务接点
[mysqld]
id=4
Hostname=192.168.80.113         # Hostname or IP address
# sql2服务接点
[mysqld]
id=5
Hostname=192.168.80.114
1.2)、在etc/下创建mysql配置文件my.cnf
添加内容如下:
[mysqld]
ndbcluster
ndb-connectstring=192.168.169.66
[mysql_cluster]
ndb-connectstring=nodeid=1,192.168.169.66
注:这里的nodeid=1是在config.ini中管理端的id
2)、NDBD:(192.168.80.111-112)
以下是在111上安装,112基本一样,只是在my.cnf中nodeid应改3
2.1)、在/etc/下添加my.cnf配置文件,内容如下:
[client]
#password       = your_password
port            = 3306
socket          = /var/lib/mysql/mysql.sock
[mysqld]
port            = 3306
pid-file        = /var/lib/mysql/mysqld.pid
socket          = /var/lib/mysql/mysql.sock
log             = /var/lib/mysql/log/query.log
log_slow_queries= /var/lib/mysql/log/slow_query.log
datadir         = /var/lib/mysql/data
max_connections = 2000
skip-locking
key_buffer = 256M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
#这个记服务启动时,直接把cluster启动
ndbcluster
ndb-connectstring=192.168.169.66
#支持ndb
[mysql_cluster]
ndb-connectstring=nodeid=2,192.168.169.66
注:上面的nodeid=2是在config.ini中定义,每个节点不一样,my.cnf内容可以根据需要修改与添加其它项;
2.2)、安装SQL文件
             cd /usr/local/mysql
 scripts/mysql_install_db --user=mysql #安装
2.3)、设置自动启动和环境变量
#加到系统服务里
cp support-files/mysql.server /etc/rc.d/init.d/
chkconfig --add mysql.server
cd
vi .bash_profile
修改PATH为如下
PATH=$PATH:$HOME/bin:/usr/local/mysql/bin
3)、SQL管理节点(192.168.80.113-114)
以下是在113上安装,114基本一样,只是在my.cnf中nodeid应改5
3.1)、在/etc/下添加my.cnf配置文件
内容与数据节点的my.cnf一样的,只是nodeid改为4即可
3.2)、安装SQL文件
步骤与数据节点的一样
3.3)、设置自动启动和环境变量
步骤与数据节点的一样
六、          启动Mysql-cluster
        较为合理的启动顺序是,首先启动管理节点服务器,然后启动存储节点服务器,最后才启动SQL节点服务器:
1.在管理节点服务器上,执行以下命令启动MGM节点进程:
# /usr/local/mysql/ndb_mgmd -f /var/lib/mysql/config.ini
必须用参数“-f”或“--config-file”告诉 ndb_mgm 配置文件所在位置,默认是在ndb_mgmd相同目录下。
2.在每台存储节点服务器上,如果是第一次启动ndbd进程的话,必须先执行以下命令:
# /usr/local/mysql/bin/ndbd --initial
注意,仅应在首次启动ndbd时,或在备份/恢复数据或配置文件发生变化后重启ndbd时使用“--initial”参数。因为该参数会使节点删除由早期ndbd实例创建的、用于恢复的任何文件,包括用于恢复的日志文件。
    如果不是第一次启动,直接运行如下命令即可:
# /usr/local/mysql/bin/ndbd
3.最后,运行以下命令启动SQL节点服务器:
# /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/my.cnf &
          注:这里如果启动不了mysql可以查看/var/lib/mysql是否有mysql用户的执行权限。
        如果一切顺利,也就是启动过程中没有任何错误信息出现,那么就在管理节点服务器上运行如下命令:
         [root@mgm ~]# ndb_mgm
-- NDB Cluster -- Management Client --
ndb_mgm> show
Connected to Management Server at: 192.168.169.66:1186
Cluster Configuration
---------------------
[ndbd(NDB)]      2 node(s)
id=2     @192.168.80.111 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0, Master)
id=3     @192.168.80.112 (mysql-5.1.56 ndb-7.1.15, Nodegroup: 0)
 
[ndb_mgmd(MGM)] 1 node(s)
id=1     @192.168.169.66 (mysql-5.1.56 ndb-7.1.15)
 
[mysqld(API)]    2 node(s)
id=4     @192.168.80.113 (mysql-5.1.56 ndb-7.1.15)
id=5     @192.168.80.114 (mysql-5.1.56 ndb-7.1.15)
 
ndb_mgm>
具体的输出内容可能会略有不同,这取决于你所使用的MySQL版本。现在应能在MySQL Cluster中处理数据库,表和数据。
七、       创建数据库表
        与没有使用 Cluster的MySQL相比,在MySQL Cluster内操作数据的方式没有太大的区别。执行这类操作时应记住两点:
·         表必须用ENGINE=NDB或ENGINE=NDBCLUSTER选项创建,或用ALTER TABLE选项更改,以使用NDB Cluster存储引擎在 Cluster内复制它们。如果使用mysqldump的输出从已有数据库导入表,可在文本编辑器中打开SQL脚本,并将该选项添加到任何表创建语句,或 用这类选项之一替换任何已有的ENGINE(或TYPE)选项。
·         另外还请记住,每个NDB表必须有一个主键。如果在创建表时用户未定义主键,NDB Cluster存储引擎将自动生成隐含的主键。(注释:该隐含 键也将占用空间,就像任何其他的表索引一样。由于没有足够的内存来容纳这些自动创建的键,出现问题并不罕见)。
下面是一个例子:
在sql1上创建数据表,插入数据:
[root@sql1 mnt]# mysql -u root hao
mysql> create table city(
    -> id mediumint unsigned not null auto_increment primary key,
    -> name varchar(20) not null default ''
    -> ) engine = ndbcluster default charset utf8;
Query OK, 0 rows affected (0.68 sec)
 
mysql> insert into city values(1,'chao1');
Query OK, 1 row affected (0.01 sec)
 
mysql> insert into city values(2,'chao2');
Query OK, 1 row affected (0.00 sec)
 
mysql>
         在sql2上查询数据:
             [root@sql2 ~]# mysql -u root
mysql> use hao;
Database changed
mysql> select * from city;
+----+-------+
| id | name |
+----+-------+
| 1 | chao1 |
| 2 | chao2 |
+----+-------+
2 rows in set (0.00 sec)
 
mysql>
八、       安全关闭
    要想关闭 Cluster,可在MGM节点所在的机器上,在Shell中简单地输入下述命令:
[root@mgm ~]# ndb_mgm -e shutdown
运行以下命令关闭SQL节点的mysqld服务:
[root@sql1 ~]# mysqladmin –u root shutdown