- MySQL重点概念介绍
- 分布式集群方案
- 主从节点复制
- 分库分表 mycat
- 读写分离
- 参数配置
- MySQL主节点
- MySQL从节点
- 实例讲演
- 分布式部署
- 性能演示
- 独立mysql对比
- 主从复制+读写分离
参考资料:
- 浅谈mysql集群
MySQL Replication 主从复制全方位解决方案 - 惨绿少年 - 博客园
- MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
https://www.cnblogs.com/fyc119/p/7529902.html
https://www.cnblogs.com/codehome/p/9356462.html
https://www.cnblogs.com/codehome/p/9356496.html
- MySQL主从复制与读写分离原理
https://www.cnblogs.com/KTblog/p/5122825.html
- Mysql 实现读写分离-Atlas中间件
https://blog.csdn.net/fd2025/article/details/80091343
- MySQL读写分离-架构MySQL- Proxy
https://www.cnblogs.com/nyxd/p/5382482.html
https://www.cnblogs.com/YingYue/p/7677814.html
mysql集群:
https://www.cnblogs.com/cuihongyu3503319/p/5835518.html
同步集群(mysql cluster) | 异步集群(mysql replication)主从复制 | |
结构: | (data + sql + mgm节点) | (master + slave) |
特点: | 1) 内存级别的,对硬件要求较低,但是对内存要求较大。换算比例为:1:1.1; | 1) 主从数据库异步数据; |
2) 数据同时放在几台服务器上,冗余较好; | 2) 数据放在几台服务器上,冗余一般; | |
3) 速度一般; | 3) 速度较快; | |
4) 建表需要声明为engine=ndbcluster | 4) 扩展性差; | |
5) 扩展性强; | 5) 无法实现高可用性和负载均衡(只能在程序级别实现读写分离,减轻对主数据库的压力); | |
6) 可以实现高可用性和负载均衡,实现对大型应用的支持; | 6) 配置和管理较差,可能会丢失数据; | |
7) 必须是特定的mysql版本,如:已经编译好的max版本; | ||
8) 配置和管理方便,不会丢失数据; |
MySQL Cluster(MySQL 集群) 初试:MySQL Cluster(MySQL 集群) 初试 | iMySQL | 老叶茶馆 - Oracle MySQL ACE Director,专注MySQL
所有的这些节点构成一个完成的MySQL集群体系。数据保存在“NDB存储服务器”的存储引擎中,表(结构)则保存在“MySQL服务器”中。应用程序通过“MySQL服务器”访问这些数据表,集群管理服务器通过管理工具(ndb_mgmd)来管理“NDB存储服务器”。
“NDB” 是一种“内存中”的存储引擎,它具有可用性高和数据一致性好的特点。
MySQL Cluster 能够使用多种故障切换和负载平衡选项配置NDB存储引擎,但在 Cluster 级别上的存储引擎上做这个最简单。MySQL Cluster的NDB存储引擎包含完整的数据集,仅取决于 Cluster本身内的其他数据。
目前,MySQL Cluster的 Cluster部分可独立于MySQL服务器进行配置。在MySQL Cluster中, Cluster的每个部分被视为1个节点。
管理(MGM)节点:这类节点的作用是管理MySQL Cluster内的其他节点,如提供配置数据、启动并停止节点、运行备份等。由于这类节点负责管理其他节点的配置,应在启动其他节点之前首先启动这类节点。MGM节点是用命令“ndb_mgmd”启动的。
数据节点:这类节点用于保存 Cluster的数据。数据节点的数目与副本的数目相关,是片段的倍数。例如,对于两个副本,每个副本有两个片段,那么就有4个数据节点。不过没有必要设置多个副本。数据节点是用命令“ndbd”启动的。
SQL节点:这是用来访问 Cluster数据的节点。对于MySQL Cluster,客户端节点是使用NDB Cluster存储引擎的传统MySQL服务器。通常,SQL节点是使用命令“mysqld –ndbcluster”启动的,或将“ndbcluster”添加到“my.cnf”后使用“mysqld”启动。
注释:在很多情况下,术语“节点”用于指计算机,但在讨论MySQL Cluster时,它表示的是进程。在单台计算机上可以有任意数目的节点,为此,我们采用术语“ Cluster主机”。
管理服务器(MGM节点)负责管理 Cluster配置文件和 Cluster日志。 Cluster中的每个节点从管理服务器检索配置数据,并请求确定管理服务器所在位置的方式。当数据节点内出现新的事件时,节点将关于这类事件的信息传输到管理服务器,然后,将这类信息写入 Cluster日志。
此外,可以有任意数目的 Cluster客户端进程或应用程序。它们分为两种类型:
标准MySQL客户端:对于MySQL Cluster,它们与标准的(非 Cluster类)MySQL没有区别。换句话讲,能够从用PHP、Perl、C、C++、Java、Python、Ruby等编写的现有MySQL应用程序访问MySQL Cluster。
管理客户端:这类客户端与管理服务器相连,并提供了启动和停止节点、启动和停止消息跟踪(仅调试版本)、显示节点版本和状态、启动和停止备份等的命令。
MySQL Cluster的节点、节点组、数据副本以及分区 (即NDB 数据引擎控制下的数据层如何工作)
数据节点Data Node:是一个ndbd进程,存储着一个数据副本,也是一个指到节点组中节点的分区的拷贝
节点组Node Group:一个节点组包含一个或多个数据节点,分区,或者副本。
节点组的数量在MySQL集群中通过节点数量和副本数量(NoOfReplicas参数)来反映确定
分区Partition:NDB一张表的一个数据分片,包含有一张表的一部分数据。一个集群分区存储的机制。一个集群中有多少节点则一个集群有多少个分区。每个节点都至少负责一个分区的数据内容。
一个分区是完全属于一个节点的,分区数据可以作为副本存在与组内其他节点,一个节点可以存储数个分区数据副本。
NDB和用户自定义分区:一般来说MySQL会自动进行数据分区,但是用户也可以自定义进行数据分区。自定义分区需要遵循以下主题:
1、只有数据库的键和线性键可以在生产环境中做分区。
2、使用ndbd的时候,最大分区的数量需要严格遵循公式8 * [number of node groups]
副本:一个分区数据拷贝。每个节点组中的节点都保存有一个数据副本。有时候也叫做分区副本。副本的数量与每个节点组中节点的数量相同,即每个节点都持有着整个节点组中的所有数据,自身作为所持分区的主要副本,作为其他分区的后备副本。在一个节点组中有一个节点可以运行则整个集群可以拥有一个完备的数据的拷贝可用。
若一个电脑上有多个ndbd节点,则会按照NdbdId的顺序来依次放入各个机器
节点组是隐含形成的。第一个节点组是由具有最低节点ID的数据节点集合,由下一个最低节点身份集合构成的下一个节点组,以此类推。举例来说,假设我们有4个数据节点并且NoOfReplicas设置为2.四个数据节点具有节点ID 2,3,4和5.然后,第一节点组由节点2和3形成,并且第二个节点组,按节点4和5.以这样的方式配置集群很重要:相同节点组中的节点不会放在同一台计算机上,因为单个硬件故障会导致整个集群发生故障。
如果没有提供节点ID,则数据节点的顺序将成为节点组的决定因素。无论是否进行显式分配,都可以在管理客户端的SHOW命令的输出中查看它们。
MySQL Replication(Master-Slave主从复制):
一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力这样的方案来进行部署与实施的。
发送复制事件到其它slave
当设置log_slave_updates时,你可以让slave扮演其它slave的master。此时,slave把SQL线程执行的事件写进行自己的二进制日志(binary log),然后,它的slave可以获取这些事件并执行它。如下:
3.5、复制过滤(Replication Filters)
复制过滤可以让你只复制服务器中的一部分数据,有两种复制过滤:在master上过滤二进制日志中的事件;在slave上过滤中继日志中的事件。如下:
数据库的分布式和主从的区别
主从(Master-Slave): 主从机器上安装mysql community(普通版)就可以。
主从并没有像集群那样分三种节点,只有主和从两种,而且主从之间是通过mysql的replication方式来保证数据的一致性。相对mysql cluster的数据同步方式来讲是异步的。
主从复制的过程中,若从数据库中出现其中一条数据同步失败(即relay log中的语句有其中一条写操作语句执行失败),则后面的数据无法继续同步(relay log中后面的写操作语句无法继续执行下去),必须得解决掉或跳过这个执行失败的语句(需要人为去操作),这样就不能保证所有的从数据库的数据一致了。而mysql cluster则不然,若其中只要有一个节点的写操作失败,则其他所有节点针对这一同步均会更新失败,以保证所有节点的数据一致性。
较为常见的Mysql读写分离分为以下两种:
1)基于程序代码内部实现
在代码中根据select 、insert进行路由分类,这类方法也是目前生产环境下应用最广泛的。优点是性能较好,因为程序在代码中实现,不需要增加额外的硬件开支,缺点是需要开发人员来实现,运维人员无从下手。Spring创建多个数据源,代码手动指定使用哪个数据源,做到读写分离。
2) 基于中间代理层实现
代理一般介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有以下代表性的程序。
- mysql_proxy。MySQL- Proxy是实现"读写分离(Read/Write Splitting)"的一个软件(MySQL官方提供 ,也叫中间件),实际上是在客户端请求与MySQLServer之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上。对于多节点Slave集群,也可以起做到负载均衡的效果。基本的原理是让主数据库处理写操作(insert、update、delete),而从数据库处理查询操作(select)。而数据库的一致性则通过主从复制来实现。所以说主从复制是读写分离的基础。,通过其自带的lua脚本进行sql判断。
- Atlas。是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
- 主要功能:
- 读写分离
- 从库负载均衡
- 自动分表
- IP过滤
- SQL语句黑白名单
- DBA可平滑上下线DB
- 自动摘除宕机的DB
- 主要功能:
- Amoeba。由阿里巴巴集团在职员工陈思儒使用序java语言进行开发,阿里巴巴集团将其用户生产环境下,但是他并不支持事物以及存储过程。
MySQL Proxy和 Amoeba区别:MySQL Proxy和 Amoeba 工作机制浅析_amoeba的轮询算法-CSDN博客
主要是针对数据切分方面。
在 mysql proxy 上面如果想要读写分离并且 读集群、写集群 机器比较多情况下,用mysql proxy 需要相当大的工作量,目前mysql proxy没有现成的 lua脚本。mysql proxy根本没有配置文件,lua脚本就是它的全部,当然可以是相当方便的。那么同样这种东西需要编写大量的lua脚本才能完成一个复杂的配置。amoeba目标是走产品化这条路。只需要进行相关的配置就可以满足需求。
Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy。它集中地响应应用的请求,依据用户事先设置的规则,将 SQL请求发送到特定的数据库上执行。基于此可以实现负载均衡、读写分离、高可用性等需求。与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单)。
Amoeba相当于一个SQL请求的路由器,目的是为负载均衡、读写分离、高可用性提供机制,而不是完全实现它们。用户需要结合使用MySQL的 Replication等机制来实现副本同步等功能。amoeba对底层数据库连接管理和路由实现也采用了可插拨的机制,第三方可以开发更高级的策略类来 替代作者的实现。这个程序总体上比较符合KISS原则的思想。
优势:
Amoeba主要解决以下问题:
a). 数据切分后复杂数据源整合
b). 提供数据切分规则并降低数据切分规则给数据库带来的影响
c). 降低数据库与客户端连接
d). 读写分离路由
不足:
a)、目前还不支持事务
b)、暂时不支持存储过程(近期会支持)
c)、不适合从amoeba导数据的场景或者对大数据量查询的query并不合适(比如一次请求返回10w以上甚至更多数据的场合)
d)、暂时不支持分库分表,amoeba目前只做到分数据库实例,每个被切分的节点需要保持库表结构一致:
MySQL HA解决方案的功能比较
方案 | MySQL Replication(MySQL复制) | MySQL Cluster(MySQL集群) |
结构: | (data + sql + mgm节点) | (master + slave) |
平台支持 | 所有MySQL服务器支持(MySQL :: Supported Platforms: MySQL Database) | 所有MySQL群集支持(MySQL :: Supported Platforms: MySQL NDB Cluster) |
自动IP故障转移 | 没有 | 取决于连接器和配置 |
自动数据库故障转移 | 没有 | 是 |
自动数据重新同步 | 没有 | 是 |
典型的故障转移时间 | 用户/脚本相关 | 1秒和更少 |
同步复制 | 不,异步和半同步 | 是 |
共享存储 | 不,分布式 | 不,分布式 |
地理冗余支持 | 是 | 是的,通过MySQL Replication |
在线更新架构 | 没有 | 是 |
可扩展性 | ||
节点数 | 一个主人,多个奴隶 | 255 |
内置负载平衡 | 通过MySQL Replication读取 | 是的,读写 |
支持读取密集型工作负载 | 是 | 是 |
支持写密集型工作负载 | 是的,通过应用程序级别分片 | 是的,通过自动分片 |
在线扩展(添加节点,重新分区等) | 没有 | 是 |
特点: | 1) 内存级别的,对硬件要求较低,但是对内存要求较大。 | 1) 主从数据库异步数据; |
2) 数据同时放在几台服务器上,冗余较好; | 2) 数据放在几台服务器上,冗余一般; | |
3) 速度一般; | 3) 速度较快; | |
4) 建表需要声明为engine=ndbcluster | 4) 扩展性差; | |
5) 扩展性强; | 5) 无法实现高可用性和负载均衡(只能在程序级别实现读写分离,减轻对主数据库的压力); | |
6) 可以实现高可用性和负载均衡,实现对大型应用的支持; | 6) 配置和管理较差,可能会丢失数据; | |
7) 必须是特定的mysql版本,如:已经编译好的max版本; | ||
8) 配置和管理方便,不会丢失数据; |