一、前言
MySQL的集群方案有很多,比如自带的MySQL Replication,官方的MySQL Fabirc、MySQL Cluster,还有三方的MMM、MHA等等,每个方案都是各自的优缺点,选型无非是要考虑高可用性、可伸缩性、负载均衡等等。
二、介绍
MySQL Cluster 是MySQL 官方集群部署方案,它的历史较久。支持通过自动分片支持读写扩展,通过实时备份冗余数据,是可用性最高的方案,声称可做到99.999%的可用性。
MySQL NDB Cluster架构按照节点类型分为三部分:
管理节点(Management node)
管理节点通过对配置文件conifg.ini的维护来对其他节点进行管理。该文件可以用来配置有多少副本需要维护、在数据节点上为数据和索引分配多少内存、数据节点的位置、数据节点上保存数据的磁盘的位置,SQL节点的位置信息等,管理节点只能有一个。
SQL节点(SQL node)
SQL节点可以理解为应用程序和数据节点的一个桥梁,应用程序不能直接访问数据节点,只能先访问SQL节点,然后SQL节点再去访问数据节点来返回数据,Cluster中可以有多个SQL节点,通过每个SQL节点查询到的数据都是一致的,一般来说,SQL节点越多,分配到每个SQL节点的负载就越小,系统的整体性能就越好;
数据节点(Data node)
数据节点用来存放数据,可有多个数据节点。
三、 Mysql Cluster搭建
1、环境准备
172.8.10.105 siger-data1.test.com 管理节点
172.8.10.106 siger-data2.test.com mysql节点,ndb节点
172.8.10.107 siger-data2.test.com mysql节点,ndb节点
2、解压
cd /opt/
tar -zxvf mysql-cluster-8.0.20-linux-glibc2.12-x86_64.tar.gz
mv /opt/mysql-cluster-8.0.20-linux-glibc2.12-x86_64 /usr/local/mysql/
3、分发
scp -r /usr/local/mysql/ root@172.8.10.106:/usr/local/
scp -r /usr/local/mysql/ root@172.8.10.107:/usr/local/
4、安装管理节点(105节点)
# 将需要的文件取出
cd /usr/local/mysql/
cp bin/ndb_mgm* /usr/local/bin
cd /usr/local/bin
chmod +x ndb_mgm*
#新建配置文件并且初始化管理节点
mkdir /var/lib/mysql-cluster
vim /var/lib/mysql-cluster/config.ini
[ndbd default]
#设置冗余的分数
NoOfReplicas=2
#指定存放数据的内存段大小
DataMemory=1024M
#制定索引的内存段大小
IndexMemory=512M
#将进程锁定在内存中,以避免与磁盘的交换
LockPagesInMainMemory=1
#该参数为作为整体的簇设置了最大表对象数目。该参数的默认值为128。最小值为8,最大值为20320,每个表对象每节点约需20KB的空间。
MaxNoOfTables=4096
#设置哈希索引在系统中同意时间被使用的总数,该参数的默认值为128。
MaxNoOfOrderedIndexes=2048
#设置最大的唯一索引的总数,默认值为64,最大值为4294967294。
MaxNoOfUniqueHashIndexes=2048
#定义了可在簇中定义的属性数目
MaxNoOfAttributes=20480
#该参数用于设置簇中触发程序对象的最大数目。该参数的默认值为768.
MaxNoOfTriggers=10240
[ndb_mgmd]
NodeId=1
HostName=172.8.10.105
DataDir=/var/lib/mysql-cluster
[ndbd]
NodeId=2
HostName=172.8.10.106
DataDir=/var/lib/mysql-cluster
[ndbd]
NodeId=3
HostName=172.8.10.107
DataDir=/var/lib/mysql-cluster
[mysqld]
NodeId=4
HostName=172.8.10.106
[mysqld]
NodeId=5
HostName=172.8.10.107
#必须有空的mysqld节点,不然数据节点断开后启动有报错
[mysqld]
nodeid=6
[mysqld]
nodeid=7
#使用配置文件初始化管理节点
/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini –initial
注:报以上错,是因为没找到libcrypto.so.1.1,将mysql的报复制到/usr/lib64/目录
cp /usr/local/mysql/lib/private/libssl.so.1.1 /usr/lib64/
cp /usr/local/mysql/lib/private/libcrypto.so.1.1 /usr/lib64/
# 重新执行初始化命令
/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini –initial
#查看管理情况
任意目录执行 ndb_mgm
ndb_mgm>show
5、安装数据节点和mysql节点
以下的所有操作需要在所有的集群节点都要进行相同的操作
#新增用户组mysql和用户msyql
groupadd mysql
useradd -g mysql -s /bin/false mysql
#新建文件夹并赋予权限
mkdir /var/lib/mysql-cluster
chown root:mysql /var/lib/mysql-cluster
#初始化mysql
tar xvf mysql-cluster-8.0.20-linux-glibc2.12-x86_64.tar.gz
ln -s /usr/local/mysql-cluster-8.0.20-linux-glibc2.12-x86_64 /usr/local/mysql
cd /usr/local/mysql/bin/
./mysqld --initialize
172.8.10.106:
172.8.10.107:
会提示一个随机生成的数据库密码,此时需要记住这个密码,之后登录数据库需要使用这个密码!!!
#修改权限
cd /usr/local/mysql/
chown -R root .
chown -R mysql data
chgrp -R mysql .
cp support-files/mysql.server /etc/rc.d/init.d/
chmod +x /etc/rc.d/init.d/mysql.server
chkconfig --add mysql.server
#配置数据节点
vim /etc/my.cnf
[client] port = 3306 socket =/tmp/mysql.sock
[mysqld] basedir=/usr/local/mysql/ datadir=/usr/local/mysql/data user=root port=3306 socket=/tmp/mysql.sock server-id = 1 # 另一个改成2 ndbcluster ndb-connectstring=172.8.10.105 # 管理节点IP tmp_table_size = 10240M
[mysql_cluster] ndb-connectstring=172.8.10.105 #管理节点IP
[mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid |
#启动mysql
service mysql start
#查看状态
service mysql status
#登录mysql
cd /usr/local/mysql/bin/
./mysql -u root -p
注意:用随机生成的密码
#设置新密码
alter user 'root'@'localhost' identified by 'xx';
CREATE USER 'root'@'%'IDENTIFIED BY 'xx';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
flush privileges;
#启动ndbd
./ndbd –initial
172.8.10.106:
172.8.10.107:
#查看集群状态(管理节点)
ndb_mgm
show
6、关闭集群
关闭管理节点:
ndb_mgm -e shutdown
关闭SQL节点:
/etc/init.d/mysql.server stop
注:关闭时只需要关闭管理节点,后面的数据节点会同时被关闭,mysql需要额外关闭
7、启动集群
启动管理节点:
/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
启动数据节点:
/usr/local/mysql/bin/ndbd
启动SQL节点:
/etc/init.d/mysql.server start
查看集群状态
ndb_mgm
show
8、测试集群
#接入客户端
cd /usr/local/mysql/bin/
./mysql -u root -p
#创建统一账号(任意sql节点)
CREATE USER 'siger'@'%'IDENTIFIED BY 'xx';
GRANT ALL PRIVILEGES ON *.* TO 'siger'@'%';
CREATE USER 'siger'@'localhost'IDENTIFIED BY 'xx';
GRANT ALL PRIVILEGES ON *.* TO 'siger'@'localhost ';
ALTER USER 'siger'@'%' IDENTIFIED BY 'xx' PASSWORD EXPIRE NEVER;
ALTER USER 'siger'@'%' IDENTIFIED WITH mysql_native_password BY 'xx';
FLUSH PRIVILEGES;
#登陆107的sql节点
#siger用户登录
./mysql -u siger -p
创建测试数据和和表
create database test;
use test;
CREATE TABLE student (age INT) ENGINE=NDBCLUSTER;
#登陆108的sql节点查看
9、开机自启
#设置自启(管理节点)
vim /usr/local/mysql/ndb_mgm.sh
/usr/local/bin/ndb_mgmd -f /var/lib/mysql-cluster/config.ini
#设置权限
chmod +x /usr/local/mysql/ndb_mgm.sh
#设置自启
vim /etc/rc.local
nohup sh /usr/local/mysql/ndb_mgm.sh &
#设置检验脚本(数据节点和sql节点)
数据节点的启动需要等待管理节点启动后,才能进行。所以使用了监控脚本来控制数据节点的启动,管理节点监听1186端口,使用nc检测1186端口的状态,来判断管理节点是否已经启动成功
vim /usr/local/mysql/ndbd_mysql_check.sh
#!/bin/bash
# chkconfig: 2345 10 90
# description: myservice ....
while :
do
#检测管理节点是否已经启动
nc -w 10 -z 172.8.10.105 1186 > /dev/null 2>&1
ndb_mgmd=`echo $?`
#管理节点启动
if [ $ndb_mgmd -eq 0 ];then
/usr/local/mysql/bin/ndbd
/etc/init.d/mysql.server start
break
else
#管理节点未启动或挂掉的时候,关闭数据节点和sql节点
/etc/init.d/mysql.server stop
fi
sleep 5
done
#设置权限
chmod +x ndbd_mysql_check.sh
#设置自启
vim /etc/rc.local
nohup sh /usr/local/mysql/ndbd_mysql_check.sh &