MySQL集群

MySQL集群的架构图:


优点:

a)99.999%的高可用性

b)快速的自动失效切换
c)灵活的分布式体系结构,没有单点故障
d)高吞吐量和低延迟
e)可扩展性强,支持在线扩容

缺点:

a)存在很多限制,比如:不支持外键
b)部署、管理、配置很复杂
c)占用磁盘空间大,内存大
d)备份和恢复不方便
e)重启的时候,数据节点将数据load到内存需要很长时间

管理节点:

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

数据节点:

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的存储节点就能实现整个数据库集群的冗余性和解决单点故障问题。

MySQL集群配置-Window

1.下载MySQL Cluster 7.4.12

 >>>下载图:


2.服务器配置

>>>需要5台服务器:1台配置管理节点、2台配置数据节点、2台配置SQL节点

>>>以下是我5台服务器的IP:

>>>管理节点:172.18.0.1

>>>管理节点:172.18.0.2

>>>管理节点:172.18.0.3

>>>管理节点:172.18.0.4

>>>管理节点:172.18.0.5

>>>在每台服务器上创建目录C:/mysql并将下载好的MySQL Cluster解压到里面


3.配置管理节点[172.18.0.1]
>>>在C:\mysql\bin下创建cluster-logs和config两个文件夹。
>>>cluster-logs:存储日志
>>>config:存储配置文件
>>>在config下创建my.ini和config.ini
>>>my.ini配置内容如下
[mysql_cluster] 
config-file=C:/mysql/bin/config/config.ini
>>>config.ini配置内容如下
[ndbd default] 
NoOfReplicas=2                     
DataDir=C:/mysql/bin/cluster-data       <span style="font-size: 18.144px; font-family: "Open Sans", Arial, Helvetica, sans-serif;">#配置数据节点数据存储的位置</span><span style="font-size: 18.144px; font-family: "Open Sans", Arial, Helvetica, sans-serif;">                                                                                                 </span>
DataMemory=80M                     
IndexMemory=18M  
                  
[ndb_mgmd] 
HostName=172.18.0.1      #管理节点      
DataDir=C:/mysql/bin/cluster-logs  #配置日志存放位置
[ndbd]   
HostName=172.18.0.2      <span style="font-size: 18.144px; font-family: "Open Sans", Arial, Helvetica, sans-serif;">#数据节点A </span>
   
[ndbd] 
HostName=172.18.0.3      <span style="font-size: 18.144px; font-family: "Open Sans", Arial, Helvetica, sans-serif;">#数据节点B </span>

[mysqld] 
HostName=172.18.0.4      #SQL节点A

[mysqld] 
HostName=172.18.0.5      #SQL节点B
4.配置数据节点[172.18.0.2][172.18.0.3]
>>>在c:\mysql\bin创建cluster-data文件夹,用来存储数据
5.不用配置SQL节点
6.启动集群
>>>Tips:如果服务器上装有MySQL必须关闭服务才能进行下一步
>>>在管理节点[172.18.0.1]的服务器上用管理员身份打开cmd运行如下代码打开服务
c:\mysql\bin\ndb_mgmd.exe --configdir=c:\mysql\bin\config --config-file=c:\mysql\bin\config\config.ini --ndb-nodeid=1 --reload –initial
>>>启动数据节点连接到管理节点
c:\mysql\bin\ndbd.exe --ndb-connectstring=172.18.0.1
> >>另一个数据节点同上
>>>启动SQL节点连接到管理节点
c:\mysql\bin\mysqld.exe --ndbcluster --ndb-connectstring=172.18.0.1 --console
>>>另一个SQL节点同上
>>>现在可以在管理节点所在的服务器上查询连接的数据节点和SQL节点信息
c:\mysql\bin\ndb_mgm
>>>打开后执行show命令

四、测试MySQL集群


1、在sql节点A建立数据库并插入数据:

在sql节点A的计算机上(172.18.0.4)的cmd中运行C:\mysql\bin\mysql.exe -u root -p命令登录mysql,接下来需要输入密码时,密码默认为空(直接回车)。

创建数据库并插入数据: 
—–创建名为”MySQL_Cluster_Test”的数据库:

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">create</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">database</span> MySQL_Cluster_Test;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

—–创建表”T_User”:

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">use MySQL_Cluster_Test;
<span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">create</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">table</span> T_User(Name <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">varchar</span>(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">32</span>),Age <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span>) engine=ndbcluster;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

注意建表语句后面一定要加上 engine=ndbcluster

—–插入数据:

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">insert</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">into</span> T_User <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">values</span>(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">'DannyHoo'</span>,<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">26</span>);</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

—–查询数据:

<code class="hljs sql has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-operator" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">select</span> * <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">from</span> T_User;</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

这里写图片描述

2、在sql节点B也可以查询到数据。

同样在sql节点B的计算机上(172.18.0.5)的cmd中运行C:\mysql\bin\mysql.exe -u root -p命令登录mysql。

执行 show databases; 命令可以查看到在sql节点A新建的数据库; 
执行use MySQL_Cluster_Test; 
    select * from T_User; 
可以查询到在sql节点A插入的数据。

这里写图片描述


到这里,整个集群的搭建和测试就完成了。假如一个数据节点宕机,并不会影响整个集群的运行,任何一个数据节点死掉甚至物理损坏都不用担心,因为每个数据节点保存的数据都是完整的一份数据(在你操作数据的时候,它早就自动为你把最新的数据备份到每一个数据节点上啦)。你可以测试一下,这时手动停止某个数据节点和sql节点,另外一个数据节点和sql节点还会正常运行。当你把停止的数据节点和sql节点重新启动时,会发现又重新连接到集群里了,而且每个数据节点的数据都是最新的。















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值