组建MySQL集群的几种方案
组建MySQL集群的几种方案
LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)
DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂问题?)
MySQL Proxy(不够成熟与稳定?使用了Lua?是不是用了他做分表则可以不用更改客户端逻辑?)
MySQL Cluster (社区版不支持INNODB引擎?商用案例不足?)
MySQL + MHA (如果配上异步复制,似乎是不错的选择,又和问题?)
MySQL + MMM (似乎反映有很多问题,未实践过,谁能给个说法)
回答:
不管哪种方案都是有其场景限制 或说 规模限制,以及优缺点的。
1. 首先反对大家做读写分离,关于这方面的原因解释太多次数(增加技术复杂度、可能导致读到落后的数据等),只说一点:99.8%的业务场景没有必要做读写分离,只要做好数据库设计优化 和配置合适正确的主机即可。
2.Keepalived+MySQL --确实有脑裂的问题,还无法做到准确判断mysqld是否HANG的情况;
3.DRBD+Heartbeat+MySQL --同样有脑裂的问题,还无法做到准确判断mysqld是否HANG的情况,且DRDB是不需要的,增加反而会出问题;
3.MySQL Proxy -- 不错的项目,可惜官方半途夭折了,不建议用,无法高可用,是一个写分离;
4.MySQL Cluster -- 社区版本不支持NDB是错误的言论,商用案例确实不多,主要是跟其业务场景要求有关系、这几年发展有点乱不过现在已经上正规了、对网络要求高;
5.MySQL + MHA -- 可以解决脑裂的问题,需要的IP多,小集群是可以的,但是管理大的就麻烦,其次MySQL + MMM 的话且坑很多,有MHA就没必要采用MMM
建议:
1.若是双主复制的模式,不用做数据拆分,那么就可以选择MHA或 Keepalive 或 heartbeat
2.若是双主复制,还做了数据的拆分,则可以考虑采用Cobar;
3.若是双主复制+Slave,还做了数据的拆分,需要读写分类,可以考虑Amoeba;
上述所有的内容都要依据公司内部的业务场景、数据量、访问量、并发量、高可用的要求、DBA人群的数量等 综合权衡,若是需要可以联系我:jinguanding#http://hotpu.cn
链接:https://www.zhihu.com/question/21307639/answer/123316479
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
- 主从复制,包括一拖一的主从和一拖多的主从
高可用性 :比较高
高可扩展性 :无
高一致性 :比较高
延迟性 :比较小
并发性 :无
事务性 :无
吞吐率 :比较高
数据丢失 :不丢失
可切换 :可以切换
- 环形复制,包括两个节点和多个节点形成的环形
高可用性 :比较高
高可扩展性 :无
高一致性 :比较高
延迟性 :比较小
并发性 :无
事务性 :无
吞吐率 :比较高
数据丢失 :不丢失
可切换 :可以切换
- 2PC:
高可用性 : 很高
高可扩展性 : 可扩展,不能大规模扩展,也无需大规模扩展
高一致性 : 比较高
延迟性 : 比较大
并发性 : 比较小
事务性 : 有
吞吐率 : 比较小
数据丢失 : 不丢失
可切换 : 无关
- Paxos:元数据的高可用,并发度不高
高可用性 : 很高
高可扩展性 : 无关 可扩展,不能大规模扩展,也无需大规模扩展
高一致性 : 很高
延迟性 : 比较大
并发性 : 比较小
事务性 : 有
吞吐率 : 比较小
数据丢失 : 不丢失
可切换 : 无关
以上纯属个人理解,如有异议,也是没问题的;
另外按照master是否服务具体业务来分分布式可以分为两类:
- master管理系统,并且所有请求通过master,很明显master存在性能瓶颈
- master管理系统,实际请求不通过master,请求分散均匀了
肯定选方案2
基于这些方案的特点,如何设计一个牛逼滴分布式系统 ?
这里的牛逼包括
- 可大规模扩展:要求像hadoop那样,至少几百条台没问题
- 高可用:master需要高可用,节点也需要高可用,也就是说任何一个组件的一个实例或者部分实例挂了,都不会影响整个系统
- 高并发:普通机器单节点至少要支持几千的并发度吧,如果扩展解决了,整个系统的并发其实也扩展的
- 数据一致性:分布式系统,一致性可难了,尽量保证吧,比如主从同步实现一致 ,或者使用两阶段2pc同时写多个节点,或者使用像paxos一致性协议算法实现哈
- 事务性:分布式系统,绝对的事务很难吧,哎,我们就用2pc,3pc吧,尽量保证哈
- 自动切换 : 首先你得想自动切换的条件如何呢? 比如主从同步,主挂了,我可以自动切换到从,可是如果从数据和主不同步,但是业务要求很高,不允许这种情况出现,那也只好停服维护啦。
好了 你可以开始喷了 , 怎么可能。
paxos一致性协议,可用性很高,一致性很高,事务性很不错 , 那么涉及到各种服务都可以用他,非常好。
master和metadata元数据采用paxos一致性协议,所有节点也采用paxos一致性协议 , 客户端保持这些信息。架构如下所示 ,master, metadata, node 都实现了paxos协议,也即通过paxos接口访问
<img src="https://pic3.zhimg.com/50/v2-a937e63906ed893b25f1f8bc8ac3350a_hd.png" data-rawwidth="897" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="897" data-original="https://pic3.zhimg.com/v2-a937e63906ed893b25f1f8bc8ac3350a_r.png">
分布式数据库就是一个例子,貌似目前流行的数据库都还没有支持paxos协议的,有谁可以开发下。节点采用paxos的话,有个问题没想清楚,paxos如何sql结合使用?另外节点的性能会受一点影响。降低一点要求吧,节点采用主主复制,或者环形复制吧。master检查节点存活,并且做切换,通知客户端。
架构如下所示 ,master, metadata,实现了paxos协议,也即通过paxos接口访问;node的各个节点是复制关系,服务节点挂掉的时候,需要master检测,并且做切换处理。
如果是分布式系统,比如文件系统,或者自己开发的系统, 那节点可以考虑用paxos协议哦。 每个节点采用3个实例,或者你有资源,采用5个实例。
分布式数据库的sql实现
也是一个难点,即一个复杂的sql,如何实现?
•使用分库分表的思想实现数据存储
•使用mapred的思想实现sql计算
•将输入sql经过词法,语法,语义分析,集合表结构信息和数据分布信息,生成包含多个阶段(简称stage)的执行计划,这些阶段具有一定的依赖关系,形成多输入单输出的任务树;
•每个阶段包括两种sql,称为mapsql和redsql,另外每个阶段包括三个操作,map,数据洗牌和red;map和red分别执行mapsql和redsql;
子句的处理逻辑和处理顺序
:
1.union:分解每个子句,单独解析,形成平行关系
2.from:选择表,可以是选择多张表,也可是join的情况
3.join:from中如果包含join,就要考虑join的各种问题
4.where:单表,多表,join之后的where过滤条件
5.group:分组
6.select:选择的列
7.distinct:去掉重复的行
8.having:聚合之后的过滤
9.order:将结果排序
10.limit
offset:获取最终结果的某些记录
11.子查询:遇到子查询独立解析,跟上层建立依赖关系
连接,包括内连接,左连接,右连接,半连接,外连接
以如下sql为例:
某一注册时间范围内的用户的所有登录信息
select
t1.u_id,t1.u_name,t2.login_product
from tab_user_info t1 join
tab_login_info t2
on (t1.u_id=t2.u_id and
t1.u_reg_dt>=? and t1.u_reg_dt<=?)
生成的执行计划为:
由于是join,所有的表都要进行查询操作,并且为每张表打上自己的标签,具体实施的时候可以加个表名字字段,在所有存储节点上执行
select u_id,u_name from tab_user_info t where
u_reg_dt>=? and t1.u_reg_dt<=?
select u_id, login_product from tab_login_info t
执行完成之后,这种情况下由于需要按照u_id进行数据洗牌,考虑到u_id的唯一值比较多,所以各个存储节点上需要按照u_id进行划分,
例如有N个计算节点,那么按照(最大u_id-最小u_id)/N平均划分,将不同存储节点上的同一范围的u_id,划分到同一个计算节点上
然后在计算节点上执行如下操作
select
t1.u_id,t1.u_name,t2.login_product
from tab_user_info t1 join
tab_login_info t2
on (t1.u_id=t2.u_id)
关于分布式sql如何实现的问题,有很多未尽事宜。有兴趣的可以相互讨论。欢迎切磋
几点补充:
1.对于需要严格保证强一致的场合来说,至少在 MySQL 5.7 之前,DRBD 还是有意义的。5.7 据说能实现真同步复制,若真能实现,就不再需要 DRBD 了。
2.网络分区时的脑裂问题必须避免,应使用基于多数派的选举算法来推选 Master。方案很多,比如用 ZooKeeper、etcd、Consul 等进行服务选举,推选出 Master。
3.MHA 没深入了解过,但印象里其 Master(Arbiter)节点貌似有单点问题?没记错的话此节点用于完成 MySQL 的主节点选举工作,它自己不 HA 还是有隐患。
MySQL大型分布式集群1、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务,部署在不同的服务器上。集群是同一个业务,部署在多个服务器上。
2、着重对数据切分做了细致丰富的讲解,从数据切分的原理出发,一步一步深入理解数据的切分,通过深入理解各种切分策略来设计和优化我们的系统。这部分中我们还用到了数据库中间件和客户端组件来进行数据的切分,让广大网友能够对数据的切分从理论到实战都会有一个质的飞跃。
Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
组建MySQL集群的几种方案的更多相关文章
- MySQL集群的几种方案
组建MySQL集群的几种方案LVS+Keepalived+MySQL(有脑裂问题?但似乎很多人推荐这个)DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂 ...
- 京东分布式MySQL集群方案介绍
背景 数据库作为一个非常基础的系统,任何一家互联网公司都会使用,数据库产品也很多,有Oracle.SQL Server .MySQL.PostgeSQL.MariaDB等,像SQLServer/Ora ...
- 分布式MySQL集群方案的探索与思考
转载:http://www.infoq.com/cn/articles/exploration-of-distributed-mysql-cluster-scheme?utm_campaign=rig ...
- MySQL集群的可行方案
如果单MySQL的优化始终还是顶不住压力时,这个时候我们就必须考虑MySQL的高可用架构(很多同学也爱说成是MySQL集群)了,目前可行的方案有: 一.MySQL Cluster优势:可用性非常高,性 ...
- Galera Cluster——一种新型的高一致性MySQL集群架构
原文链接:https://www.sohu.com/a/147032902_505779,最近被分配定位mysql的问题,学习下. 1. 何谓Galera Cluster 何谓Galera Clust ...
- MySQL集群之五大常见的MySQL高可用方案(转)
1. 概述 我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面: 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中 ...
- 如何使用Heartbeat,组建一个高可用性的mysql集群
转了好多次帖子,其实就是为了使用heartbeat来搭建mysql集群,网上很多都是用make来生成RPM来安装,我也找了很多资料,mysql 自带的cluster用户不满意,只能再次vmware虚拟 ...
- 生产环境MySQL数据库集群MHA上线实施方案
生产环境MySQL数据库集群MHA上线实施方案 一.不停库操作 1.在所有节点安装MHAnode所需的perl模块(需要有安装epel源) yum install perl-DBD-MySQL -y ...
- MySQL集群方案收集
MySQL集群是一个需要时间才能磨得出的话题,不可能一下子就全部能掌握.由于整个方案结合LVS+Keepalived这种,更加的复杂. 下面是一些主流方案的收集: MySQL双主 + Keepaliv ...
随机推荐
- 解决sql语句中参数为空(null)不会更新参数的问题
用的mybatis自动生成的 情景: 修改页面中,修改某个字段,修改前有数据,修改后为空. mybatis中一般用到 如:(这种直接忽略为空的字段,不能更新空字段参数) <update id=& ...
- mybatis如何把session托管给spring
原生mybatis创建SqlSession的流程: SqlSession sqlSession = null; try { sqlSession = sqlSessionFactory.openSes ...
- P5445 [APIO2019]路灯
传送门· 对于询问 $(a,b)$ ,感觉一维很不好维护,考虑把询问看成平面上的一个点,坐标为 $(a,b)$ 每个坐标 $(x,y)$ 的值表示到当前 $x$ 和 $y$ 联通的时间和 考虑一个修改 ...
- ZeroAccess分析
来源:http://bbs.pediy.com/showthread.php?t=141124&highlight=ZeroAccess 总序这分成四个部分的系列文章,是一个完全的一步一步来分 ...
- Scrapy抓取jobbole数据
1.python版本3.6.1 2.python编辑器:JetBrains PyCharm 2.安装virtualenvwrapper-win pip3 install virtualenvwrapp ...
- 三、Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流
一.环境 1.开发环境:windows 2.开发工具:FFmpeg.nginx.nginx-rmtp-module (链接:https://pan.baidu.com/s/119d2GeMzddas_ ...
- Linux架构之Nginx 负载均衡会话保持
案例No.50:Nginx负载均衡会话保持 前期准备环境 web01.web02 (web01.web02.db01.nfs01都要优化基本源)[root@web01 ~]# vim /etc/yum ...
- MYSQL学习笔记——数据类型
mysql的数据类型可以分为三大类,分别是数值数据类型.字符串数据类型以及日期时间数据类型. 数值数据类型 ...
- #10042. 「一本通 2.1 练习 8」收集雪花 || 离散化 || 双指针法 || C++ || LOJ
题目:#10042. 「一本通 2.1 练习 8」收集雪花 看到网上没有这道题的题解,所以写一下. 要标记数字是否存在,看到x<=1e9,所以考虑用离散化,然后开一个last数组,last[i] ...
- [python 学习] random
1.random() 生成一个随机浮点数 import random # x 属于 [0,1) x = random.random() print x 2.uniform() 生成制定范围内的随机浮点 ...