MySQL Cluster是一个高性能、可扩展、集群化数据库产品。MySQL Cluster是一个基于NDB Cluster存储引擎的完整分布式数据库系统,采用无共享的数据存储技术,实时同步且支持快速故障切换、事务。NDB是一种in-memory的存储引擎,它具备可用性高和数据一致性好的特色。html
MySQL Cluster可由多台服务器组成的、同时对外提供数据管理服务的分布式集群系统。经过合理的配置,能够将服务请求在多台物理机上分发实现负载均衡 ;同时内部实现了冗余机制,在部分服务器宕机的状况下,整个集群对外提供的服务不受影响,从而能达到99.999%以上的高可用性。node
MySQL Cluster分为三类节点:mysql
数据节点(Data Nodes):用于存储集群的数据。实现底层数据存储的功能,保存Cluster 的数据。每个NDB 节点保存完整数据的一部分(或者一份完整的数据,视节点数目和配置而定),在MySQL Cluster 里面叫作一个fragment。而每个fragment,正常状况来说都会在其余的主机上面有一份(或者多分)彻底相同的镜像存在。这些都是经过配置来完成的,因此只要配置得当,MySQL Cluster 在存储层不会出现单点的问题。数据节点是用命令ndbd
启动的。linux
SQL节点(SQL Nodes):向外提供一个标准的SQL语言编程接口。SQL节点负责向数据节点传送访问请求,具体集群过程以及数据库底层均对外透明。
SQL节点提供用户SQL指令请求,解析、链接管理,query优化和响、cache管理等、数据merge、sort,裁剪等功能,当SQL节点启动时,将向管理节点同步架构信息,用以数据查询路由。SQL节点做为查询入口,须要消耗大量cpu及内存资源,可以使用分布式管理节点,并在SQL节点外封装一层请求分发及HA控制机制可解决单点及性能问题,其提供了线性扩展功能。SQL节点是使用命令mysqld -ndbcluster
启动的,或将ndbcluster
添加到“my.cnf”后使用“mysqld”启动。sql
管理节点(NDB Management Server):负责整个Cluster 集群中各个节点的管理工做,包括集群的配置,启动关闭各节点,以及实施数据的备份恢复等。管理节点会获取整个Cluster 环境中各节点的状态和错误信息,而且将各Cluster 集群中各个节点的信息反馈给整个集群中其余的全部节点。一般只需配置一个管理节点;然而为了排除单点故障须要,有可能的话,尽可能增长管理节点的数量。MGM节点是用命令ndb_mgm
启动的。数据库
环境准备编程
数据节点:192.168.1.5 192.168.1.6
SQL节点:192.168.1.2 192.168.1.11
管理节点:192.168.1.10vim
Mysql集群软件:mysql-cluster-gpl-7.2.8-linux2.6-x86_64.tar.gz 下载地址服务器
管理节点配置架构
将MySQL集群软件拷贝到管理节点的/usr/local目录下并解压为mysql,MySQLCluster管理节点默认是要安装在/usr/local下的,不然启动会报错
添加用户及用户组
# groupadd mysql # useradd -g mysql mysql
更改所属用户和组
# chown -R mysql:mysql mysql
拷贝配置文件
# cp mysql-cluster/support-files/ndb-config-2-node.ini /etc/ndb-config.ini
修改配置文件,管理节点的配置文件很是重要,会影响整个集群
# vim /etc/ndb-config.ini [ndbd default] NoOfReplicas= 2 #定义在Cluster环境中复制份数 DataMemory= 80M #分配的数据内存大小,根据本机服务器内存适量来分配,实际运用中须要分配很大 IndexMemory= 24M #设定用于存放索引(非主键)数据的内存段大小 #一个NDB节点能存放的数据量是会受到DataMemory和IndexMemory两个参数设置的约束,二者任何一个达到限制数量后,都没法再增长能存储的数据量。若是继续存入数据系统会报错“table is full”。 DataDir= /var/lib/mysql-cluster #用于存放集群日志信息 DataMeomory=1400M IndexMemory=600M LockPagesInMainMemory=1 # 会有问题 MaxNoOfConcurrentOperations=500000 TimeBetweenLocalCheckpoints=20 TimeBetweenGlobalCheckpoints=1000 TimeBetweenEpochs=100 TimeBetweenWatchdogCheckInitial=60000 TransactionInactiveTimeout =50000 MaxNoOfExecutionThreads=8 BatchSizePerLocalScan=512 MaxNoOfOrderedIndexes=512 MaxNoOfConcurrentOperations= 10000 [ndb_mgmd] Id=1 Hostname=192.168.1.10 # Hostname or IP address #肯定该目录存在,并修改所属用户为mysql DataDir= /var/lib/mysql-cluster # Directory for MGM node logfiles [ndbd] Id= 2 HostName= 192.168.1.5 # Hostname or IP address datadir=/usr/local/mysql/data # Directory for this data node's datafiles,数据节点存放数据的目录 [ndbd] Id= 3 HostName= 192.168.1.6 datadir=/usr/local/mysql/data [mysqld] Id= 4 HostName= 192.168.1.2 #能够预留一些节点 # choose an unused port number # in this configuration 63132, 63133, and 63134 # will be used [tcp default] PortNumber= 63132
配置完后启动管理节点
# ./ndb_mgmd --initial -f /etc/ndb-config.ini MySQL Cluster Management Server mysql-5.5.27 ndb-7.2.8 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 31: [MGM] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 35: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 39: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 43: [API] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 50: [tcp] PortNumber is deprecated 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 31: [MGM] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 35: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 39: [DB] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 43: [API] Id is deprecated, use NodeId instead 2014-08-29 11:22:04 [MgmtSrvr] WARNING -- at line 50: [tcp] PortNumber is deprecated
其中--initial指定初始化加载,每次修改管理节点的配置重启都须要加上,不然不会生效;-f指定管理节点的参数文件
肯定ndb_mgm进程及端口号
# netstat -langput | grep mgm tcp 0 0 0.0.0.0:1186 0.0.0.0:* LISTEN 3427/ndb_mgmd tcp 0 0 127.0.0.1:45251 127.0.0.1:1186 ESTABLISHED 3427/ndb_mgmd tcp 0 0 127.0.0.1:1186 127.0.0.1:45251 ESTABLISHED 3427/ndb_mgmd
其中1186是管理节点的服务端口
查看集群信息
# ./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.1.5) id=3 (not connected, accepting connect from 192.168.1.6) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.10 (mysql-5.5.27 ndb-7.2.8) [mysqld(API)] 1 node(s) id=4 (not connected, accepting connect from 192.168.1.2)
能够看到当前只有管理节点,其余节点还未启动。
数据节点和SQL节点配置
解压MySQLCluster软件到指定目录/usr/local,数据节点能够不用放在/usr/local目录下
添加用户及用户组
# groupadd mysql # useradd -g mysql mysql
更改所属用户和组
# chown -R mysql:mysql mysql
安装数据库
# /usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
拷贝配置文件
# cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf
修改配置文件
vim /etc/my.cnf # Options for mysqld process: [MYSQLD] ndbcluster # run NDB engine character_set_server=utf8 ndb-connectstring=198.168.1.10 # location of MGM node # Options for ndbd process: [MYSQL_CLUSTER] ndb-connectstring=198.168.1.10 # location of MGM node
启动数据节点
# ./ndbd --initial 2014-08-29 14:04:54 [ndbd] INFO -- Angel connected to '192.168.1.10:1186' 2014-08-29 14:04:54 [ndbd] INFO -- Angel allocated nodeid: 2
启动SQL节点
# ./mysqld_safe --user=mysql &
SQL节点启动能够添加到系统服务
拷贝运行脚本,添加可执行权限
# cp support-files/mysql.server /etc/init.d/mysqld # chmod +x /etc/init.d/mysqld
启动数据库
# service mysqld start Starting MySQL.... [ OK ]
查看集群信息
# ndb_mgm -e show Cluster Configuration --------------------- [ndbd(NDB)] 2 node(s) id=2 @192.168.1.5 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0, Master) id=3 @192.168.1.6 (mysql-5.5.27 ndb-7.2.8, Nodegroup: 0) [ndb_mgmd(MGM)] 1 node(s) id=1 @192.168.1.10 (mysql-5.5.27 ndb-7.2.8) [mysqld(API)] 2 node(s) id=4 @192.168.1.2 (mysql-5.5.27 ndb-7.2.8) id=5 @192.168.1.11 (mysql-5.5.27 ndb-7.2.8)
能够看到当前全部节点均已启动
集群管理
查看集群内存使用状况
ndb_mgm> all report memoryusage;
关闭集群顺序:SQL节点->数据节点->管理节点 或者使用# ./ndb_mgm -e shutdown
命令关闭集群
启动集群顺序: 管理节点->数据节点->SQL节点
验证测试
经过SQL节点(192.168.1.2记为SQL1/192.168.1.11记为SQL2)连入MySQL数据库
# ./mysql mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | ndbinfo | | performance_schema | | test | +--------------------+ 5 rows in set (0.04 sec)
修改密码
mysql> set password=password('root');
数据同步测试
链接SQL1,建立数据库dufu,建立成功
链接SQL2,查看到建立成功的数据库dufu
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | dufu | | mysql | | ndbinfo | | performance_schema | | test | +--------------------+ 6 rows in set (0.00 sec)
SQL1建立表,插入数据
mysql> use dufu; Database changed mysql> create table t(i int,name varchar(10)) engine=ndbcluster; Query OK, 0 rows affected (0.22 sec) mysql> insert into t values(1,'this_sql1'); Query OK, 1 row affected (0.01 sec)
SQL2查询
mysql> select * from t; +------+-----------+ | i | name | +------+-----------+ | 1 | this_sql1 | +------+-----------+ 1 row in set (0.01 sec)
经过以上测试,SQL集群数据是同步的。
可用性测试
关掉数据节点1或SQL节点1,看集群是否可以正常工做
通过测试,关闭冗余节点不会对MySQL集群形成影响,失败节点从新启动后会再次加入加群。能够经过管理节点查看到各个节点的状态
遇到的问题
以上测试只是针对MySQLCluster简单的验证测试,后面咱们组织了一次更大压力的测试,400~1000并发,每一个链接执行100次循环,每一个查询约有5000条数据,同时执行进行的读操做在40000~100000之间,出现了不少问题。
首先是数据节点启动问题:
Ndb kernel thread 4 is stuck in: Job Handling elapsed=100 Watchdog: User time: 82 System time: 667 Ndb kernel thread 4 is stuck in: Job Handling elapsed=200 Watchdog: User time: 82 System time: 668 Ndb kernel thread 4 is stuck in: Job Handling elapsed=300 Watchdog: User time: 82 System time: 669 Ndb kernel thread 4 is stuck in: Job Handling elapsed=400 Watchdog: User time: 82 System time: 670
内存不够或者datamemory、indexmemory设置过大、maxnooflocalscans设置过大致使,经过增大服务器硬件资源以及调大内存设置大小解决。
并发加大后出现:
too many connections
SQL节点的max_connections默认参数为150,调整该参数大小为1000解决。
并发加大后出现:
ERROR 1205 (HY000) at line 10208: Lock wait timeout exceeded; try restarting transaction
TransactionDeadlockDetectionTimeout默认只有1200,调整该参数为10000后解决。调整完后须要重启集群
并发加到1000后,错误率急剧上升,出现:
got temporary error 245 'too many active scans' from ndbcluster
NaxNoOfConcurrentScans参数过小,默认最大为500.调整为500后,仍是继续报错-_-!,可能与MaxNoOfLocalScans参数有关。
更新操做,并发加到1000后,出现:
ERROR 1297 (HY000): Got temporary error 410 'REDO log files overloaded (decrease TimeBetweenLocalCheckpoints or increase NoOfFragmentLogFiles)' from NDBCLUSTER
改错表示redo日志可能过小,须要调整redo日志大小,设置TimeBetweenLocalCheckpoints=30NoOfFragmentLogFiles=128(还未试验)