组建MySQL集群的几种方案
LVS+Keepalived+MySQL(有脑裂问题?但彷佛不少人推荐这个)
DRBD+Heartbeat+MySQL(有一台机器空余?Heartbeat切换时间较长?有脑裂问题?)
MySQL Proxy(不够成熟与稳定?使用了Lua?是否是用了他作分表则能够不用更改客户端逻辑?)
MySQL Cluster (社区版不支持INNODB引擎?商用案例不足?)
MySQL + MHA (若是配上异步复制,彷佛是不错的选择,又和问题?)
MySQL + MMM (彷佛反映有不少问题,未实践过,谁能给个说法)node
回答:mysql
无论哪一种方案都是有其场景限制 或说 规模限制,以及优缺点的。算法
1. 首先反对你们作读写分离,关于这方面的缘由解释太屡次数(增长技术复杂度、可能致使读到落后的数据等),只说一点:99.8%的业务场景没有必要作读写分离,只要作好数据库设计优化 和配置合适正确的主机便可。sql
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;并发
高可用性 :比较高
高可扩展性 :无
高一致性 :比较高
延迟性 :比较小
并发性 :无
事务性 :无
吞吐率 :比较高
数据丢失 :不丢失
可切换 :能够切换
高可用性 :比较高
高可扩展性 :无
高一致性 :比较高
延迟性 :比较小
并发性 :无
事务性 :无
吞吐率 :比较高
数据丢失 :不丢失
可切换 :能够切换
高可用性 : 很高
高可扩展性 : 可扩展,不能大规模扩展,也无需大规模扩展
高一致性 : 比较高
延迟性 : 比较大
并发性 : 比较小
事务性 : 有
吞吐率 : 比较小
数据丢失 : 不丢失
可切换 : 无关
高可用性 : 很高
高可扩展性 : 无关 可扩展,不能大规模扩展,也无需大规模扩展
高一致性 : 很高
延迟性 : 比较大
并发性 : 比较小
事务性 : 有
吞吐率 : 比较小
数据丢失 : 不丢失
可切换 : 无关
以上纯属我的理解,若有异议,也是没问题的;
另外按照master是否服务具体业务来分分布式能够分为两类:
基于这些方案的特色,如何设计一个牛逼滴分布式系统 ?
这里的牛逼包括
好了 你能够开始喷了 , 怎么可能。
paxos一致性协议,可用性很高,一致性很高,事务性很不错 , 那么涉及到各类服务均可以用他,很是好。
master和metadata元数据采用paxos一致性协议,全部节点也采用paxos一致性协议 , 客户端保持这些信息。架构以下所示 ,master, metadata, node 都实现了paxos协议,也即经过paxos接口访问
分布式数据库就是一个例子,貌似目前流行的数据库都尚未支持paxos协议的,有谁能够开发下。节点采用paxos的话,有个问题没想清楚,paxos如何sql结合使用?另外节点的性能会受一点影响。下降一点要求吧,节点采用主主复制,或者环形复制吧。master检查节点存活,而且作切换,通知客户端。
架构以下所示 ,master, metadata,实现了paxos协议,也即经过paxos接口访问;node的各个节点是复制关系,服务节点挂掉的时候,须要master检测,而且作切换处理。
若是是分布式系统,好比文件系统,或者本身开发的系统, 那节点能够考虑用paxos协议哦。 每一个节点采用3个实例,或者你有资源,采用5个实例。
分布式数据库的sql实现
也是一个难点,即一个复杂的sql,如何实现?
子句的处理逻辑和处理顺序 :
链接,包括内链接,左链接,右链接,半链接,外链接
以以下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大型分布式集群一、主要解决针对大型网站架构中持久化部分中,大量数据存储以及高并发访问所带来是数据读写问题。分布式是将一个业务拆分为多个子业务,部署在不一样的服务器上。集群是同一个业务,部署在多个服务器上。
二、着重对数据切分作了细致丰富的讲解,从数据切分的原理出发,一步一步深刻理解数据的切分,经过深刻理解各类切分策略来设计和优化咱们的系统。这部分中咱们还用到了数据库中间件和客户端组件来进行数据的切分,让广大网友可以对数据的切分从理论到实战都会有一个质的飞跃。