自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhougb3的博客

It's been kind of tough, but tough people last.

  • 博客(179)
  • 问答 (5)
  • 收藏
  • 关注

原创 分布式系统学习(五)异地多活高可用

目的:避免机房级别的故障导致服务不可用保持无限扩展的能力,机器数量不受限于单机房容量用户就近接入,全球化部署设计原理异地多活是个AP方案,在一定程度上舍弃了一致性只保证核心业务实现异地多活,并不是所有业务都可以实现异地多活(比如注册不做异地多活,登录可实现异地多活)遇到的挑战及问题路由实现让特定用户访问特定的机房,尽量避免跨机房调用机房故障切换数据不一致问题解决在发生机房级别的failover时,如果目标机房的状态没有和故障机房完全同步,且同步的消息丢失,没有同步的状态就会丢失

2020-05-23 01:34:11 549

原创 分布式系统学习(四)CAP理论与一致性协议

CAP 定理是分布式系统设计中最基础,也是最为关键的理论。它指出,分布式数据存储不可能同时满足以下三个条件。一致性(Consistency):每次读取要么获得最近写入的数据,要么获得一个错误。可用性(Availability):每次请求都能获得一个(非错误)响应,但不保证返回的是最新写入的数据。分区容忍(Partition tolerance):尽管任意数量的消息被节点间的网络丢失(或延迟),系统仍继续运行。这里的可用性指的是所有节点可用当系统进入分区模式之后,有两种选择:选

2020-05-23 00:10:33 336

原创 分布式系统学习(三)一致性模型

目的:一致性模型本质上是进程与数据存储的约定:如果进程遵循某些规则,那么进程对数据的读写操作都是可预期的。这里的进程指的是业务进程,数据存储指的是数据库服务(这个服务可能是个分布式服务)强一致性模型能够保证所有进程对数据的读写顺序都保持一致的一致性模型称为强一致性模型线性一致性模型在线性一致性模型中,进程对一个数据项的读操作,它期待数据存储返回的是该数据在最后一次写操作之后的结果。从表面上看,这是一个很正常符合逻辑的现象,但在分布式系统(数据存储)中确是没办法做到的。由于缺少一个全局的物理时钟

2020-05-20 00:41:13 543

原创 wireshark 抓包实践记录

背景一个业务服务访问Redis机器总是偶发超时,业务访问量并不大,需要排查一下是在链路的哪个部分耗时过长或者丢包了过程在业务服务器和Redis服务器分别进行抓包,指定抓的是往Redis服务进程端口的包对抓包结果执行过滤:tcp.flags.reset==1 (reset表示连接异常终止)过滤完之后确实发现有部分连接异常终止了,过滤获得其中的某个端口:tcp.port=36376发现该端口在一次发包之后等待200ms都没有收到Redis服务器的回包,导致超时应用层关闭连接,发送了FIN包给Redi

2020-05-18 22:59:51 455

原创 分布式系统学习(二)物理时钟同步

目的:让一个互联网公司内部遍布世界各地的服务器保持同一个物理时间,时间误差控制在毫秒级别里面是最好的背景:时间概念世界时:地球自转为基础的时间计量系统,不是一种均匀的时间系统原子时:以物质的原子内部发射的电磁振荡频率为基准的时间计量系统。原子时规定1958年1月1日世界时为0时,秒长定义为铯-133原子基态的两个超精细能级间在零磁场下跃迁辐射9192631770周所持续的时间,是一种较恒定的时间系统。协调时:以原子时秒长为基础,在时刻上尽可能接近于世界时的时间计量系统。为了保持世界协调时与世界

2020-05-18 00:57:44 969

原创 分布式系统学习(一)逻辑时钟与向量时钟

目的:由于分布式系统中各个机器之间的系统时间同步差异,导致无法用物理时钟准确衡量事件的先后顺序。因此,提出了逻辑时钟这一概念,用来定义分布式系统中所有事件的发生顺序背景偏序与全序关系,这在大学的线性代数课程中有相关概念。简单的讲,对于一个数字集合,如果能够定义两两之间的先后关系,则该集合为全序关系。如果该集合中分为多个子集,子集内部两两有先后关系,而子集之间没有先后关系,则该集合为偏序关系。逻辑时钟如上图所示,根据逻辑时钟的原理,我们可以定义这些事件集的一个偏序关系。在这个偏序集中,存在因果关系

2020-05-18 00:16:22 1541

原创 《Elasticsearch: 权威指南》阅读笔记

原文:Elasticsearch: 权威指南技术上来说,一个主分片最大能够存储 Integer.MAX_VALUE - 128 个文档,但是实际最大值还需要参考你的使用场景:包括你使用的硬件, 文档的大小和复杂程度,索引和查询文档的方式以及你期望的响应时长。索引在默认情况下会被分配5个主分片如果你的数据没有自然的 ID, Elasticsearch 可以帮我们自动生成 ID 。 请求的结构...

2020-04-19 17:41:50 169

原创 定时任务(延时事件)处理(二)持久化定时任务

上篇讲到的定时任务管理都只局限于本进程内,一旦进程重启所有的定时任务也都会被取消。在很多的业务场景下,我们需要将定时任务持久化,即使服务重启定时任务依然有效。因此,我们需要实现一个专门的定时任务服务。实现的功能:生产者写入一个延时事件,在指定延时时间之后,消费者能够消费到该事件支持删除延时事件,这与mq不同,延时事件在很多场景下是需要支持删除的支持重试,事件通知处理失败之后,能够在n秒后...

2020-04-19 17:05:48 1016

原创 定时任务(延时事件)处理(一)Linux定时器接口与管理

Linux常用的时间相关函数获取当前时间:time(0) ------ time_t ------ 秒gettimeofday ------ timeval ------ 微妙可以认为这两个函数都是线程安全的,获取到的时间戳是不包括闰秒的获取当地时间:localtime_r函数,_r后缀是线程安全的定时器相关函数timerfd_create timerfd_g...

2020-04-05 22:59:51 477

原创 Brpc源码浅析(四)WorkStealingQueue类实现

源码路径work_stealing_queue.h原理简析申请一块连续内存数组作为队列,本地工作线程往队列尾部push和pop队列数据,其余竞争线程往队列首部steal队列数据,一首一尾,可以减少竞争。队列使用lock free技术实现实现类的数据成员: butil::atomic<size_t> _bottom; //指向队列的尾部 size_t _capa...

2020-03-08 22:44:17 682

原创 Brpc源码浅析(三)C++11 原子操作 内存模型 内存屏障

关于C++11原子操作相关的知识,着实有点晦涩难懂,但这又是看懂Brpc源码必备的知识点之一。在网上查找了很多前人关于这块的解读文章,不同文章之间的解读确有些许出入。本文仅对自己了解和认可的部分做解释和梳理,形成自己的理解。日后发现有错误不足的地方,再做修正补充。一. 原子性,可见性,内存序的区分我们以一个最简单的语句x.store(1, memory_order_relaxed);为例,这条...

2020-03-08 19:39:11 1122

原创 进程CPU占比高问题排查命令

top命令查看CPU占比,发现服务占据的CPU接近100%,即基本占据了一整个核心top -c命令可以看到更完整的信息,输入大写P,top的输出会按使用cpu多少排序,此时我们可以看到进程的PID命令:top -Hp 进程号。 同样输入大写P,top的输出会按使用cpu多少排序。由此可以找到耗CPU的线程输入pstack 进程号,并搜索线程号对应的堆栈,可以用来帮助排查问题如果整个系统...

2020-03-05 21:30:09 1300

原创 Brpc源码浅析(二)无锁双缓存实现

源码与官方文档路径doubly_buffered_data.h(420行代码)lalb.md适用场景适用于读多写少的场景,并且写不需要休眠去等待,能够支持实时的写。同时读之间没有竞争,将读的竞争尽可能转移到写上实现原理数据分前台和后台。读拿到自己所在线程的thread-local锁,执行查询逻辑后释放锁。同时只有一个写:修改后台数据,切换前后台,挨个获得所有thread-loca...

2020-03-01 17:18:22 826

原创 Brpc源码浅析(一)Flatmap实现

源码与官方文档路径flat_map.h(486行代码)flat_map_inl.h(657行代码)flatmap.md原理简析如图所示,flatmap使用的是开链哈希。使用时先申请一块N*sizeof(Bucket)大小的连续虚拟内存。Bucket本身会存储value值,因此当哈希算法足够优秀时(即不会有拉链或很短的拉链),可以实现接近原生数组的查找性能。数组大小的选取有两种方式:...

2020-02-29 23:00:53 2780

原创 Linux内核设计与实现

第一章 Linux内核简介Unix仅仅提供几百个系统调用,并且有非常明确的设计目的在Unix中,所有的东西都被当做文件对待通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序和网络,进程间通信等系统服务程序共同组成。当一个程序执行一条系统调用时, 我们说内核正在代其执行。如果进一步解释,在这种情况下,应用程序被称为通过...

2020-01-18 23:06:49 629

原创 《程序员的自我修养》第三部分 装载与动态链接

第六章 可执行文件的装载与进程32位平台下,进程的虚拟地址空间为4GB,其中有1GB的空间为内核空间(用于内核代码执行和内核数据存储)32位CPU,程序使用的虚拟空间不能超过4GB,因为32位的CPU只能使用32位的指针,最大寻址范围为4GB。32位CPU,程序使用的真实物理空间可以超过32GB,因为地址线可以扩展成36位地址线,可以访问到更多的物理内存。(PAE:物理地址扩展)一个进程要...

2019-04-07 13:10:25 245

原创 orm.NewOrm() 函数参数传递(GO语言接口初学)

之前简单地刷了一遍GO的基础语法知识,就开始学习用beego做后台开发了。在使用beego的ORM模型时,由于要使用到事务操作,需要作用于同一个orm对象,而不同的数据库操作我封装在了不同的model文件里面了。因此,就需要将同个orm对象在不同函数之间做传递了。这种一个事务操作需要调用不同函数去做不同的数据库的操作的作法我也不知道设计对不对。首先要保证同个orm对象,第一想法就是按指针传递就好...

2018-11-23 21:40:43 2710

原创 vue GO 学习资料 汇总

vue官方教程vue-router教程vue-axios教程vue-axios官方教程慕课网教程知乎教程一个实战项目

2018-11-16 14:03:48 338

原创 理解Linux进程,进程组,会话(nohup与守护进程)

进程三种进程:普通进程:默认情况下,进程是在前台运行的,这时就把shell给占据了,我们无法进行其它操作。后台进程:对于那些没有交互的进程,很多时候,我们希望将其在后台启动,可以在启动参数的时候加一个’&amp;amp;'实现这个目的。(切换到后台的进程称为job)(当连接终端的网络出现问题,那么也会导致运行程序中断)守护进程:如果一个进程永远都是以后台方式启动,并且不能受到Shell退出影响而...

2018-11-09 17:11:28 700

原创 《Lighttpd源码分析》读书笔记

C10k问题:网络服务程序在处理的客户端连接数达到上万时,往往会出现效率低下甚至完全瘫痪的问题。C10K 问题的最大特点是设计不够良好的程序,其性能和连接数及机器性能的关系往往是非线性的(性能增加一倍,连接数没办法增加一倍)。源码下载:Lighttpd1.4.20,下载完成后src目录下的137个文件即为源文件。源码分析工具:source insight 或 source navigator(...

2018-11-09 15:30:26 1463

原创 《Nginx高性能web服务器详解》读书笔记

Nginx初探Nginx是一款免费开源的高性能HTTP服务器及反向代理服务器,也可以作为邮件服务器。他的官网是nginx官网以及wiki官网nginx源码下载地址:Nginx版本库Nginx服务器的安装部署...

2018-11-05 15:57:07 1227

原创 《鸟哥的Linux私房菜》重学笔记(八)

第十六章 程序管理与selinux初探在 Linux 系統當中:『觸發任何一個事件時,系統都會將他定義成為一個程序,並且給予這個程序一個 ID ,稱為 PID,同時依據啟發這個程序的使用者與相關屬性關係,給予這個 PID 一組有效的權限設定。』 從此以後,這個 PID 能夠在系統上面進行的動作,就與這個 PID 的權限有關了!使用 &amp; 直接將指令丟到背景中执行,再使用资料流重导向就输...

2018-11-05 15:12:52 160

原创 《鸟哥的Linux私房菜》重学笔记(七)

正規表示法基本上是一種『表示法』, 只要工具程式支援這種表示法,那麼該工具程式就可以用來作為正規表示法的字串處理之用。 例如 vi, grep, awk ,sed 等等工具,因為她們有支援正規表示法, 所以,這些工具就可以使用正規表示法的特殊字元來進行字串的處理。但例如 cp, ls 等指令並未支援正規表示法, 所以就只能使用 bash 自己本身的萬用字元而已。[dmtsai@study ~...

2018-11-05 12:44:15 222

原创 《Linux内核设计与实现》 读书笔记

linux内核简介Linux系统的基础是内核,C库(库函数里会有些系统调用),工具集和系统的基本工具。通常一个内核由负责响应中断的中断服务程序,负责管理多个进程从而分享处理器时间的调度程序,负责管理进程地址空间的内存管理程序,和网络、进程间通信等系统服务程序共同组成。当硬件设备想要跟系统通信的时候,首先要发出一个异步的中断信号去打断处理器的执行,继而打断内核的执行。为了保证中断服务程序能够...

2018-11-04 12:10:29 4688

原创 《Linux高性能服务器编程》 读书笔记

第一章 TCP/IP协议族数据链路层可以看成是一个网卡驱动,为上层提供了一个统一的接口。Telnet协议是一种远程登录协议,它使得我们能在本地完成远程任务。第二章 IP协议详解第三章 TCP协议详解...

2018-11-02 16:03:53 5766

原创 技术书籍

打算从今天起,将自己看的书的书名都记录在这里,方便日后回顾之用。语言《GO Web编程》系统《Docker — 从入门到实践》《鳥哥的 Linux 私房菜》网络《Linux高性能服务器编程》《Linux多线程服务端编程:使用muduo C++网络库》...

2018-10-30 15:12:51 244

原创 《鸟哥的Linux私房菜》重学笔记(五)Bash与Shell scripts

認識 BASH 這個 Shell其實殼程式的功能只是提供使用者操作系統的一個介面,因此這個殼程式需要可以呼叫其他軟體才好。 我們在第四章到第九章提到過很多指令,包括 man, chmod, chown, vi, fdisk, mkfs 等等指令,這些指令都是獨立的應用程式, 但是我們可以透過殼程式 (就是指令列模式) 來操作這些應用程式,讓這些應用程式呼叫核心來運作所需的工作哩!只要能夠操作應...

2018-10-29 10:58:21 208

原创 《Docker — 从入门到实践》读书笔记

简述本笔记来源于电子书:Docker — 从入门到实践docker版本变化Docker从1.13版本之后采用时间线的方式作为版本号,分为社区版CE和企业版EE。社区版是免费提供给个人开发者和小型团体使用的,企业版会提供额外的收费服务,比如经过官方测试认证过的基础设施、容器、插件等。社区版按照stable和edge两种方式发布,每个季度更新stable版本,如17.06,17....

2018-10-22 15:13:01 369

原创 《GO Web 编程》 Web基础

Web基础URL的格式:schema://host[:port#]/path/.../[?query-string][#anchor]scheme 指定低层使用的协议(例如:http, https, ftp)host HTTP服务器的IP地址或者域名port# HTTP服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口,必须指明,例如 http://www.cnblog...

2018-10-21 16:30:29 978

原创 《鸟哥的Linux私房菜》重学笔记(四)vim 学习

模式切换:按键说明:掌握鸟哥说的常用按键就可以啦(9.2.2 按鍵說明)补充一个:在一般指令模式下按V键(V ,v, ctrl+v),可以选择多行再按Y进行复制。(vim才有的功能,vi没有)(9.3.1 區塊選擇(Visual Block))Linux的暂存档问题(当用vim打开一个文件时报错):可能是多个人在编辑同一份文件,这时候只能选择以只读方式打开之前用vim...

2018-10-16 22:33:38 184

原创 《GO Web 编程》 GO基础

读书笔记源于:GO web 编程GO环境配置GO目录结构src 存放源代码(比如:.go .c .h .s等)pkg 编译后生成的文件(比如:.a)bin 编译后生成的可执行文件(为了方便,可以把此目录加入到 $PATH 变量中)GO 命令go build如果是main包,当你执行go build之后,它就会在当前目录下生成一个可执行文件。如果不是main包则无反应go clea...

2018-10-16 19:43:39 335

原创 GO 入门指南

前言GO语言的目的更少的代码,更短的编译时间(与传统开发的C/C++相比)创建运行更快的程序,高性能与安全性(与动态语言相比)能够很好地在多核计算机上工作能够做到在性能上和开发速度上基本不差于任何一门其他语言GO语言提倡通过接口来针对面向对象编程,通过 goroutine 和 channel 来支持并发和并行编程。学习GO语言第1章:Go 语言的起源,发展与普及在 Go 语言...

2018-10-03 20:34:11 855

原创 《鸟哥的Linux私房菜》重学笔记(六)linux关于bashrc与profile的区别

登入系统读取步骤:当登入系统时候获得一个shell进程时,其读取环境设定档有三步 :首先读入的是全局环境变量设定档/etc/profile,然后根据其内容读取额外的设定的文档,如 /etc/profile.d和/etc/inputrc(此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行)/etc/bashrc:为每一个运行bash shell的用户执行此文件.当ba...

2018-10-03 09:02:25 227

原创 对断点续传原理的简单探究

断点续传的背景有时候可能下载的文件过大,一次性传输遇到网络问题就很可能传输失败而需要全部重新下载。另外,断点续传还能够提供并发的下载提高下载速率。断点续传的实现如图,服务器通过返回的http报文头部字段告知客户端这只是请求数据的一部分,你需要再发起对剩余数据的请求。 断点续传的表现浏览器如果浏览器发起的请求中没有带range字段,而服务器没有返回全部数据,而是返回部分...

2018-08-26 11:05:56 2246

原创 Google Test 使用笔记

在 visual studio 2015 上使用下载:https://github.com/google/googletest (压缩包)编译gtest使用VS2015打开gtest.sln(我的是在目录googletest-master\googletest\msvc\2010下)在debug、release两个模式下都编译一下。编译后,在msvc/gtest/下有debug...

2018-08-26 10:25:16 787

原创 《程序员的自我修养》第二章 编译和链接 第三章 目标文件里有什么 第四章 静态链接

4个步骤:预处理,编译,汇编(输出的是目标文件),链接

2018-08-07 20:36:46 184

原创 《程序员的自我修养》第一章 温故而知新

早期的计算机CPU和内存访问速度一致,而其他外设访问速度过慢,因此都需要一个相应的I/O控制器。后来CPU的频率提高了,CPU改使用倍频的方式与系统总线进行通信。后来随着图形芯片需要跟CPU和内存之间大量交换数据,设计了专门的北桥芯片。低速设备连接南桥芯片,再汇总连接到北桥。硬件接口称为硬件规格。开发工具与应用程序是属于同一个层次的。当我们要读一个文件时,应用程序发出读的命令,...

2018-08-05 21:38:04 419

原创 从理论上初步了解敏捷开发

今日闲来无聊看了微信的一个宣传短视频,里面讲了微信的四个很重要的特性:极致精神,克制,敏捷开发,传帮精神。对于敏捷开发之前稍有涉略,但是也忘的七七八八了,便借此机会重学了一遍敏捷开发的原理。为什么需要敏捷开发在传统的瀑布式开发中,需要等上一阶段的任务完全完成后才能开始进行下一个阶段。好比你点了10道菜,厨师要等到10道菜都做好了才给你一起上,那作为消费者肯定是不乐意的。而在软件开发中,...

2018-07-22 12:14:45 561

原创 后台开发常见问题

内核空间和用户空间:内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。 内核和进程驻留在各自独立的虚拟空间中。每个进程可以通过系统调用进入内核。参考:https://blog.csdn.net/zhangskd/article/details/6956638用户态和内核态当一个任务(进程)执行系统调用...

2018-07-21 20:16:53 1575

原创 后台开发——数据库

SQL中存储过程和函数的区别常见面试题整理–数据库篇(每位开发者必备)数据库原理面试/笔试第三弹 —— 数据库面试问题集锦

2018-07-21 20:09:51 1738

空空如也

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

TA关注的人

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