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
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命令
在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>
同样在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节点重新启动时,会发现又重新连接到集群里了,而且每个数据节点的数据都是最新的。
