详解MySQL集群搭建


Posted in MySQL onMay 26, 2021

概述

MySQL Cluster 是MySQL 适合于分布式计算环境的高实用、可拓展、高性能、高冗余版本,其研发设计的初衷就是要满足许多行业里的最严酷应用要求,这些应用中经常要求数据库运行的可靠性要达到99.999%。MySQL Cluster允许在无共享的系统中部署“内存中”数据库集群,通过无共享体系结构,系统能够使用廉价的硬件,而且对软硬件无特殊要求。此外,由于每个组件有自己的内存和磁盘,不存在单点故障。

实际上,MySQL集群是把一个叫做NDB的内存集群存储引擎集成与标准的MySQL服务器集成。它包含一组计算机,每个都跑一个或者多个进程,这可能包括一个MySQL服务器,一个数据节点,一个管理服务器和一个专有的一个数据访问程序。

MySQL Cluster能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在Cluster 级别上的存储引擎上做这个最简单。以下为MySQL集群结构关系图,

详解MySQL集群搭建

MySQL从结构看,由3类节点(计算机或进程)组成,分别是:

管理节点:用于给整个集群其他节点提供配置、管理、仲裁等功能。理论上通过一台服务器提供服务就可以了。

数据节点:MySQL Cluster的核心,存储数据、日志,提供数据的各种管理服务。2个以上 时就能实现集群的高可用保证,DB节点增加时,集群的处理速度会变慢。

SQL节点(API):用于访问MySQL Cluster数据,提供对外应用服务。增加 API 节点会提高整个集群的并发访问速度和整体的吞吐量,该节点 可以部署在Web应用服务器上,也可以部署在专用的服务器上,也开以和DB部署在同一台服务器上。

NDB引擎

MySQL Cluster 使用了一个专用的基于内存的存储引擎——NDB引擎,这样做的好处是速度快, 没有磁盘I/O的瓶颈,但是由于是基于内存的,所以数据库的规模受系统总内存的限制, 如果运行NDB的MySQL服务器一定要内存够大,比如4G, 8G, 甚至16G。NDB引擎是分布式的,它可以配置在多台服务器上来实现数据的可靠性和扩展性,理论上 通过配置2台NDB的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

缺陷

  • 基于内存,数据库的规模受集群总内存的大小限制
  • 基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证。
  • 多个节点通过网络实现通讯和数据同步、查询等操作,因此整体性受网络速度影响,因此速度也比较慢

2.2 优点

  • 多个节点之间可以分布在不同的地理位置,因此也是一个实现分布式数据库的方案。
  • 扩展性很好,增加节点即可实现数据库集群的扩展。
  • 冗余性很好,多个节点上都有完整的数据库数据,因此任何一个节点宕机都不会造成服务中断。

实现高可用性的成本比较低,不象传统的高可用方案一样需要共享的存储设备和专用的软件才能实现,NDB 只要有足够的内存就能实现。

本文将搭建一个最简化的MySQL Cluster系统,配置方法中的所有命令都是以root账户运行。这个MySQL Cluster包含一个管理结点、两个数据结点、两个SQL结点,这五个结点会分别安装在五个虚拟机上,虚拟机的名称和IP如下所示:

详解MySQL集群搭建

一、公共配置

请在三个虚拟机上分别配置此处的配置项。

1. 安装虚拟机

虚拟机操作系统安装CentOS 6.4的x86_64版本,使用NAT网络,并且还要安装vmware-tools,具体安装方法此处不详述。

2. 拷贝mysql cluster

下载MySQL-Cluster:

下载得到的压缩包拷贝至虚拟机的/root/Downloads目录,然后在shell中运行以下命令:

cd /root/Downloads 
 
tar -xvzf mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64.tar.gz 
 
mv mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64 /usr/local/mysql

 3. 关闭安全策略

关闭iptables防火墙(或者打开防火墙的1186、3306端口),在Shell中运行以下命令:

chkconfig --level 35 iptables off


关闭SELinux,在Shell中运行以下命令:

gedit /etc/selinux/config

将config文件中的SELINUX项改为disabled,修改后的config文件的内容如下:

# This file controls the state of SELinux on the system. 
 
# SELINUX= can take one of these three values: 
 
# enforcing - SELinux security policy is enforced. 
 
# permissive - SELinux prints warnings instead of enforcing. 
 
# disabled - No SELinux policy is loaded. 
 
SELINUX=disabled 
 
# SELINUXTYPE= can take one of these two values: 
 
# targeted - Targeted processes are protected, 
 
# mls - Multi Level Security protection. 
 
SELINUXTYPE=targeted

最后重启系统


二、配置管理结点(192.168.124.141)

1. 配置config.ini配置文件

在shell中运行以下命令:

mkdir /var/lib/mysql-cluster 
 
cd /var/lib/mysql-cluster 
 
gedit config.ini

配置文件config.ini内容如下:

[ndbd default] 
 
NoOfReplicas=2 
 
DataMemory=80M 
 
IndexMemory=18M 
 
[ndb_mgmd] 
 
NodeId=1 
 
hostname=192.168.124.141 
 
datadir=/var/lib/mysql-cluster 
 
[ndbd] 
 
NodeId=2 
 
hostname=192.168.124.142 
 
datadir=/usr/local/mysql/data 
 
[ndbd] 
 
NodeId=3 
 
hostname=192.168.124.143 
 
datadir=/usr/local/mysql/data 
 
[mysqld] 
 
NodeId=4 
 
hostname=192.168.124.144 
 
[mysqld] 
 
NodeId=5 
 
hostname=192.168.124.145

2. 安装管理结点

安装管理节点,不需要mysqld二进制文件,只需要MySQL Cluster服务端程序(ndb_mgmd)和监听客户端程序(ndb_mgm)。在shell中运行以下命令:

cp /usr/local/mysql/bin/ndb_mgm* /usr/local/bin 
 
cd /usr/local/bin 
 
chmod +x ndb_mgm*

三、配置数据结点(192.168.124.142、192.168.124.143)

1. 添加mysql组和用户

在shell中运行以下命令:

groupadd mysql 
 
useradd -g mysql mysql

2. 配置my.cnf配置文件

在shell中运行以下命令:

gedit /etc/my.cnf

配置文件my.cnf的内容如下:

[mysqld] 
 
basedir=/usr/local/mysql 
 
datadir=/usr/local/mysql/data 
 
socket=/usr/local/mysql/sock/mysql.sock 
 
user=mysql 
 
# Disabling symbolic-links is recommended to prevent assorted security risks 
 
symbolic-links=0 
 
[mysqld_safe] 
 
log-error=/var/log/mysqld.log 
 
pid-file=/var/run/mysqld/mysqld.pid 
 
[mysql_cluster] 
 
ndb-connectstring=192.168.124.141

3. 创建系统数据库

在shell中运行以下命令:

cd /usr/local/mysql 
 
mkdir sock 
 
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

4. 设置数据目录

在shell中运行以下命令:

chown -R root . 
 
chown -R mysql.mysql /usr/local/mysql/data 
 
chown -R mysql.mysql /usr/local/mysql/sock 
 
chgrp -R mysql .

5. 配置MySQL服务

在shell中运行以下命令:

cp support-files/mysql.server /etc/rc.d/init.d/ 
 
chmod +x /etc/rc.d/init.d/mysql.server 
 
chkconfig --add mysql.server

四、配置SQL结点(192.168.124.144、192.168.124.145)

1. 添加mysql组和用户

在shell中运行以下命令:

groupadd mysql 
 
useradd -g mysql mysql

2. 配置my.cnf配置文件

在shell中运行以下命令:

gedit /etc/my.cnf

配置文件my.cnf的内容如下:

[client] 
 
socket=/usr/local/mysql/sock/mysql.sock 
 
[mysqld] 
 
ndbcluster 
 
datadir=/usr/local/mysql/data 
 
socket=/usr/local/mysql/sock/mysql.sock 
 
ndb-connectstring=192.168.124.141 
 
[mysql_cluster] 
 
ndb-connectstring=192.168.124.141

3. 创建系统数据库

在shell中运行以下命令:

cd /usr/local/mysql 
 
mkdir sock 
 
scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

4. 设置数据目录

在shell中运行以下命令:

chown -R root . 
 
chown -R mysql.mysql /usr/local/mysql/data 
 
chown -R mysql.mysql /usr/local/mysql/sock 
 
chgrp -R mysql .

5. 配置MySQL服务

在shell中运行以下命令:

cp support-files/mysql.server /etc/rc.d/init.d/ 
 
chmod +x /etc/rc.d/init.d/mysql.server 
 
chkconfig --add mysql.server

五、Cluster环境启动

注意启动顺序:首先是管理节点,然后是数据节点,最后是SQL节点。

1. 启动管理结点

在shell中运行以下命令:

ndb_mgmd -f /var/lib/mysql-cluster/config.ini

 还可以使用ndb_mgm来监听客户端,如下:

ndb_mgm

2. 启动数据结点

首次启动,则需要添加--initial参数,以便进行NDB节点的初始化工作。在以后的启动过程中,则是不能添加该参数的,否则ndbd程序会清除在之前建立的所有用于恢复的数据文件和日志文件。

/usr/local/mysql/bin/ndbd --initial

如果不是首次启动,则执行下面的命令。

/usr/local/mysql/bin/ndbd

3. 启动SQL结点

若MySQL服务没有运行,则在shell中运行以下命令:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

4. 启动测试

查看管理节点,启动成功

六、集群测试

1. 测试一

现在我们在其中一个SQL结点上进行相关数据库的创建,然后到另外一个SQL结点上看看数据是否同步。

在SQL结点1(192.168.124.144)上执行:

shell> /usr/local/mysql/bin/mysql -u root -p 
 
mysql>show databases; 
 
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;

然后在SQL结点2上看数据是否同步过来了

经过测试,在非master上创建数据,可以同步到master上

查看表的引擎是不是NDB,>show create table 表名;

2. 测试二

关闭一个数据节点 ,在另外一个节点写输入,开启关闭的节点,看数据是否同步过来。

首先把数据结点1重启,然后在结点2上添加数据

在SQL结点2(192.168.124.145)上操作如下:

mysql> create database bb; 
 
mysql> use bb; 
 
mysql> CREATE TABLE ctest3 (i INT) ENGINE=NDB; 
 
mysql> use aa; 
 
mysql> INSERT INTO ctest2 () VALUES (3333); 
 
mysql> SELECT * FROM ctest2;

等数据结点1启动完毕,启动数据结点1的服务

#/usr/local/mysql/bin/ndbd --initial#service mysqld start
然后登录进去查看数据

# /usr/local/mysql/bin/mysql -u root ?p
可以看到数据已经同步过来了,说明数据可以双向同步了。

七、关闭集群

1. 关闭管理节点和数据节点,只需要在管理节点(ClusterMgm--134)里执行:

Connected to Management Server at: localhost:1186 
 
2 NDB Cluster node(s) have shutdown. 
 
Disconnecting to allow management server to shutdown.

显示

Connected to Management Server at: localhost:1186 
 
2 NDB Cluster node(s) have shutdown. 
 
Disconnecting to allow management server to shutdown.

2. 然后关闭Sql节点(135,136),分别在2个节点里运行:

shell> /etc/init.d/mysql.server stop

Shutting down MySQL... SUCCESS!

注意:要再次启动集群,就按照第五部分的启动步骤即可,不过这次启动数据节点的时候就不要加”-initial”参数了。

以上就是MySQL集群搭建过程,希望对大家自己动手搭建MySQL集群有所帮助

MySQL 相关文章推荐
详解MySQL集群搭建
May 26 MySQL
MySQL不使用order by实现排名的三种思路总结
Jun 02 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
MySQL 5.7常见数据类型
Jul 15 MySQL
使用ORM新增数据在Mysql中的操作步骤
Jul 26 MySQL
为什么MySQL 删除表数据 磁盘空间还一直被占用
Oct 16 MySQL
MySQL8.0升级的踩坑历险记
Nov 01 MySQL
VS2019连接MySQL数据库的过程及常见问题总结
Nov 27 MySQL
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
Dec 06 MySQL
Mysql 如何合理地统计一个数据库里的所有表的数据量
Apr 18 MySQL
MySQL 数据库范式化设计理论
Apr 22 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 #MySQL
修改MySQL的默认密码的四种小方法
May 26 #MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 #MySQL
Mysql数据库命令大全
May 26 #MySQL
Mysql基础知识点汇总
May 26 #MySQL
my.ini优化mysql数据库性能的十个参数(推荐)
May 26 #MySQL
linux下导入、导出mysql数据库命令的实现方法
May 26 #MySQL
You might like
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
php的sso单点登录实现方法
2015/01/08 PHP
十幅图告诉你什么是PHP引用
2015/02/22 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
Zend Framework教程之前端控制器Zend_Controller_Front用法详解
2016/03/07 PHP
PHP在同一域名下两个不同的项目做独立登录机制详解
2017/09/22 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
JCalendar 日历控件 v1.0 beta[兼容IE&Firefox] 有文档和例子
2007/05/30 Javascript
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
Egret引擎开发指南之编译项目
2014/09/03 Javascript
javascript学习笔记整理(概述、变量、数据类型简介)
2015/10/25 Javascript
VUEJS实战之修复错误并且美化时间(2)
2016/06/13 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
jQuery内容筛选选择器实例代码
2017/02/06 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
vue filters的使用详解
2018/06/11 Javascript
Python实现的一个自动售饮料程序代码分享
2014/08/25 Python
Python中分数的相关使用教程
2015/03/30 Python
Python tkinter事件高级用法实例
2018/01/31 Python
python爬虫爬取幽默笑话网站
2019/10/24 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
公认8个效率最高的爬虫框架
2020/07/28 Python
mac系统下安装pycharm、永久激活、中文汉化详细教程
2020/11/24 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
美国派对用品及装饰品网上商店:Shindigz
2016/07/30 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
元旦晚会主持词
2014/03/24 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
考试没考好检讨书
2015/05/06 职场文书
投资入股协议书
2016/03/22 职场文书
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
SQL注入的实现以及防范示例详解
2021/06/02 MySQL