MySQL Cluster
参考:http://www.cnblogs.com/linkstar/p/6510713.html
如果没有特殊声明,则所有命令都在node1上执行
192.168.1.201 node1 1核/448M 管理节点
192.168.1.202 node2 1核/448M 数据节点和mysql节点在同一台机器上
192.168.1.203 node3 1核/448M 数据节点和mysql节点在同一台机器上
#架构图及说明
前期准备
#配置主机名和IP对应关系(所有节点上操作该步)
[root@node1 ~]# vim /etc/hosts
192.168.1.201 node1
192.168.1.202 node2
192.168.1.203 node3
#在node1上生成秘钥并分发到各节点
[root@node1 ~]# ssh-keygen -t rsa
[root@node1 ~]# cat .ssh/id_rsa.pub >>.ssh/authorized_keys
[root@node1 ~]# ssh-copy-id root@node2
[root@node1 ~]# ssh-copy-id root@node3
#做跳板机
[root@node1 ~]# alias a='for a in {1..3};do'
[root@node1 ~]# alias b='for b in {2..3};do'
#测试跳板机
[root@node1 ~]# a ssh node$a 'hostname';done
#注:如果出现解析的出来的IP和主机名不对应的问题,就看下.ssh/known_hosts中的对应关系,将错误的删除即可
#关闭各节点防火墙
[root@node1 ~]# a ssh node$a 'systemctl stop firewalld';done
[root@node1 ~]# a ssh node$a 'systemctl disable firewalld';done
[root@node1 ~]# a ssh node$a 'iptables -F';done
#安装配置管理节点
[root@node1 ~]# wget https://cdn.mysql.com//archives/mysql-cluster-gpl-7.5/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz
注:这里的包地址是wget时跟随的新地址,原地址为https://dev.mysql.com/*****
[root@node1 ~]# tar -zxvf mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz -C /usr/local/
[root@node1 ~]# cp /usr/local/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64/bin/ndb_mgm* /usr/local/bin/
[root@node1 ~]# mkdir /var/lib/mysql-cluster
[root@node1 ~]# mkdir /usr/local/mysql
[root@node1 ~]# vim /var/lib/mysql-cluster/config.ini
[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=18M
[ndb_mgmd]
HostName=192.168.1.201
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.1.202
DataDir=/var/lib/mysql-cluster
[ndbd]
HostName=192.168.1.203
DataDir=/var/lib/mysql-cluster
[mysqld]
[mysqld]
#使用配置文件初始化管理节点
[root@node1 ~]# ndb_mgmd -f /var/lib/mysql-cluster/config.ini
#使用ndb_mgm进行管理
[root@node1 ~]# ndb_mgm
ndb_mgm> show (使用show命令查看管理情况,当数据节点配置完毕之后再用这个命令查看和管理)
#安装配置数据节点 和 mysql节点
#以下的所有操作需要在所有的集群节点都要进行相同的操作
[root@node1 ~]# scp mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz root@node2:~
[root@node1 ~]# scp mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz root@node3:~
[root@node1 ~]# b ssh node$b 'groupadd mysql';done
[root@node1 ~]# b ssh node$b 'useradd -g mysql -s /bin/false mysql';done
[root@node1 ~]# b ssh node$b 'mkdir /var/lib/mysql-cluster';done
[root@node1 ~]# b ssh node$b 'chown root:mysql /var/lib/mysql-cluster';done
[root@node1 ~]# b ssh node$b 'tar zxvf ~/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64.tar.gz -C /usr/local/';done
[root@node1 ~]# b ssh node$b 'cp -R /usr/local/mysql-cluster-gpl-7.5.11-linux-glibc2.12-x86_64/ /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'echo '[mysqld]'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndbcluster'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndb-connectstring=192.168.1.201'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo ' '>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo '[mysql_cluster]'>>/etc/my.cnf';done
[root@node1 ~]# b ssh node$b 'echo 'ndb-connectstring=192.168.1.201'>>/etc/my.cnf';done
注:以上IP为管理节点的IP
[root@node1 ~]# b ssh node$b '/usr/local/mysql/bin/mysqld --initialize';done 密码样式1: e,djt*Jre9vC 密码样式2: ew3;bg#B0Il6
[root@node1 ~]# b ssh node$b 'mv /etc/my.cnf{,.bak}';done
[root@node1 ~]# b ssh node$b 'chown -R root /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'chown -R mysql /usr/local/mysql/data';done
[root@node1 ~]# b ssh node$b 'chgrp -R mysql /usr/local/mysql';done
[root@node1 ~]# b ssh node$b 'cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/';done
[root@node1 ~]# b ssh node$b 'chmod +x /etc/rc.d/init.d/mysql.server';done
[root@node1 ~]# b ssh node$b 'chkconfig --add mysql.server';done
#启动ndbd
[root@node1 ~]# b ssh node$b '/usr/local/mysql/bin/ndbd --initial';done
#启动MySQL
[root@node1 ~]# b ssh node$b '/etc/init.d/mysql.server start';done
Starting MySQL... SUCCESS!
Starting MySQL.. SUCCESS!
#登录MySQL(除管理节点以外的所有节点上执行)
[root@node2 ~]# /usr/local/mysql/bin/mysql -uroot -p
Enter password:
mysql> set password=password('123456');
注:不执行该步会提示You must reset your password using ALTER USER statement before executing this statement.这样的提示
mysql> alter user 'root'@'localhost' password expire never;
mysql> flush privileges;
#修改MySQL登录密码及授权
mysql> use mysql;
mysql> update user set host='%' where user='root';
mysql> update user set host='localhost' where user='root';
mysql> alter user 'root'@'localhost' identified by '123456';
mysql> update user set host='%' where user='root';
测试:
修改mysql密码统一,修改mysql的访问权限,使外部ip能远程访问mysql
然后在一台上面创建数据库,看另一台是否被同步,然后创建表,然后新增删除等等。
唯一需要注意的是,创建表的时候必须选择表的引擎为NDBCLUSTER,否则表不会进行同步
如果把表引擎创建成MyISAM,再次查看数据同步情况
SQL单点故障测试
NDB(数据节点)的单点故障
在这个测试环境中,数据节点是两个,那么他们对数据的存储是互相镜像还是一份数据分成几块存储呢?(类似磁盘阵列RAID1还是RAID0)
这个答案关键在于配置文件中 [NDBD DEFAULT] 组中的NoOfReplicas参数,
如果这个参数等于1,表示只有一份数据,但是分成N块分别存储在N个数据节点上,
如果该值等于2,则表示数据被分成N/2,每块数据都有两个备份,这样即使有任意一个节点发生故障,只要它的备份节点正常,数据就可以正常查询。
测试方法和过程:
先将两个数据节点之一停止,访问zhangsan表,看能否正常访问;
然后将NoOfReplicas配置改为2,这时数据节点实际上已经互为镜像,保存了两份。
这时再停止任意一个数据节点,将不能再次访问表zhangsan,反之
会报:
Error data: Illegal configuration change. Initial start needs to be performed when changing no of replicas (1 != 2) 的错误。
看来NoOfReplicas参数无法临时更改,所以一开始就需要设置好,不要到后面才想到更改,那时就悲剧了。
如果重新ndbd --initial,将会丢失所有数据,记住这个坑.....
SQL节点关闭
/etc/init.d/mysqld stop
数据节点(NDB)关闭
ndbd stop
管理节点关闭
ndb_mgm> shutdown
总结:
学习中踩了不少坑:
比如参数NoOfReplicas无法临时更改,
管理节点配置文件中如果不多预留一个[MySQLD],
在停止NDB节点时会报错,
配置文件中的[NDBD]段落中的datadir指定的目录在数据节点的服务器上面要存在。
selinux,iptables等相关问题。
后续的文章中将会介绍mysql cluster的日常维护,包括数据备份,数据恢复,日志管理等。
MySQL Cluster的核心在于NDB Cluster存储引擎,不仅对数据进行了水平切分,还对数据进行了跨节点冗余。
既解决了数据库的扩展问题,同时也在很大程度上提高了数据库整体可用性。