一. MySQL集群简介
MySQL群集技术在分布式系统中为MySQL数据提供了冗余特性,增强了安全性,使得单个MySQL服务器故障不会对系统产生巨大的负面效应,系统的稳定性得到保障。
MySQL群集需要有一组计算机,每台计算机的角色可能是不一样的。MySQL群集中有三种节点:管理节点、数据节点和SQL节点。群集中的某计算机可能是某一种节点,也可能是两种或三种节点的集合。这三种节点只是在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。
管理节点(也可以称管理服务器)主要负责管理数据节点和SQL节点,还有群集配置文件和群集日志文件。它监控其他节点的工作状态,能够启动、关闭或重启某个节点。其他节点从管理节点检索配置数据,当数据节点有新事件时就把事件信息发送给管理节点并写入群集日志。
数据节点用于存储数据。
SQL节点跟一般的MySQL服务器是一样的,我们可以通过它进行SQL操作。
下图中画出了三种群集节点及应用程序间的关系:
二. 部署过程
从上面的简介可知,MySQL群集中有三种节点:管理节点、数据节点和SQL节点;所以,如果要实现高可用冗余集群,至少需要6台主机。
我们这里把数据节点和SQL节点放在同一台主机上,使用舞台主机,主机信息如下:
10.10.91.71 node1 # mgmd节点10.10.91.72 node2 # sql和data节点10.10.91.75 node3 # sql和data节点10.10.91.77 node4 # mgmd节点
1. 初始化系统
每个节点都操作
# systemctl disable firewalld
# vi /etc/selinux/config
SELINUX=disabled
# hostnamectl set-hostname xxx
# cd/usr/local/
# wget http://mirrors.sohu.com/mysql/MySQL-Cluster-7.5/mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz # 可根据时间情况下载,从其他镜像源或官方下载
# tar -zxf mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz && mv mysql-cluster-gpl-7.5.5-linux-glibc2.5-x86_64.tar.gz /usr/local/mysql
# cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin/
# chmod +x /usr/local/bin/ndb_mgm*
# chmod +x /usr/local/mysql/bin/
# echo "export PATH=$PATH:/usr/local/mysql/bin/" >> /etc/profile
# reboot
2. 在node1和node4上配置管理节点
# mkdir /var/lib/mysql-cluster
# vi /var/lib/mysql-cluster/config.ini
node1
[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=18M
[ndb_mgmd]
NodeId=1
HostName=10.10.91.71
DataDir=/var/lib/mysql-cluster
[ndb_mgmd]
NodeId=6
HostName=10.10.91.77
DataDir=/var/lib/mysql-cluster
[ndbd]
NodeId=2
HostName=10.10.91.72
DataDir=/usr/local/mysql/data
[ndbd]
NodeId=3
HostName=10.10.91.75
DataDir=/usr/local/mysql/data
[mysqld]
NodeId=4
HostName=10.10.91.72
[mysqld]
NodeId=5
HostName=10.10.91.75
node4
[ndbd default]
NoOfReplicas=2
DataMemory=512M
IndexMemory=18M
[ndb_mgmd]
NodeId=6
HostName=10.10.91.77
DataDir=/var/lib/mysql-cluster
[ndb_mgmd]
NodeId=1
HostName=10.10.91.71
DataDir=/var/lib/mysql-cluster
[ndbd]
NodeId=2
HostName=10.10.91.72
DataDir=/usr/local/mysql/data
[ndbd]
NodeId=3
HostName=10.10.91.75
DataDir=/usr/local/mysql/data
[mysqld]
NodeId=4
HostName=10.10.91.72
[mysqld]
NodeId=5
HostName=10.10.91.75
3. 在node2/node3上配置数据节点和sql节点
# groupadd mysql && useradd -g mysql mysql
# vi /etc/my.cnf
node2
[client]
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
user=mysql
symbolic-links=0
ndbcluster
ndb-connectstring=10.10.91.71,10.10.91.77
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql_cluster]
ndb-connectstring=10.10.91.71,10.10.91.77
node3
[client]
socket=/usr/local/mysql/mysql.sock
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock
user=mysql
symbolic-links=0
ndbcluster
ndb-connectstring=10.10.91.71,10.10.91.77
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
[mysql_cluster]
ndb-connectstring=10.10.91.71,10.10.91.77
# cd /usr/local/mysql
# bin/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# chown -R mysql.mysql /usr/local/mysql
# cp mysql/support-files/mysql.server /etc/rc.d/init.d/
# chmod +x /etc/rc.d/init.d/mysql.server
# chkconfig --add mysql.server
4. Mysql Cluster集群的启动
# 启动管理节点,首次启动需要+ --initial
# ndb_mgmd -f /var/lib/mysql-cluster/config.ini --initial
# 启动数据节点,首次启动需要+ --initial
# /usr/local/mysql/bin/ndbd --initial
# 启动 SQL 节点
# /usr/local/mysql/bin/mysqld_safe --user=mysql &
# 查看集群状态
# 管理节点上操作:
[root@node1 local]# 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.10.91.72 (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0, *) # dbdb节点
id=3 @10.10.91.75 (mysql-5.7.17 ndb-7.5.5, Nodegroup: 0)
[ndb_mgmd(MGM)] 2 node(s)
id=1 @10.10.91.71 (mysql-5.7.17 ndb-7.5.5) # mgmd节点
id=6 @10.10.91.77 (mysql-5.7.17 ndb-7.5.5)
[mysqld(API)] 2 node(s)
id=4 @10.10.91.72 (mysql-5.7.17 ndb-7.5.5) # mysqld节点
id=5 @10.10.91.75 (mysql-5.7.17 ndb-7.5.5)
5. 测试
# 先将 SQL 节点的数据库密码修改为相同的
# /usr/local/mysql/bin/mysql_secure_installation # 该命令为MySQL初始化命令操作
或使用如下方法修改密码
mysql -u root -p;
随机密码(具体请参见/root/.mysql_secret文件获取),进入后使用如下指令修改密码:
SET PASSWORD = PASSWORD('新密码');
# SQL 节点 1 上新建库,并插入数据
# mysql -uroot -p
mysql> create database aa;
mysql> use aa;
mysql> create table student(id int(10) primary key auto_increment,name varchar(30),age tinyint(2)) engine=ndb;
# 数据库表的引擎必须为NDB,不然就同步失败了,可以用 show create table 表名; 来查看引擎
mysql> insert into student (id,name,age) value(321281,"mzh",18);
mysql> quit
# SQL 节点 2 查看是否同步
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| aa |
| mysql |
| ndbinfo |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> use aa;
mysql> show tables;
+--------------+
| Tables_in_aa |
+--------------+
| student |
+--------------+
1 row in set (0.01 sec)
mysql> select * from student;
+--------+------+------+
| id | name | age |
+--------+------+------+
| 321281 | mzh | 18 |
+--------+------+------+
1 row in set (4.27 sec)
# 做到这里,已经看到可以同步了。然后我们再模拟SQL节点1宕机了,在SQL2上插入新的数据,再SQL1开机,查看数据是否会同步。
# 在SQL 1上操作:
# /etc/rc.d/init.d/mysql.server stop
# ps -ef| grep mysql
# 在 SQL 2 操作:
mysql> insert into student (id,name,age) value(12121,"hp",19);
mysql> select * from student;
+--------+------+------+
| id | name | age |
+--------+------+------+
| 12121 | hp | 19 |
| 321281 | mzh | 18 |
+--------+------+------+
2 rows in set (0.00 sec)
# 再在 SQL1 上查看是否同步
# /etc/rc.d/init.d/mysql.server start
mysql> select * from student;
+--------+------+------+
| id | name | age |
+--------+------+------+
| 12121 | hp | 19 |
| 321281 | mzh | 18 |
+--------+------+------+
2 rows in set (0.00 sec)
6. Mysql Cluster关闭和启动
启动mysql集群。启动顺序为:管理节点→数据节点→SQL节点。管理节点操作:
# ndb_mgm -e shutdown # 关闭
# ndb_mgmd -f /var/lib/mysql-cluster/config.ini # 启动
# /usr/local/mysql-cluster/ndb_mgm -e exit # 退出
# /usr/local/mysql-cluster/ndb_mgm -e show # 查看和管理
数据节点:
# /usr/local/mysql/bin/ndbd # 启动,数据节点和管理节点没有启动脚本,可以自己手动编写或将加到系统的起动机脚本中
SQL 节点操作:
# /etc/rc.d/init.d/mysql.server stop/start/restart
# chkconfig mysql.server # 添加到开机启动