自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 资源 (1)
  • 问答 (4)
  • 收藏
  • 关注

原创 谷歌技术探究之Chubby

文章目录引言设计目标系统结构逻辑结构:目录与文件锁与sequencer事件与缓存总结引言这篇文章是在看了Chubby的论文以后将其上我认为的重点单独摘出来,然后加上我自己的一些理解,旨在希望想要了解Chubby的朋友对其能够有一个初步的认识,首先要确定的是我们学习这个东西所要学习的是设计思路,是对一些问题的解决方法,而不是如何使用,因为这东西是谷歌自研的,闭源。这也就是为什么平时AP的分布式锁...

2020-04-28 21:58:44 2355

原创 流处理系统

文章目录引言如何发送事件流流处理不可靠的时钟容错总结引言清楚数据的类型有助于我们设计一个性能更高,更有针对性的数据系统,比如在线系统,离线系统(批处理)。近实时系统(流处理)等等。比如说批处理系统,这显然就适合用户对实时性要求不高,而对于吞吐量邀请较高,且数据流可以分为多个数据块,比如生成索引,显然我们需要一整块的数据,然后经过一系列的处理可以生成一个索引。那么流处理系统呢,这就适合与用户对于...

2020-04-28 14:54:59 743

原创 夜来风雨声,MapReduce知多少?

引言正如DDIA上所说,MapReduce论文发表时从某种意义上来说其实并不新鲜.因为其策略很多都已经在大规模并行数据库上得到了实现,但是作为"三驾马车"之一的MapReduce与分布式文件系统的结合确使其的功能性大大提升.在了解MapReduce之前,我们首先需要了解批处理系统,这有助于我们理解MapReduce.批处理系统我们来看看百度百科上对于批处理系统的解释:批处理系统,又名批处...

2020-04-24 22:01:13 373

原创 试玩Hadoop之踩坑日记

引言今天本该是美好的一天,找不到JAVA_NAMEPermission denied (publickey,gssapi-keyex).Permission denied, please try again.错误。The authenticity of host 192.168.0.xxx can’t be established...

2020-04-23 23:15:55 422

原创 再识负载均衡

引言在上一篇文章<<如何选择合理的负载均衡算法>>中我介绍了负载均衡分为基于请求的负载均衡和基于数据的负载均衡,写下那篇文章的原因是因为在学习数据的分片的时候第一次认识到了选择合理负载均衡算法的条件,那篇文章也稍偏向于基于数据的负载均衡,说白了就是数据如何合理的分片,但随后我自己对于基于请求的负载均衡也并未深究.经过一段时间我发觉这个洞得补上,不然这个知识点可能很长时间我...

2020-04-21 23:14:06 301

原创 Raft算法: 集群成员变更问题

引言成员变更问题也是Raft非常重要的一部分,但却有些不好理解,在论文中第一次看到的时候确实是有些不知所云,而且机缘巧合的情况有看到了另一种方法,遂回头又整理了一下的思路,所以专门记录一篇文章,以帮助其他有相同疑问的朋友.问题描述Raft算法我们一直都假设节点数目是不变的,就算节点减少其实问题也不是很大,因为算法的安全性并未被破坏,但是当出现节点增加的时候就不一样了,可能因为出现网络分区的...

2020-04-20 19:34:58 1386 1

原创 Paxos算法概述与推导

文章目录引言问题描述算法描述算法推导Proposer生成提案Accpeter接收提案活锁multi-Paxosmulti-Paxos与Raft引言Paxos是一个经典的分布式共识算法,可以说在很长一段时间内都是分布式共识算法的代名词.在介绍Paxos算法之前我不得不介绍下它的作者,Leslie Lamport,此人是一个神牛,他的成果实在是数不胜数:lamport时间戳,描述了拜占庭问题的解决...

2020-04-19 23:23:45 1230

原创 如何选择合理的负载均衡算法

引言负载均衡是什么呢,我们首先来看看wiki对这个名词的解释:负载均衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。 使用带有负载均衡的多个服务器组件,取代单一的组件,可以通过冗余提高可靠性。负载均衡服务通常是由专用软件和硬件来完成。 ...

2020-04-15 22:59:31 1018

原创 2020年了还不知道结构化数据,非结构化数据,半结构化数据的区别吗?!!

引言在繁杂的计算机数据中我们可以把数据分为三类,即:结构化数据非结构化数据半结构化数据结构化数据这类数据其实其实就是数据之间满足某种关系,这里称其为结构化,而在关系型数据库中关系的实体就是表,所以这类数据一般我们使用关系型数据库进行管理.结构化数据首先依赖于建立一个数据模型,数据模型是指数据是怎么样被存储,处理和登录的, 他包括数据是怎么样被存储的,数据的格式以及其他的限制.非结...

2020-04-15 18:13:39 2157

转载 神一样的CAP理论如何应用到分布式中去

突然在刷博客的时候看到这篇文章,可以说帮助实在是巨大的,但是其原文访问量并不高,颇有一种这么好的文章被埋没的感觉,遂转载希望能够让更多的人能看到这篇文章,原文在这里SpringCloud(6)之CAP理论在微服务的运用文章目录引言一、CAP定理1.1一致性(Consistency)1.2 可用性(Availability)1.3分区容错性(Partition Tolerance)1.4分布式事务...

2020-04-13 23:22:42 337

原创 事务还不懂?这一篇文章就够了!详解从事务到分布式事务

引言参考:XA事务MySQL分布式XA事务全序与偏序关系MySQL XA官方文档MySQL XA中文文档

2020-04-12 17:29:07 827 2

原创 分布式互斥算法解析

文章目录引言集中式算法分布式算法基于请求的算法基于令牌的算法总结引言分布式系统中可能会出现多个节点访问一个资源或者同时执行一个给定的函数,这些资源或者函数一般成为临界资源(Critical Resource),有时这些 临界资源需要在同一时刻只有一个进程执行,这就是分布式互斥.保证任何给定时刻只允许一个进程或者给定的进程去执行临界区的算法称为互斥算法.传统的单机达到互斥的方法有互斥锁,条件变...

2020-04-09 16:48:30 2797

原创 构建可靠分布式系统的挑战

文章目录引言单机与分布式不可靠的网络检测故障同步与异步网络不可靠的时钟进程暂停分布式锁的问题更多严峻的问题拜占庭问题理论系统模型总结引言分布式系统的核心是构建可靠的系统,对于系统中可能出现的任何状况,我们都要保证满足用户的需求.但是现实是无比复杂的分布式系统相比与单机系统有着千奇百怪的错误,所以我们要对此做出一个悲观的假设,即:所有可能出现的错误一定会出错.单机与分布式单机上开发程序的时候...

2020-04-08 20:16:47 1032

原创 数据分区?分片?你不想了解吗?

引言为什么需要数据分区,在我们面临海量数据的时候,单个节点显然是无法承受所有数据的存储以及查询的,这个时候我们需要将数据拆分,这就是分区.它的定义是这样的,即:每一条数据只属于某一个特定的分区,这样每一个分区都可当做一个完整的数据库.虽然是这样,每个节点仍会存有副本以提高容错性,就类似于一个单主节点的复制.分区的目的在于提高可扩展性和性能.分区以后一个大数据集就可以分散在更多的机器中,这也使得...

2020-04-06 17:23:32 660

原创 节点间数据复制

参考:《数据密集型应用系统设计》笔记五:第五章 数据复制Amazon Dynamo论文中文版Amazon Dynamo论文解读 — 技术介绍(转载)

2020-04-05 18:00:50 1088

原创 Redis源码解析(0) 概述与总结

参考:[译] 解密Redis持久化

2020-04-04 14:51:43 831 2

原创 Redis源码解析(23) SCAN命令实现

文章目录引言基础用法介绍命令实现结论引言KEYS与SCAN的区别可以说是老生常谈的一个问题了,本来打算写一篇名为<<KEYS与SCAN区别>>的博客来阐述它们之间的关系,但在我完成了源码分析以后就发现完全没有那个必要了,KEYS本就没什么可说的地方,想来想去,上面那个存在在于幻想中的博客的究其本质其实就是<<SCAN如何实现?>>.所以便有了这篇...

2020-04-04 14:51:33 949 2

原创 Redis源码解析(22) 事务

文章目录引言基础数据结构MULTlEXECWATCH引言redis通过MULTl,EXEC,WATCH,DISCARD来实现事务.因为redis本身是一个单线程的服务器,所有的请求会在IO多路复用处变为串行请求,这其实意味着事务的隔离性是天然的,相比于关系型数据库中复杂的隔离性,redis中就显得尤为简洁.然后持久性又是由配置决定的.所以重点讨论的其实就是原子性和一致性.那么原子性是如何实...

2020-04-04 14:51:14 480

原创 Redis源码解析(21) 集群[4] 故障转移failover与slave迁移

文章目录引言failoverCLUSTER FAILOVERCLUSTERMSG_TYPE_MFSTARTCLUSTERMSG_FLAG0_PAUSEDslave迁移引言在redis集群中一般来说我们需要给每个负责至少一个槽位的主节点都配置从节点,因为主节点加入出现某些不可控情况宕机,它的槽上数据就没办法转移了,也就是说这几个槽现在是没有人负责的,这是整个集群就处于下线状态了.所以redis...

2020-04-04 14:50:06 1426

原创 Redis源码解析(20) 集群[3] 键的存储,重新分片与重定向

文章目录引言基础数据结构槽指派重新分片1. `CLUSTER SETSLOT IMPORTING `2. `CLUSTER SETSLOT MIGRATING `3. `CLUSTER GETKEYSINSLOT `4. `MIGRATE `5. `RESTORE-ASKING`7. `CLUSTER SETSLOT NODE `MOVED与ASK引言...

2020-04-04 14:49:54 914

原创 Redis源码解析(19) 集群[2] 主从复制,故障检测与故障转移

文章目录引言主从复制故障检测故障转移从节点请求投票主节点投票从节点接收投票更新配置引言在redis集群中只有所有的槽都有所属节点以后才会被标记为上线,也就是说如果哪怕只有一个槽没有被分配给集群的节点,那么这个集群都是下线的,因为就算有一个槽没有被分配,向集群中插入数据都是不安全的.而集群中一个节点一般都负责多个槽,如果出现宕机下线,那么整个集群都会下线,这是我们一定不希望看到的.所以在redi...

2020-04-04 14:49:35 895 1

原创 Redis源码解析(18) 集群[1]初始化,握手与心跳检测

引言所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定,高效的状态.Redis集群是Redis提供的分布式数据库方案.它允许在集群中添加从节点,且不需要sentinel就可以保证高可用,在主节点下线时不必使得集群整体下线就可以进行故障转移.使用哈希槽而不是一致性哈希来解决集群分布式缓存问题,使得我们可以向集群中插入一个新节点的时候不必进行不必要的数据迁移.使用Goss...

2020-04-04 14:49:21 962

原创 Redis源码解析(17) 哨兵机制[4] 故障转移

引言开始故障转移的前提是我们已经确定某个节点是要下线的了,但是此时可能不止我们一个sentinel节点这样认为,可能有很多节点都得到了这个结论.这里我们先确定故障转移需要一个sentinel成为leader,去向宕机的主服务器的从服务器中选出一个作为新的主服务器,sentinel作为其客户端,向这个升级的节点发送slave no one,向其他节点发送slave of,作为这个升级的主服务器的从...

2020-04-04 14:49:11 689

原创 Redis源码解析(16) 哨兵机制[3] 判断下线

文章目录引言sentinelHandleRedisInstancesentinelCheckSubjectivelyDownsentinelCheckObjectivelyDownsentinelAskMasterStateToOtherSentinelssentinelStartFailoverIfNeeded引言上一篇文章我们分析了如何使得sentinel在配置文件中只有主服务器节点的情况...

2020-04-04 14:48:59 866 1

原创 Redis源码解析(15) 哨兵机制[2] 信息同步与TILT模式

引言其实这里的副标题"信息同步"是有点混淆视听,这篇文章并不是将"一致性"这样一个问题.在我们使用redis提供的哨兵时,我们只需要在每一个哨兵的配置文件中写上它所要监控的主服务器地址即可,我们根本不必去关心其他sentinel节点和从服务器,它们会在sentinel集群的交互过程中自动交换信息,这篇文章要将的就是这样一个区间[初始化完成后,主服务器主观下线前],在这个区间中所有有关系的sent...

2020-04-04 14:48:32 1641

原创 Redis源码解析(14) 哨兵机制[1] 结构与初始化

文章目录引言结构与初始化初始化结构sentinelTimer引言sentinel(哨兵)是redis高可用的解决方案,它是一个由多个sentinel节点构成的一个分布式系统.可以监控理论上任意多个主节点以及其从服务器,而且我们在配置的时候也是非常简单,只需要指定sentinel监控的主服务器即可,不需要指定其他sentinel与从服务器,这些可以在运行后的信息交互中得出.其高可用性体现在sen...

2020-04-04 14:48:21 843

原创 Redis源码解析(13) 主从复制

文章目录引言源码解析replicationSetMasterconnectWithMastersyncWithMasterslaveTryPartialResynchronizationreadSyncBulkPayload引言主从复制是redis原生提供的一种建立一个辅助数据库,其数据与主服务器保证一定程度的数据一致性,可以水平扩展数据库的负载能力,容错,高可用,数据备份.基本的操作就是建立...

2020-04-04 14:48:04 974

原创 Redis源码解析(12) 命令执行过程

引言了解redis中命令的执行过程有助于我们更加清楚很多redis的子模块是什么时候执行的.简单来说命令的执行过程是这样的,首先它在网络框架中的读处理器中被调用,即readQueryFromClient,我们在读处理器得到了此次从客户端收到的信息,如果可以解析成正确的命令和参数且此时缓冲区内无空余,认为此次解析成功,然后根据key在命令字典中查找对应的回调函数,找到后执行命令,接着返回其应有的...

2020-04-04 14:47:34 790

原创 Redis源码解析(11) 内存淘汰策略

文章目录引言对redis内存淘汰策略的看法最大容量究竟是多少?源码解析部分freeMemoryIfNeededevictionPoolPopulatedictGetRandomKeys引言内存淘汰策略是在存储数据较多,内存不够用时及其必要的一种释放内存的策略,可以使得在大量数据到来的时候服务器不至于宕机.redis中内置了六种内存淘汰机制,实现的功能都是一样的,通过某种手段找到需要删除的键,然...

2020-04-04 14:47:23 901 10

原创 Redis源码解析(10) 网络框架

引言redis网络部分是一个单线程,事件驱动,基于reactor模式实现的网络框架.redis把所有的事件分为两类,文件事件与时间事件.文件事件其实就是套接字事件,也就是服务器accept了一个fd以后,这个fd上到来的事件.而时间事件我们可以简单的看为定时时间,redis中这里的实现很有意思,不同于以前看过的网络框架中定时时间采用事件驱动来保证执行,这里则是为IO multiplex指定一个...

2020-04-04 14:47:04 817

原创 Redis源码解析(9) RDB持久化

引言RDB是redis中的一种持久化方式,以二进制形式存储在文件中,且排列非常紧凑,这也意味着文件更小,我们可以更快的载入数据,但其也有坏处,就是及其容易丢失数据,.因为其会遵循配置文件中默认的配置X秒Y条数据的写入时会执行RDB,但未满足时便一直存在内存中,如果此时服务器宕机甚至断电,距上一次持久化到现在的数据都将丢失.因为其在持久化时会把所有的数据全部写入一个临时文件,然后改名,在后台执行时...

2020-04-04 14:46:51 479

原创 Redis源码解析(8) AOF持久化

文章目录引言AOF策略事件循环中的flush操作重写操作重写结束后主线程操作引言AOF持久化是为了弥补RDB持久化中数据丢失的不可控性和在执行RDB时消耗的大量资源(需要把所有数据库的所有键值都拷贝到RDB文件中)而存在的一种持久化.AOF非常类似与MySQL中的redo日志,它们都是记录每条使得服务器状态做出改变的命令,以顺序IO插入到AOF文件(mysql中当然不是这个)中.AOF策略...

2020-04-04 14:46:39 776

原创 Redis源码解析(7) 发布订阅机制

void notifyKeyspaceEvent(int type, char *event, robj *key, int dbid) { sds chan; robj *chanobj, *eventobj; int len = -1; char buf[24]; /* If notifications for this class of events...

2020-04-04 14:46:14 583

原创 Redis源码解析(6) 键的过期处理策略

惰性删除//在数据库中获取某个键的过期时间long long getExpire(redisDb *db, robj *key) { dictEntry *de; //储存字典中返回的项 /* No expire? return ASAP */ // 在expire字典中获取键的过期时间 // 如果过期时间不存在,那么直接返回 if (dictSiz...

2020-04-04 14:45:59 640

原创 Redis源码解析(5) 压缩列表

引言压缩列表是在列表中元素较少的时候作为列表和哈希键的底层实现之一,它最大程度的节省了内存,但却增加的各种操作的时间复杂度,在元素较少的时候是一种优秀的数据结构,因为此时的操作带来的时间损耗是可以忽略不计的.压缩列表确实是一种神奇的数据结构,每一项的大小都不相同,且不使用指针却能把所有的数据巧妙的连接起来.但因为其操作时间复杂度的原因,它的适用场景实在是不多,redis这样对内存要求及其严格的...

2020-04-04 14:45:43 434 1

原创 Redis源码解析(4) 整数集合

引言整数集合是集合键的底层实现之一,它其中提供了"升级"机制来节省内存,但带来的是当升级时要进行的O(N)的拷贝.它只运用在集合都是整数且数量不多的时候,整数不必多说,数量不多是因为其插入的复杂度是O(N),当数据多了以后是巨慢无比的.typedef struct intset { // 编码方式 uint32_t encoding; //初始编码为INTSET_EN...

2020-04-04 14:45:23 497

原创 Redis源码解析(3) 跳跃表

引言跳跃表是一个非常实用的数据结构,有趋近于红黑树的效率,却比红黑树简单的多.Redis中用跳跃表来作为有序set的数据结构之一,在集群中也有使用,确实是我们应该掌握的一种数据结构.redis中跳跃表的实现也是非常的经典,且十分易懂,不管从什么角度来说,于我们而言确实都是很值得学习的.我们首先来看看基础的数据结构typedef struct zskiplistNode { // 成...

2020-04-04 14:45:10 530

原创 Redis源码解析(2) 字典与迭代器

引言字典这个结构是redis中非常重要的一种结构,其不仅可以作为数据库的结构,还可以作为哈希表的结构,是一个非常重要的数据结构,这篇文章先列出其中重要的数据结构,然后重点分析dictAdd,由此推出扩容策略与渐进式rehash.//哈希表结点typedef struct dictEntry { // 键 用于哈希冲突的时候进行比较 void *key; ...

2020-04-04 14:44:57 865

原创 Redis源码解析(1) 动态字符串与链表

Redis源码解析:01简单动态字符串SDSRedis源码解析:02链表

2020-04-04 14:44:38 860

GCC 10.2 2020年7月23日发布

外网上下的太慢,直接来这里取果实就好。ps:开源软件,收钱违法 虽然官网上说这个版本已经支持了C++20的部分特性,比如Coroutinue,Concept,飞船运算符等,但经过我的测试发现其实并没有支持,换句话来说编译C++20代码失败了,可能是我哪里操作有问题,大家使用以后也欢迎给出自己的想法。

2020-10-01

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除