自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(32)
  • 收藏
  • 关注

原创 etcd备份恢复原理详解及踩坑实录

etcd备份恢复方案及原理介绍

2022-06-23 23:10:43 3647 1

原创 6.s081 Lec04 Page Table 文档翻译及课后总结

最近开始补一补基础,捡起了多次学习后又放弃的操作系统,学习6.s081课程,前三节课的内容都比较简单,就没做笔记了,从这节课开始内容和作业都比较硬核了,也认真看了课程文档并翻译,前前后后大概花了十天,翻译文档花了5天,看课程花了两天,作业花了三天,继续好好学英语,希望后面能提高速度。1. 课程总结页表的机制,非常简单了,书上八股文都背烂了,就是个数组,通过多级页表的方式减少内存开销页表是由内核维护的,即如何映射页面都是xv6的代码来控制的,但是最终使用页表寻址的MMU硬件,在RISC-V硬件中,通过

2022-05-26 23:58:57 509

原创 linux 部分内存监控及指标含义

linux内存监控指标

2022-05-05 22:34:59 389

原创 HBase源码阅读(三)如何定位region

上一篇文章中介绍了HTable中读写数据的逻辑,本篇介绍一下client如何在hbase集群中定位到需要的region。先介绍一下大致原理,1.2版本中的所有region布局信息被存放在meta表中,meta表永不分裂,仅有一个region,meta表的的位置被存放在zk中,所以client想要找到一个region的位置,需要先访问zk,找到meta表的位置,然后在meta表中查询到自己需要访问的region的信息。meta表中信息如下图所示(图片引用自《HBase原理与实践》):可以看到,meta表

2022-03-23 23:01:42 3041

原创 HBase源码阅读(二)客户端HTable读写流程

阅读代码基于hbase 1.2这周大致看了一下客户端的时候,及一些内部代码的实现,做个笔记,怕以后不怎么看客户端代码给忘掉了。客户端代码中会创建一个connection对象,然后通过connection对象来获取一个表对象HTable,通过HTable对象来进行数据的读写,主要分析一下Hbable中的代码。Put接口put接口可以一次put多条数据,也就是MultiPut功能,直接看这个函数的实现: public void put(final List<Put> puts) throw

2022-03-19 22:23:14 1737

原创 HBase源码阅读(一) balancer

最近开始搞hbase,大概看书感觉能明白架构,但是很多细节还是需要看代码才能明白,其中balancer模块是一个比较独立的模块,而且也是分布式系统中非常重要的模块,同时在我们自己的项目中也有调度相关的模块,看看hbase有无值得学习和借鉴的。不多逼逼,直接上代码。在HMaster的balancer()方法中会调用balancer,可以看到balancer会根据当前负载状态生成一个balance plan,但是具体对于plan的执行是由assignmentManager来负责的,这个模块代码先不讨论。//

2022-03-12 19:27:04 3348

原创 《Scaling Memcache at Facebook》阅读记录

整篇文章在今天看来没有太新的东西,不过在当时,能用不高的代价,来解决遇到的问题,就很棒。简单记录一些要点。背景是facebook请求太多,数据库处理不过来,所以需要用缓存来解决。但是集群太大,使用单机的memcache搞不定,facebook借助开源的memcache,实现了缓存集群。使用了缓存删除策略,即修改数据库数据时,将缓存中的对应key删除,不使用更新策略的原因是容易出现并发问题,导致缓存和数据库最终不一致。降低延迟,使用udp来实现读请求(不怕丢),使用tcp来实现数据修改请求。客户端

2022-02-24 23:59:52 302

原创 raft工程实践(snapshot与log compact)

工作中使用了raft用来做数据高可用,raft框架是使用百度开源的braft。1. 更有效的snapshot工作中使用了braft,数据状态机使用了rocksdb,是很常见的一种搭配形式。braft是定时会做一次snapshot,对于braft而言,snapshot就是将数据状态机中的全量数据backup一份到braft文件夹中管理起来,在follower需要时发送给远端,或者重启时使用。对于rocksdb而言将数据backup一份到其他文件夹中也非常方便,rocksdb会使用硬链接将当前的所有sst

2022-02-08 23:07:09 1211

原创 论文阅读《No compromises: distributed transactions with consistency, availability, and performance》

阅读思路:分布式事务的一个研究型系统(不是已经落地的工程实现)与spanner不同之处在与 spanner可以跨数据中心,论文中的FaRM系统只能在单数据中心,但是性能非常高。首先高性能的原因来自于两个不同的硬件:非易失性的DRAMRDMA(remote direct memory access)非易失性内存的意思大概是普通的DRAM外挂了电源,在机器断电的情况下,外挂电源会生效(但是可能仅能支持很短一段时间,也许是几分钟),在外挂电源生效时,进程会停止工作,将DRAM中的数据全部落盘,然后

2022-02-08 22:22:58 539

原创 使用systemtap模拟IO故障

最近需要做一些测试系统稳定性相关的工作,想要模拟一下IO抖动或者磁盘错误这样的故障,发现了systemtap这个工具,这个工具功能非常强大,不过具体原理没去了解,暂时没那么多时间,简单记录一下使用方法。先安装systemtapyum install systemtap使用之前需要安装对应的kernel-debuginfo包,直接用下面命令安装也行:stap-prep之后就可以使用systemtap了,在网上抄了一段来改了改,刚好够自己用:#!/usr/bin/stap# file: io

2022-01-18 21:53:21 1071

原创 理解分布式事务

1. 为什么需要分布式事务首先,复杂的业务场景是需要事务的,这是毋庸置疑的,至于需要分布式事务则可能是因为业务数据太多,进行了分库,或者newsql数据酷中对数据进行了shard,将数据存放在了不同的服务器上,对这些不属于同一进程或不属于同一台物理机的数据进行操作时,也希望可以支持事务功能,这就是分布式事务。2. 二阶段提交目前来讲,比较常见的分布式事务实现方式是二阶段提交。主要实现方式如下:从分布式集群中选择一个节点作为协调者客户端将本次事务请求发给协调者协调者收到请求后,在本地记录事务状态

2022-01-15 23:42:21 1349

原创 raft thesis阅读记录

之前读过一些raft工程源码,如etcd,braft,Dragonboat中都对进行了相应的工程优化,如并行落盘,batch,pipeline等,witness节点等,实现了一些小论文中没有详细描述的功能,leader变更,成员节点变更等。这些功能及优化在raft作者的博士论文《CONSENSUS: BRIDGING THEORY AND PRACTICE》中都有提及,近期阅读了其中部分段落,记录一下。1. transfer leaderleader节点的变更在工程中还是一个比较重要的功能。按照论文中所

2022-01-12 22:42:18 298

原创 如何理解Ture Time

如何理解True Time外部一致性是什么?为什么需要时钟?为什么True Time可以保证外部一致性?True time的理论非常简单,具体介绍可以参考spanner论文,或者这篇博客:http://yang.observer/2020/11/02/true-time/1. 外部一致性是什么?这个词好像只在spa

2022-01-07 20:40:00 625

原创 2021 再见

2021年的最后一天,早早的下班,独自一人在家,简单总结一下今年。1. 经历1.1 最后的学生生涯上半年是上学生涯的最后半年,完成了毕业论文,经历了一个顺利但不完全顺利的毕业答辩。告别了不喜欢的导师,离开了并不能做有意义的事情教研室,是一件值得高兴的事情。美中不足的是毕业后没有留下太多的时间休整,很匆忙的来到了北京,准备上班。作为一个不爱出门的人,第一次要去到几千公里外的城市长期生活,离开家的时候还是又一些忐忑的,不过很感谢有小Z陪着我一起。初到北京的感觉还是很不错的,没有想象中严重的空气污染,天

2021-12-31 22:08:47 360

原创 MIT 6.824-lab2 Raft

这个lab2属实麻烦,花了两天时间写代码,最后花了四天时间来debug才通过,debug的手段也很有限,基本只能通过看日志来发现代码中的逻辑问题,最终回顾写出来的代码还乱得不行,先做个简单的记录,以后如果还有时间来重构一下代码。1.Raftraft算法是一种分布式共识算法,相对于paxos算法而言更加简单容易理解(看起来简单,实现起来也挺不容易的)。raft的论文很多,也有很多中文版的,看一看很容易理解。raft中文版2. 实验要求本次实验分为A、B、C三个部分,将三个任务都实现就是一个完整的ra

2020-12-23 11:24:36 1437 1

原创 MIT 6.824-lab1

最近正在学习6.824的课程,准备一边学习一边跟着做课设。新版的课设都是使用go来完成的,所以花了一周多的时间学习了一下go语言的使用。相对于C++,用go来做课设确实方便不少,有各种现成rpc库,序列化与反序列化的库,实现lab时能够让从繁琐的网络通信和IO中解脱出来,更关注分布式交互本身的逻辑。直接切入正题1. mapreducelab1是让设计一个简单的mapreduce框架。做之前需要先看一看mapreduce的论文。mapreduce中文版看完论文会对mapreduce有个大概的了解,即这

2020-12-05 16:32:53 5381 6

原创 nginx数据结构之ngx_queue_t

对于redis,nginx这种使用C语言实现的项目,因为没有STL这种现成的容器可以使用,所以都需要重新封装容器。最近刚开始学习nginx,学习之前首先需要弄懂nginx中数据结构的实现。今天学习了第一个数据结构,ngx_queue_t,其实就是一个环形双向链表。不过nginx对于双向链表的实现真的把我秀翻了。1. ngx_queue_t的结构typedef struct ngx_queue...

2020-02-17 17:18:57 336

原创 C++11线程间同步方式

1.多线程的并发问题线程间为什么需要同步?直接来看一个例子:int a = 0;void foo(){ for (int i = 0; i < 10000000; ++i) { a += 1; }}int main(){ clock_t start, end; start = clock(); thread t1(foo); thread t2(foo); ...

2020-02-11 17:57:36 3642 1

原创 为什么IO复用还需要搭配非阻塞IO

当数据达到socket缓冲区时,可能会因为一些原因被内核丢弃,比如,校验和错误,这时IO复用唤醒线程对socket读并不能读到数据,如果是阻塞IO就会被阻塞住。这个达到缓冲区的数据不一定被丢弃,但是也有可能被别人取走了,比如多个进程accept同一个套接字时引发的惊群现象,只有一个连接到来,但是所有的监听进程都被唤醒了,但是最终只有一个进程可以accept到这个请求,其他进程在阻塞IO进程下都...

2019-12-19 20:36:15 494

原创 带有共享栈缓存的协程库

1.什么是协程在多线程和多进程的程序中,线程和进程的调度都是由操作系统完成的,用户没有办法确定其调度和执行的先后顺序,且在每次调度时需要转换到内核态,调度完成后再转回用户态,这是非常费时间的,更不用说多进程程序的调度还可能会造成缓存和TLB失效。协程(Coroutine)又叫作微线程,是一种比线程更加细粒度的调度单位。它的调度是完全由用户来决定的,换言之,不会在调度中陷入内核态,且什么时候进行...

2019-12-09 10:51:39 559

原创 C/C++实现redis分布式锁,与事务相比分布式锁有什么优势

redis分布式锁

2019-12-02 17:06:58 1885

原创 为什么Redis是单线程的还需要事务功能?为什么pipeline不能代替事务?

1.Redis有竞态问题吗Redis服务器是一个Reactor模型,即NIO+IO复用,通过IO复用获取有请求的对象,然后执行对应操作并将结果返回给对应客户端。且除redis虽然是多线程程序,但是其处理网络IO和执行客户端请求的只有一个线程,对于客户端而言是个单线程服务器。while(!quit){ clients=epoll_wait(); for(client c:clients)...

2019-11-22 22:01:29 2108

原创 一致性哈希原理及C++实现

一致性哈希通过哈希环实现KEY到对应Node的映射:具体算法过程为:先构造一个长为2^32的整数环,根据节点的Hash值将Node(服务器)分配到环的对应位置上,然后计算需要查询数据的键值KEY的哈希值,然后在哈希环上顺时针查询离这个KEY最近的服务器节点,完成映射。哈希环能够很好的进行负载均衡,而且具有很好的扩展性,如果一个服务器宕机或者需要添加新的服务器,大部分键值以前的映射关系不会改变...

2019-11-19 23:07:09 1342

原创 静态链接——重定位

在几年前第一次学C语言时,按照书上给的示例,在VC6.0中写了HelloWorld程序,然后按照书上的教程,进行编译,链接,最后执行程序,就能在输出窗口上看到Helloworld。对于一个用IDE写代码的人来说,代码需要编译链接才能生成可执行文件这是一个尝试,那么编译链接到底做了一个什么样的事情呢?因为我们写到C语言代码是高级程序语言,计算机是没法解析执行的,计算机能读懂的只能是二进制代码,编...

2019-11-16 17:28:11 1617

原创 "+="、"+"和append三种字符串拼接方法效率比较

常用的字符串拼接方式有三种,直接用"+“拼接后在赋给对应值,一个是”+=",还有一种是string中的append方法,那么这三种方法有什么区别,效率谁高谁低?先说结论:"+=“和append方法效率远远高于”+",因为"+“在每次拼接后会在内存中创建一个新对象,然后将拼接后的字符串赋值给新对象,频繁的创建对象与拷贝消耗了大量时间。而”+="和append每次直接在原字符串进行拼接,直到字符串c...

2019-11-12 20:19:16 4263

原创 线程特定数据(TSD)

直接上代码,做个笔记,不怎么常用,怕以后忘掉了:#include<pthread.h>#include<functional>#include<iostream>#include<unistd.h>#include<sys/syscall.h>using namespace std;typedef function<v...

2019-09-24 15:15:34 387

原创 C++条件变量实现多线程顺序打印

最近在学习多线程的网络编程,互斥量和条件变量是多线程编程中常用的线程同步方式。在编写自己的高并发服务器的过程中对互斥量和条件变量进行了封装,想要测试一下自己封装的类是否正确,能否通过自己封装的条件变量类顺利实现多线程顺序打印。条件变量先来简单的看一下条件变量的常用接口:int pthread_cond_init(pthread_cond_t *cond, const pthread_cond...

2019-06-30 15:05:43 1904 1

原创 csapp:shell lab

实验要求本次是要要求我们完成一个简单的shell程序。不过不是完成整个部分,只需要填充其中的部分函数即可。eval:读取指令并产生子进程执行。builtin_cmd:执行内置命令,bg、fg、quit、jobs。do_bgfg:处理fg和bg操作。waitfg:等待前台进程结束。‘sigint_handler:将SIGINT信号发给前台进程组。sigtstp_handler:将SIG...

2019-05-09 10:54:36 1511

原创 csapp:cache lab

这周开始看《深入理解计算机原理》的第六章。学习了局部性定理和高速缓存工作原理的相关知识。看完书后需要实践来巩固和加深理解。本次实验共分为两个部分,Part A是要求实现一个高速缓存模拟器,计算出高速缓存命中、未命中和驱逐的次数;Part B是要求使用分块的方法降低矩阵转置时的高速缓存miss次数。Part Alab文件夹中给了我们一个参考程序,首先来看看这个程序的运行效果:执行指令为:....

2019-04-29 23:31:29 1830

原创 一个简单静态web服务器

最近看完了apue中关于socket编程的部分,想要练习,就写了一个简单的静态web服务器。由于由于不了解http协议,通过参考其他博客简单学习了一下,在自己的web服务器中只实现了http协议中的 GET指令。代码#include<stdio.h>#include<string.h>#include<strings.h>#include<std...

2019-04-21 22:04:08 1041

原创 UNIX编程学习——cp、ls、pwd、who指令实现

cp指令在unix操作系统中,cp指令用于将源文件复制到目标文件。实现cp指令其实现原理较为简单,不断读取源文件内容,直到全部读取,并将读取字符不断写入到目标文件中。代码#include"apue.h"#include<fcntl.h>#include<unistd.h>#include<stdio.h>#define BUFFSIZE 409...

2019-03-31 20:12:06 647

原创 UNIX编程学习——more指令实现

more指令more指令是unix操作系统中的自带指令,其功能是将文件中的内容输出到终端上。相似功能的指令还有cat、less。cat:将文件中所有内容全部输出到终端上。more:将文件中的内容逐页显示到终端上,用户按空格键显示下一页,按b键退出,按回车键显示下一行。less:比more拥有更多的功能,可以实现向前翻页。实现more指令在实现more指令之前,需要搞清楚,more指令的...

2019-03-24 13:46:43 1653

空空如也

空空如也

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

TA关注的人

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