Mysql cluster介绍:
MySQL Cluster 是一种技术,该技术允许在无共享的系统中部署“内存中”数据库的 Cluster 。通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。
MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括MySQL服务器,NDB Cluster 的数据节点,管理服务器,以及(可能)专门的数据访问程序。关于 Cluster 中这些组件的关系。
“NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。
(来自百度百科)
Mysql cluster特性 :
1、 通过自动分片实现高水平的写入扩展能力
MySQL Cluster 自动将表分片(或分区)到不同节点上,使数据库可以在低成本的商用硬件上横向扩展,同时保持对应用程序完全应用透明。
2、 99.999% 的可用性
凭借其分布式、无共享架构,MySQL Cluster 可提供 99.999% 的可用性,确保了较强的故障恢复能力和在不停机的情况下执行预定维护的能力。
3、 SQL 和NoSQL API
MySQL Cluster 让用户可以在解决方案中整合关系数据库技术和NoSQL技术中的最佳部分,从而降低成本、风险和复杂性。
4、 实时性能
MySQL Cluster 提供实时的响应时间和吞吐量,能满足最苛刻的 Web、电信及企业应用程序的需求。
5、 具有跨地域复制功能的多站点集群
跨地域复制使多个集群可以分布在不同的地点,从而提高了灾难恢复能力和全球 Web 服务的扩展能力。
6、 联机扩展和模式升级
为支持持续运营,MySQL Cluster 允许向正在运行的数据库模式中联机添加节点和更新内容,因而能支持快速变化和高度动态的负载。
Mysql cluster逻辑图:
管理(MGM)节点:这类节点的作用是管理MySQL集群内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。
数据节点:这类节点用于保存集群的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。
SQL节点:这是用来访问集群数据的节点。对于MySQL集群,客户端节点是使用NDB集群存储引擎的传统MySQL服务器。
简单部署Mysql cluster
前期工作:
系统版本:Red Hat Enterprise Linux Server release 6.4 (Santiago) 2.6.32-358.el6.x86_64
主机名 |
IP地址 |
描述 |
ndb-mgm |
10.0.0.50 |
ndb mgm node |
ndb-sql-node-01 |
10.0.0.51 |
sql node 1 |
ndb-sql-node-02 |
10.0.0.52 |
sql node 2 |
ndb-data-node-01 |
10.0.0.53 |
data node 1 |
ndb-data-node-02 |
10.0.0.54 |
data node 2 |
记得将hosts文件修改下例如:
127.0.0.1 ndb-sql-node-01
安装:
现在的mysql提供了一个专门作集群的安装包,这样就不用一个个的下载所需要的工具了。我在网上找到了最新的而且下载比较快的资源,第一步先是下载,有200M左右。
以下操作在所有节点上都要执行。
#下载安装包
cd /tmp
wget http://mirrors.sohu.com/mysql/MySQL-Cluster-7.1/mysql-cluster-gpl-7.1.24-linux-x86_64-glibc23.tar.gz
#添加mysql用户
useradd mysql -s /sbin/nologin -M
#解包,添加软链接
cd /tmp
tar zxf mysql-cluster-gpl-7.1.24-linux-x86_64-glibc23.tar.gz
mv mysql-cluster-gpl-7.1.24-linux-x86_64-glibc23 /usr/local/mysql-cluster-gpl-7.1.24
ln -s /usr/local/mysql-cluster-gpl-7.1.24/ /usr/local/mysql
#授权
cd /usr/local/mysql
chown -R root.root *
chown -R mysql.mysql data/
#拷贝配置文件,启动脚本
/bin/cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
/bin/cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld
#初始化数据库
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data/ --user=mysql
错误1:
Neither host ‘ndb-sql-node-01‘ nor ‘localhost‘ could be looked up with
/usr/local/mysql/bin/resolveip
Please configure the ‘hostname‘ command to return a correct
hostname.
If you want to solve this at a later stage, restart this script
with the --force option
解决方法:
这是host文件解析的问题,添加127.0.0.1 localhost即可,如果还是报错,则加上--force参数
错误2:
/usr/local/mysql/scripts/mysql_install_db: /usr/local/mysql/bin/my_print_defaults: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录
解决方法:
yum install glibc.i686
错误3:
libgcc_s.so.1 must be installed for pthread_cancel to work
解决方法:
yum install libgcc.i686 --setopt=protected_multilib=false
#启动数据库
/etc/init.d/mysqld start
netstat -lnpt |grep mysql
#添加PATH环境变量
echo ‘PATH=/usr/local/mysql/bin:$PATH‘ >>/etc/profile
. /etc/profile
简单配置
SQL节点配置:
cp /etc/my.cnf /etc/my.cnf_$(date +%F)
cat >/etc/my.cnf <<EOF
[client]
port =3306
socket =/tmp/mysql.sock
[mysqld]
basedir =/usr/local/mysql/
datadir =/usr/local/mysql/data
user = mysql
log-error =/usr/local/mysql/mysqld.err
ndbcluster #运行NDB存储引擎
ndb-connectstring=10.0.0.50
#指定管理节点 以上两行声明其为SQL节点
EOF
data节点配置:
cp /etc/my.cnf /etc/my.cnf_$(date +%F)
cat >/etc/my.cnf <<EOF
[client]
port =3306
socket =/tmp/mysql.sock
[mysqld]
basedir =/usr/local/mysql/
datadir =/usr/local/mysql/data
user = mysql
log-error =/usr/local/mysql/mysqld.err
[mysql_cluster]
#指定管理节点 以上两行声明其为数据节点
ndb-connectstring=10.0.0.50
EOF
管理节点mgm配置:
#在管理服务器的/var/lib/mysql-cluster/目录中创建config.ini文件。
mkdir /usr/local/mysql/mysql-cluster -p
#在config.ini配置文件中添加以下内容:
cat > /usr/local/mysql/mysql-cluster/config.ini <<EOF
[NDBD DEFAULT]
NoOfReplicas=1 #每个数据节点的镜像数量
DataMemory=200M #每个数据节点中给数据分配的内存
IndexMemory=100M #每个数据节点中给索引分配的内存
[TCP DEFAULT]
portnumber=2202 #数据节点的默认连接端口
[NDB_MGMD] #配置管理节点
id=1
hostname=10.0.0.50
datadir=/var/lib/mysql-cluster/ #管理节点数据(日志)目录
[NDBD] #数据节点配置
id=2
hostname=10.0.0.53
datadir=/usr/local/mysql/data/ #数据节点目录
[NDBD]
id=3
hostname=10.0.0.54
datadir=/usr/local/mysql/data/
[MYSQLD] #SQL节点目录
id=4
hostname=10.0.0.51
[MYSQLD]
id=5
hostname=10.0.0.52
EOF
注解:
[NDBD DEFAULT]:表示每个数据节点的默认配置在每个节点的[NDBD]中不用再写这些选项,只能有一个。
[NDB_MGMD]:表示管理节点的配置,只有一个。
[NDBD]:表示每个数据节点的配置,可以有多个。
[MYSQLD]:表示SQL节点的配置,可以有多个,分别写上不同SQL节点的IP地址,也可以什么都不写,只保留一个空节点,表示任意一个IP地址都可以进行访问,此节点的个数表明了可以用来连接数据节点的SQL节点总数。
启动
mysql cluster 需要各个节点都 进行启动后才可以工作,节点的启动顺序为管理节点->数据节点->SQL节点。
启动管理节点:
ndb_mgmd -f /usr/local/mysql/mysql-cluster/config.ini
命令行中的ndb_mgmd是mysql cluster的管理服务器,后面的-f表示后面的参数是启动的参数配置文件。如果在启动后过了几天又添加了一个数据节点,这时修改了配置文件启动时就必须加上--initial参数,不然添加的节点不会作用在mysql cluster中。
./ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
启动时可能会报个WARNING,如WARNING -- at line 7: [TCP] portnumber is deprecated,这个不用管。可以正常工作的。
启动数据节点:
安装后第一次启动数据节点时要加上--initial参数,其它时候不要加,除非是在备份、恢复或配置变化后重启时。
ndbd --initial
如果显示以下信息说明启动完成:
2014-07-28 13:17:03 [ndbd] INFO -- Angel connected to ‘10.0.0.50:1186‘
2014-07-28 13:17:03 [ndbd] INFO -- Angel allocated nodeid: 3
启动SQL节点:
/etc/init.d/mysqld start
管理
[[email protected] mysql-cluster]# 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 @10.0.0.53 (mysql-5.1.63 ndb-7.1.24, Nodegroup: 0, Master)
id=3 @10.0.0.54 (mysql-5.1.63 ndb-7.1.24, Nodegroup: 1)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.0.0.50 (mysql-5.1.63 ndb-7.1.24)
[mysqld(API)] 2 node(s)
id=4 @10.0.0.51 (mysql-5.1.63 ndb-7.1.24)
id=5 @10.0.0.52 (mysql-5.1.63 ndb-7.1.24)
可以看到各个节点已经连接上了,至此,mysql cluster配置完成。
关闭
mysql cluster的关闭也很简单,只需在ndb_mgm> 提示符下输入 shutdown即可,这时会显示各节点的关闭信息,再输入exit即可退出ndb_mgm管理,回到shell中。虽然mysql cluster 关闭了,但是SQL节点的mysql服务并不会停止的。接下来就可以做各种试验了。
测试:
登录SQL-node1,创建数据库liyiliang
[[email protected] ~]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| ndbinfo |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> create database liyiliang;
Query OK, 1 row affected (0.17 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liyiliang |
| mysql |
| ndbinfo |
| test |
+--------------------+
5 rows in set (0.00 sec)
登录SQL-node2,检查:
[[email protected] mysql]# mysql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| liyiliang |
| mysql |
| ndbinfo |
| test |
+--------------------+
5 rows in set (0.00 sec)
mysql>