mysql单节点扩展为主从复制_高性能、高可用、可扩展的MySQL集群如何组建?

本文探讨了几种分布式系统设计方案,包括主从复制、环形复制和2PC协议,重点关注高可用性、可扩展性和一致性。提出了使用Paxos协议提升系统元数据的高可用性,并讨论了在主从复制和环形复制中的应用。同时,文章提到了分布式SQL的挑战,提出了基于分库分表和MapReduce思想的执行计划生成策略。最后,对于分布式系统的事务处理,提出了2PC和3PC协议的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先介绍几种方案主从复制,包括一拖一的主从和一拖多的主从

高可用性 :比较高

高可扩展性 :无

高一致性 :比较高

延迟性 :比较小

并发性 :无

事务性 :无

吞吐率 :比较高

数据丢失 :不丢失

可切换 :可以切换

环形复制,包括两个节点和多个节点形成的环形

高可用性 :比较高

高可扩展性 :无

高一致性 :比较高

延迟性 :比较小

并发性 :无

事务性 :无

吞吐率 :比较高

数据丢失 :不丢失

可切换 :可以切换

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接口访问

分布式数据库就是一个例子,貌似目前流行的数据库都还没有支持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如何实现的问题,有很多未尽事宜。有兴趣的可以相互讨论。欢迎切磋

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值