1. MySQL集群简介
1.1. 什么是MySQL集群
MySQL集群是一个无共享的(shared-nothing)、分布式节点架构的存储方案,其目的是提供容错性和高性能。
数据更新使用读已提交隔离级别(read-committedisolation)来保证所有节点数据的一致性,使用两阶段提交机制(two-phasedcommit)保证所有节点都有相同的数据(如果任何一个写操作失败,则更新失败)。
无共享的对等节点使得某台服务器上的更新操作在其他服务器上立即可见。传播更新使用一种复杂的通信机制,这一机制专用来提供跨网络的高吞吐量。
通过多个MySQL服务器分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。
1.2. 集群 MySQL中名称概念
1) Sql 结点(SQL node—下图对应为 mysqld):分布式数据库。包括自身数据和查询中心结点数据
2) 数据结点(Data node – ndbd):集群共享数据(内存中) 3) 管理服务器(Management Server – ndb_mgmd):集群管理 SQL node,Data node
详情见下图:
2. 环境配置
hosts:
192.168.56.201 manager 192.168.56.202 sql-datanode1 192.168.56.203 sql-datanode2 |
3. 安装前要
不管是Management Server,还是Data node、SQL node,都需要先安装MySQL集群版本,然后根据不用的配置来决定当前服务器有哪几个角色。
4. 创建musql用户和组(n台)
安装之前准备好mysql用户和mysql用户组,相关命令:
groupadd mysql
useradd mysql -g mysql
5. 关闭防火墙(n台)
chkconfig iptables off
service iptables stop
setenforce 0
6. 安装MySQL集群版本
6.1. 主节点
6.1.1. 上传
su - root
cd /usr/local
rz –y
上传安装包
mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz
6.1.2. 解压
tar –zxvf mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64.tar.gz
6.1.3. 重命名
mv mysql-cluster-gpl-7.4.6-linux-glibc2.5-x86_64mysql
6.1.4. 授权
chown –R mysql:mysql mysql
6.1.5. 下发
su - root
scp -r /usr/local/mysql root@slave2:/usr/local
scp -r /usr/local/mysql root@slave3:/usr/local
6.1.6. 安装
/usr/local/mysql/scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
6.1.7. 配置Management Server
mkdir /var/lib/mysql-cluster
vi /var/lib/mysql-cluster/config.ini
[ndbd default] NoOfReplicas=2 定义在Cluster环境中相同数据的分数,通俗一点来说就是每一份数据存放NoOfReplicas份。如果希望能够冗余,那么至少设置为2(一般情况来说此参数值设置为2就够了),最大只能设置为4。另外,NoOfReplicas值得大小,实际上也就是node group大小的定义。NoOfReplicas参数没有系统默认值,所以必须设定,而且只能设置在[NDBD DEFAULT]中,因为此数值在整个Cluster集群中一个node group中所有的NDBD节点都需要一样。另外NoOfReplicas的数目对整个Cluster环境中NDB节点数量有较大的影响,因为NDB节点总数量是NoOfReplicas * 2 * node_group_num; DataMemory=80M 设定用于存放数据和主键索引的内存段的大小。这个大小限制了能存放的数据的大小,因为ndb存储引擎需属于内存数据库引擎,需要将所有的数据(包括索引)都load到内存中。这个参数并不是一定需要设定的,但是默认值非常小(80M),只也就是说如果使用默认值,将只能存放很小的数据。参数设置需要带上单位,如512M,2G等。另外,DataMemory里面还会存放UNDO相关的信息,所以,事务的大小和事务并发量也决定了DataMemory的使用量,建议尽量使用小事务; IndexMemory=18M 设定用于存放索引(非主键)数据的内存段大小。和DataMemory类似,这个参数值的大小同样也会限制该节点能存放的数据的大小,因为索引的大小是随着数据量增长而增长的。参数设置也如DataMemory一样需要单位。IndexMemory默认大小为18M; 实际上,一个NDB节点能存放的数据量是会受到DataMemory和IndexMemory两个参数设置的约束,两者任何一个达到限制数量后,都无法再增加能存储的数据量。如果继续存入数据系统会报错“table is full”。 [ndb_mgmd] Id=1集群中结点的唯一标识,取值 1~63。 Hostname=192.168.56.200 主节点 datadir=/usr/local/mysql/logs [ndbd] Id=2 Hostname=192.168.56.201 从节点 datadir=/usr/local/mysql/data/ [ndbd] Id=3 Hostname=192.168.56.202 从节点 datadir=/usr/local/mysql/data/ [MYSQLD] [MYSQLD] |
6.2. datanode(n台)
6.2.1. 授权
su - root
chown -R mysql:mysql /usr/local/mysql
6.2.2. 安装
/usr/local/mysql/scripts/mysql_install_db --user=mysql--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
6.2.3. 配置Data Node
su – root
cp /usr/local/mysql/support-files/my-default.cnf/etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server/etc/init.d/mysqld
vi /etc/my.cnf
datadir=/usr/local/mysql/data/ ndbcluster SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。 ndb-connectstring=192.168.56.200 [ndbd] connect-string=192.168.56.200 [mysql_cluster] ndb-connectstring=192.168.56.200 [ndb_mgm] connect-string=192.168.56.200 [ndb_mgmd] config-file=/var/lib/mysql-cluster/config.ini |
6.2.4. 在管理节点启动相关服务:
注意:如果提示错误,让创建文件夹,创建个。
#/usr/local/mysql/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
#netstat -lntpu
tcp 0 00.0.0.0:1186 0.0.0.0:*
LISTEN 22907/ndb_mgmd
看到1186端口开放了说明启动是正常的.
6.2.5. 在数据节点启动相关服务:
#/usr/local/mysql/bin/ndbd --initial
#netstat -lntpu
tcp 0 010.10.1.65:32975 0.0.0.0:* LISTEN 1901/ndbd
tcp 0 010.10.1.65:32976 0.0.0.0:* LISTEN 1901/ndbd
tcp 0 010.10.1.65:32977 0.0.0.0:* LISTEN 1901/ndbd
#service mysqld start
#netstat -lntpu
tcp 0 0 :::3306 :::* LISTEN 2258/mysqld
可以看到相关的ndbd服务以及mysql已经启动ok了.
7. 功能测试
到管理节点查看下相关服务状态
# ndb_mgm
ndb_mgm> show
Connected to Management Server at: localhost:1186
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 @10.10.1.65 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)
id=3 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.1.151 (mysql-5.1.37 ndb-7.0.8)
[mysqld(API)] 2 node(s)
id=4 @10.10.1.65 (mysql-5.1.37 ndb-7.0.8)
id=5 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8)
可以看到这里的数据节点、管理节点、sql节点都是正常的.
现在我们在其中一个数据节点上进行相关数据库的创建,然后到另外一个数据节点上看看数据是否同步
# /usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|mysql |
| ndb_2_fs |
|test |
+--------------------+
mysql> create database aa;
mysql> use aa
mysql> CREATE TABLE ctest2 (i INT) ENGINE=NDB; //这里必须指定数据库表的引擎为NDB,否则同步失败,只有这样子,这两台机器才能共享数据库的数据结构
mysql> INSERT INTO ctest2 () VALUES (1);
mysql> SELECT * FROM ctest2;
+------+
| i |
+------+
| 1 |
+------+
现在到另外一个数据节点查看下aa数据库是否同步过来了.
#/usr/local/mysql/bin/mysql -u root -p
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|aa |
|bb |
|mysql |
| ndb_3_fs |
|test |
+--------------------+
mysql> use aa
mysql> select * from ctest2;
+------+
| i |
+------+
| 1 |
+------+
从上面可以看到数据已经同步了,mysql集群环境已经搭建完成.
8. 破坏性测试
大家在上面可以看到10.10.1.65作为主的数据节点,我现在把10.10.1.65这台机器关闭,看下有什么结果
ndb_mgm> show
Cluster Configuration
---------------------
[ndbd(NDB)] 2 node(s)
id=2 (not connected, accepting connect from 10.10.1.65)
id=3 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8,Nodegroup: 0, Master)
[ndb_mgmd(MGM)] 1 node(s)
id=1 @10.10.1.151 (mysql-5.1.37 ndb-7.0.8)
[mysqld(API)] 2 node(s)
id=4 (not connected, accepting connect from any host)
id=5 @10.10.1.58 (mysql-5.1.37 ndb-7.0.8)
从上面可以发现现在10.10.1.65这台机器的数据节点和sql节点已经连接不上了,10.10.1.58成为了主数
据节点,我们现在在10.10.1.58数据节点上创建一个表,然后恢复10.10.1.65的数据节点,看下它是否
把数据同步过来了.
先在10.10.1.58数据节点做如下操作:
mysql> create table ctest3(id int(11)) engine=NDB;
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest2 |
| ctest3 |
+--------------+
mysql> insert into ctest3 values(1);
mysql> select * from ctest3;
+------+
| id |
+------+
| 1 |
+------+
然后我们恢复10.10.1.65数据节点,查看下ctest3数据是否同步过来了.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
|aa |
| bb |
|mysql |
| ndb_2_fs |
|test |
+--------------------+
mysql> use aa
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| ctest |
| ctest2 |
| ctest3 |
+--------------+
mysql> select * from ctest3;
+------+
| id |
+------+
| 1 |
+------+
可以看到10.10.1.65数据节点已经把10.10.1.58数据节点的数据同步过来了,说明mysql集群是没有问题的了.随后做下mysql性能相关的测试.
9. 修改root密码
/usr/local/mysql/bin/mysqladmin -u root password 'root'
10. 开启远程连接
mysql –uroot -proot
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;