原理:
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 Server 版本的区别。
下载mysql cluster 集群版本,这里采用mysql官网编译好的二进制版本,免去编译麻烦:
目前最新版:https://cdn.mysql.com/archives/mysql-cluster-gpl-7.3/mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz
系统环境:
ndb_mgm centos6.5_x64 ip:192.168.0.89
ndbd_1 centos6.5_x64 ip:192.168.0.87
ndbd_2 centos6.5_x64 ip:192.168.0.88
sql_1 centos6.5_x64 ip:192.168.0.85
sql_2 centos6.5_x64 ip:192.168.0.86
配置ndb_mgm管理节点:
[root@localhost ~]# wget -c https://cdn.mysql.com/archives/mysql-cluster-gpl-7.3/mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# tar zxvf mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# mv mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64 /usr/local/mysql [root@localhost ~]# useradd -s /sbin/nologin mysql [root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql [root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/
编辑管理节点配置文件:
[root@localhost ~]# vi /usr/local/mysql/config.ini
添加:
[NDBD DEFAULT] NoOfReplicas=2 DataDir=/usr/local/mysql/data DataMemory=50M IndexMemory=4M Diskless=0 ODirect=0 RedoBuffer=32M [MGM DEFAULT] PortNumber=1186 DataDir=/usr/local/mysql/data [TCP DEFAULT] SendBufferMemory=32M ReceiveBufferMemory=32M [NDB_MGMD] NodeId=1 HostName=192.168.0.89 ArbitrationRank=1 [NDBD] NodeId=2 HostName=192.168.0.87 [NDBD] NodeId=3 HostName=192.168.0.88 [API] NodeId=4 HostName=192.168.0.85 [API] NodeId=5 HostName=192.168.0.86
[root@localhost ~]# /usr/local/mysql/bin/ndb_mgmd -f /usr/local/mysql/config.ini #启动管理节点
会看到如下信息:
MySQL Cluster Management Server mysql-5.6.17 ndb-7.3.5
2014-04-17 23:07:01 [MgmtSrvr] INFO — The default config directory ‘/usr/local/mysql/mysql-cluster’ does not exist. Trying to create it…
2014-04-17 23:07:01 [MgmtSrvr] INFO — Sucessfully created config directory
[root@localhost ~]# lsof -i:1186
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ndb_mgmd 2269 root 8u IPv4 46678 0t0 TCP *:mysql-cluster (LISTEN)
ndb_mgmd 2269 root 9u IPv4 46679 0t0 TCP localhost:50117->localhost:mysql-cluster (ESTABLISHED)
ndb_mgmd 2269 root 10u IPv4 46684 0t0 TCP localhost:mysql-cluster->localhost:50117 (ESTABLISHED)
占用1186端口。
[root@localhost ~]# /usr/local/mysql/bin/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 (not connected, accepting connect from 192.168.0.87)
id=3 (not connected, accepting connect from 192.168.0.88)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.89 (mysql-5.6.17 ndb-7.3.5)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from 192.168.0.85)
id=5 (not connected, accepting connect from 192.168.0.86)
ndb_mgm>
管理节点配置完成。
配置ndbd存储节点:
在ndbd_1和ndbd_2都执行下面配置,配置完全一样:
[root@localhost ~]# wget -c https://cdn.mysql.com/archives/mysql-cluster-gpl-7.3/mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# tar zxvf mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# mv mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64 /usr/local/mysql [root@localhost ~]# useradd -s /sbin/nologin mysql [root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql [root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/
编辑ndbd节点配置文件:
[root@localhost ~]# vi /usr/local/mysql/my.cnf
在最后一行添加两行:
[mysql_cluster]
ndb_connectstring=192.168.0.89
启动ndbd节点:
[root@localhost ~]#/usr/local/mysql/bin/ndbd --initial -c 192.168.0.89 2014-04-17 23:19:15 [ndbd] INFO -- Angel connected to '192.168.0.89:1186' 2014-04-17 23:19:15 [ndbd] INFO -- Angel allocated nodeid: 3 关于--initial参数只是在第一次启动或在备份/恢复或配置变化后重启ndbd时,才加–-initial参数!
配置SQL节点:
在sql_1和sql_2都执行下面配置,配置完全一样:
[root@localhost ~]# wget -c https://cdn.mysql.com/archives/mysql-cluster-gpl-7.3/mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# tar zxvf mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64.tar.gz [root@localhost ~]# mv mysql-cluster-gpl-7.3.5-linux-glibc2.5-x86_64 /usr/local/mysql [root@localhost ~]# useradd -s /sbin/nologin mysql [root@localhost ~]# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql [root@localhost ~]# chown -R mysql:mysql /usr/local/mysql/
编辑sql节点配置文件:
[root@localhost ~]# vi /usr/local/mysql/my.cnf
添加红色部分:
[mysqld]
ndbcluster
ndb-connectstring=192.168.0.89
[mysql_cluster]
ndb-connectstring=192.168.0.89
启动mysql:
[root@localhost ~]# /usr/local/mysql/bin/mysqld_safe --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --user=mysql &
回到ndb管理节点查看状态:
ndb_mgm> show
Cluster Configuration
———————
[ndbd(NDB)] 2 node(s)
id=2 @192.168.0.87 (mysql-5.6.17 ndb-7.3.5, Nodegroup: 0, *)
id=3 @192.168.0.88 (mysql-5.6.17 ndb-7.3.5, Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @192.168.0.89 (mysql-5.6.17 ndb-7.3.5)
[mysqld(API)] 2 node(s)
id=4 @192.168.0.85 (mysql-5.6.17 ndb-7.3.5)
id=5 @192.168.0.86 (mysql-5.6.17 ndb-7.3.5)
ndbd数据节点和sql节点已经连接。
测试:
在sql_1节点登陆数据库,在test库中创建表,去sql_2节点查看是否有数据。
sql_1:
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p Enter password: mysql> use test; Database changed mysql> show tables; Empty set (0.01 sec) mysql> create table person(id int,name varchar(40),birthday date)ENGINE=ndb; Query OK, 0 rows affected (0.33 sec) mysql> Insert into person values(1,'test',20101212); Query OK, 1 row affected (0.11 sec) mysql> Select * from test.person; +------+------+------------+ | id | name | birthday | +------+------+------------+ | 1 | test | 2010-12-12 | +------+------+------------+ 1 row in set (0.01 sec) mysql>
sql_2节点:
[root@localhost ~]# /usr/local/mysql/bin/mysql -uroot -p Enter password: mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> Select * from test.person; +------+------+------------+ | id | name | birthday | +------+------+------------+ | 1 | test | 2010-12-12 | +------+------+------------+ 1 row in set (0.03 sec) mysql>
发现数据。完成。
同样也可在sql_2节点上执行Insert/Update/Delete等操作,然后在sql_1上验证数据是否同步。
注意启动顺序: 管理节点-ndbd数据节点-sql节点 表在ndbd节点之间复制时,表必须用ndbcluster引擎
PS:
启动ndb节点时遇到的一个错误,加-c参数解决
[root@localhost bin]# ./ndbd –initial
Unable to connect with connect string: nodeid=0,localhost:1186
Retrying every 5 seconds. Attempts left: 12^C
[root@localhost bin]# ./ndbd –initial -c 192.168.0.89
2014-04-17 19:11:35 [ndbd] INFO — Angel connected to ‘192.168.0.89:1186’
2014-04-17 19:11:35 [ndbd] INFO — Angel allocated nodeid: 10
管理节点配置文件:
#此值按数据库大小设置,官方给出了公式 #(内存) 数据大小 *副本 * 1.25 = 数据库内存总需求 #实例:50 GB * 2 * 1.25 = 125 GB #(数据大小 *副本 * 1.25)/节点数 = 每个节点的内存大小 #实例:(2 GB * 2 * 1.25)/4 = 1.25 GB DataMemory=5120M IndexMemory=400M #此值设置为1的时候,ndb将不会把数据写入磁盘(意思就是shutdown后数据就没了) Diskless=0 #速度快,可以改为1试试,具体含义参考mysql官方文档 ODirect=0
mysql cluster 所有的这些节点构成一个完成的MySQL集群体系。数据保存在ndb数据服务器的存储引擎中,表(结构)则保存在sql节点中。
应用程序通过sql节点访问这些数据表,集群管理服务器通过管理工具(ndb_mgmd)来管理ndb数据服务器。
至于数据存放是在ndb数据服务器中mysql的data目录下ndb_<node_id>_fs目录。
这个data目录是由config.ini配置文件定义的。
一般在一个mysql cluster体系中只需要一个管理节点.它仅用于cluster的启动及cluster的系统参数配置。
sql节点和存储节点在启动的时候需要连接到管理节点读取cluster的配置信息,在sql节点和存储节点启动完成后,管理节点可以停止。
不过最好不好这样做。
mysql cluster通过两种方式来检测故障:
一是通讯丢失,可以通过tcp,共享内存等方式在各存储节点之间通讯来侦测节点是否正常这种方式是最快的故障检测方式,
二是心跳失败,通讯丢失的检测方法在某些特殊情况下无效,例如磁盘故障等问题.所有的存储节点通过组成一个环路,每个
节点向下一个节点发送心跳信号,如果下一个节点没有收到心跳信号,则认为上一个存储节点故障,并依次向下下个节点广播此故障信息。
原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/2403.html