后台
文章平均质量分 87
haozlee
多年linux开发经验,熟悉c++,python。个人主页:https://leehao.me
展开
-
Raft 共识算法学习笔记 三:成员变更
文章 《Raft 共识算法学习笔记 一:领导人选举》 和 《Raft 共识算法学习笔记 二:日志复制》 分别讲述了 Raft 算法如何进行领导人选举和如何进行日志复制。这篇文章继续讲述 Raft 算法如何处理集群成员节点变更的问题。考虑一种场景,原来 Raft 集群中存在三个节点,现在需要增加2 个节点。那么,在这种情况下, Raft 算法如何能保证同一个任期内,只有一个领导者呢?在 Raft 论文中,作者使用配置(configuration)来表示集群由哪些节点组合,即集群所有节点的信息集合。在稳定原创 2021-03-16 14:04:26 · 461 阅读 · 0 评论 -
Raft 共识算法学习笔记 二:日志复制
文章 Raft 共识算法学习笔记 一:领导人选举 描述了 Raft 算法如何进行领导者选举,本文描述 Raft 共识算法如何进行日志复制。复制状态机在 Raft 集群中,每个服务器可以看成是一个复制状态机(Replicated State Machine),如下图。复制状态机通常基于复制日志(replicated log)实现。每个服务器存储一个包含一系列指令的日志,并且按顺序执行指令。由于日志都包含相同顺序的指令,状态机会按照相同的顺序执行指令,由于状态机是确定的(deterministic),因此原创 2021-03-16 14:03:05 · 1002 阅读 · 0 评论 -
Raft 共识算法学习笔记 一:领导者选举
Raft 算法是现在分布式系统开发首选的共识算法。文章 《图解 Paxos 算法》 介绍了 Paxos 共识算法,绝大多数选用 Paxos 算法的系统(比如 Cubby),都是在 Raft 算法发布前开发的,当时没得选。新系统绝大多数选择了 Raft 算法,例如,Etcd,Consul,等。就像作者 Diego Ongaro 在 Raft 论文 In Search of an Understandable Consensus Algorithm 说的,Paxos 太难理解了,无论是对于学生还是系统开发者来说原创 2021-02-27 08:07:20 · 1097 阅读 · 0 评论 -
图解 Paxos 算法
Paxos 算法由 Leslie Lamport 在 1989 年提出的一个分布式共识算法,Paxos 算法较难理解,本文尝试以图形化方案解释 Paxos 算法。本文在很大篇幅参考了韩健极客时间的课程《分布式协议与算法》,有兴趣了解韩老师其他课程的同学可以购买来学习下。Lamport 提出的 Paxos 算法包括两个部分:Basic Paxos 算法:多节点如何就某个值达成共识Multi Paxos 思想:执行多个 Basic Paxos ,就一系列的值达成共识Basic Paxos问题假原创 2021-02-11 10:15:20 · 860 阅读 · 0 评论 -
CentOS 7 安装 gRPC
之前的文章曾经介绍过有关 protobuf 的安装使用,《Google Protocol Buffers 体验日志》,不过那篇文章针对的 MacOS 系统。最近在公司环境引入 gRPC 的使用,服务器都是 CentOS 7 系统,故写篇文章记录 CentOS 7 下如何安装 gRPC。安装依赖的软件首先是安装必要的软件,包括 git,make,gcc,等。yum install epel-r...原创 2020-01-23 10:49:16 · 5081 阅读 · 0 评论 -
分布式对象存储服务器 MinIO 牛刀小试
数据存储包括三种类型,分别是块存储,文件存储和对象存储。有关这三种类型的差别,可以参考 对象存储、文件存储和块存储的区别。MioIO 是一个开源的分布式对象存储系统,非常适合于存储大容量非结构化的数据,例如图片,视频,日志文件,备份数据等。本文讲述如何快速搭建 MioIO 服务端和客户端,以便于对 MioIO 有个概要了解。MinIO 服务端安装MioIO 是一个非常轻量级的对象存储系统,可...原创 2020-01-22 16:11:42 · 7642 阅读 · 0 评论 -
携程 Apollo 配置中心初探
最近在对开源配置中心进行调研。当前流行的开源配置中心包括 Apollo,Nacos,以及 Disconf。Apollo 应该是当前最流行,所以写篇文章来记录 Apollo 的安装与使用。Apollo 是携程开源的分布式配置中心,能够集中化管理不同环境,不同集群的配置,配置修改后能够实时推送到应用,并且具备权限治理功能。本文讲述如何快速搭建开发或者测试使用 Apollo 配置中心。如果需要在生产...原创 2020-01-21 09:24:20 · 893 阅读 · 0 评论 -
一文带你了解 RTO 和 RPO
RTO 和 RPO 都是企业灾难恢复(Disaster Recovery, DR)需要考虑的关键指标,这两个指标可以用来指导企业来制定合适的业务系统服务或数据的恢复方案。本文介绍 RTO 和 RPO 的概念以及区别。图:RPO(Recovery point object) 和 RTO(Recovery time object)是提供业务连续性的关键指标RTORTO,Recovery ti...原创 2020-01-12 21:50:55 · 26630 阅读 · 1 评论 -
Nginx 日志接入 Elastic Stack 系统
文章《搭建 Elastic Stack 日志系统》 描述了如何利用 Kibana,Elasticsearch,Filebeat 来搭建日志系统。本文在上一篇 Elastic Stack 文章的基础上,说明如何将 Nginx 的日志接入 Elastic Stack 日志系统。为了更新在 Kibana 上展示 Nginx 的日志,可以先将 Nginx 的日志改成 json 格式,如何更改 Nginx 的原创 2017-12-12 18:53:22 · 2073 阅读 · 0 评论 -
Python 和 Java 进行 DES 加密和解密
DES 为 Data Encryption Standard (数据加密标准)的缩写,是一种常见的对称加密算法。有关对称加密与非对称加密的特点及其应用场景,本文就不描述了,读者可以自行 google 。本文说明如何使用 Java 和 Python 两种语言来实现 DES 的加解密。最近碰到的应用场景是这样的。我们需要对接一个系统 S,系统 S 已经对用户的身份进行了验证,新系统 N 也需要对用户的身原创 2017-11-17 09:22:45 · 10478 阅读 · 2 评论 -
搭建 Elastic Stack 日志系统
Elastic Stack 是原 ELK Stack 在 5.0 版本加入 Beats 套件后的新称呼。Elastic Stack 在实时日志处理领域已开成开源界的第一选择。 本文讲述如何搭建 Elastic Stack 日志系统,使用的套件包括 Kibana,Elasticsearch,以及 Filebeat。搭建的环境选择阿里云 ECS 服务器,系统为 CentOS 7.4 64 位。...原创 2017-11-07 18:37:46 · 3065 阅读 · 0 评论 -
SQL JOIN 的使用
由于工作需要,现在也开始写一些复杂一点的 sql 了。由于之前对于 join 与 where 关键字的使用一直有疑惑,故写一篇文章整理一下,算是对 sql 中各种表联结使用的一个总结。SQL JOIN 的作用sql 关键字 union 与 intersect 属于以行方向为单位的集合运算,进行这些集合运算时,会导致 记录行的增加或减少。关键字 join 则是属于列方向的运算,将其他表中的列添...原创 2019-04-21 20:12:16 · 1339 阅读 · 0 评论 -
SOAP Web Services 简介
SOAP(Simple Object Access Protocol)是一种基于 XML 的 web 服务协议。SOAP 是平台独立的,不依赖于特定的语言,例如,我们可以使用 C#,C/C++,或者 Java 语言来实现 SOAP web 服务。SOAP 的优点SOAP 的优点有:WS Security:SOAP 使用 WS Security 作为其安全的标准,安全性较高。语言与平台独立:可以使原创 2020-03-04 08:17:35 · 3267 阅读 · 0 评论 -
Nginx 日志改成 JSON 格式
Nginx 日志默认为普通文本的格式,例如,下面是 Nginx 的一行访问日志:10.88.122.105 - - [02/Dec/2017:09:15:04 +0800] "GET /js/pagination.js HTTP/1.1" 304 0 "http://10.88.105.20:8063/stockrecommand.html" "Mozilla/4.0 (compatible; MS原创 2017-12-12 18:56:41 · 13492 阅读 · 2 评论 -
Hexo 网站配置免费阿里云证书
原来的个人网站 leehao.me 使用了阿里云的负载均衡服务,因此 HTTPS 证书也是部署在负载均衡服务器上。文章《在阿里云部署 Hexo 网站》介绍了采用负载均衡方式来部署网站的方法。 考虑到网站访问流量不高且为了减少费用,决定不再使用负载均衡服务,而是直接采用单个 ECS 服务器的方式来部署网站。采用新的方式部署网站后,为了同样让网站支持 https,需要重新对 https 证书进行配置...原创 2018-03-04 20:26:01 · 1959 阅读 · 0 评论 -
CentOS 7 安装 MySQL
官方推荐使用 yum 源来安装 MySQL,本文讲述如何使用 yum 源来安装 MySQL。一、添加 MySQL yum 源可以采用yum localinstall命令来添加 MySQL 源。在 https://dev.mysql.com/downloads/repo/yum/ 页面选择合适 rpm 包,这些 rpm 包的作用就是添加 MySQL yum 源的。笔者下载的是 mysql80...原创 2018-06-14 14:08:00 · 9737 阅读 · 0 评论 -
CAP 理论解释 —— 以“记忆公司”开展业务为例
CAP 理论是分布式系统的一个基础理论,它描述了任何一个分布式系统最多只能满足以下三个特性中的两个:一致性(Consistency)可用性(Availability)分区容忍性(Partition tolerance)CAP 理论听起来十分抽象,本文尝试以生活中的例子并用通俗易懂的语言来解释 CAP 理论的含义。第一章:“记忆公司”面世一天晚上,正准备入睡时,你的妻子对你记...原创 2018-07-15 11:52:46 · 11073 阅读 · 3 评论 -
Oracle / PL SQL: CURSOR FOR LOOP 使用
FOR LOOP 介绍为了对游标进行遍历,可以使用 FOR LOOP 语句实现,语法如下:FOR record IN cursor_nameLOOP process_record_statements;END LOOP;对游标进行 FOR LOOP 遍历时,省去了 ROWTYPE 的声明,循环每次从查询结果中取出一行结果,当取完后,跳出循环。1) recordrecord 是 ...原创 2019-08-25 20:19:01 · 3073 阅读 · 0 评论 -
记一次 socket 通信性能优化过程
上段时间测试人员对某个服务端程序进行了性能压力测试,发现当使用 JMeter 向程序并发发送 100 个请求后,再发送请求,则会出现程序无法响应的问题。想着这个问题比较棘手,拖了不少时间。最近其他事情少了点,可以专心下来优化这个程序的性能,就着手开干了。利用 Wireshark 和 Python 构造请求报文客户端向服务端程序发送的请求报文进行了加密,且密钥存在过期时间,为方便构造请求报文,我...原创 2019-09-20 18:09:37 · 2810 阅读 · 1 评论 -
负载均衡(Load Balancing)学习笔记(一)
概述在分布式系统中,负载均衡(Load Balancing)是一种将任务分派到多个服务端进程的方法。例如,将一个HTTP请求派发到实际的Web服务器中执行的过程就涉及负载均衡的实现。一个HTTP请求到达Web服务器,这中间涉及多个过程,也存在多种不同负载均衡的方法。本文讲述负载均衡的基本原理与派发策略,下图1是负载均衡的基本原理图,图1中客户端的请求请求经过达负载均衡器(Load Balancer)原创 2016-12-27 23:42:35 · 17940 阅读 · 3 评论 -
Web 服务架构类型
根据 Web 应用架构设计的风格,可以将 Web 服务划分为以功能为中心的服务以及以资源为中心的服务。以功能为中心的服务以功能为中心的 Web 服务历史由来已久,它是指能够调用远程机器上的功能或者对象方法,而无须知道这些功能或者对象是如何实现的。 我们了解的 CORBA(公共对象请求代理体系架构),XML - RPC(可扩展标记语言——远程过程调用),DCOM(分布式组件对象模型),SOAP(简单原创 2017-04-16 14:31:20 · 3386 阅读 · 0 评论 -
I/O多路复用之 epoll 系统调用
I/O多路复用除了select和poll系统调用外,epoll 也可以检查多个文件描述符的就绪状态,以达到I/O多路复用的目的。 epoll 系统调用是 Linux 系统专有的,在 2.6 版本新增,epoll 的主要优点有:当检查大量的文件描述符时,epoll 的性能比select和poll高很多epoll 既支持水平触发也支持边缘触发,select和poll只支持水平触发epoll 编程原创 2017-05-07 00:32:43 · 2247 阅读 · 0 评论 -
I/O多路复用之POLL系统调用
poll函数类似于select函数,也可以实现I/O多路复用。poll函数的声明如下:#include <poll.h>int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);第一个参数是指向一个结构数组第一个元素的指针。每个数组元素都是一个pollfd结构,用于指定测试某个给定描述符fd的条件。struct pollfd原创 2017-03-26 13:51:08 · 998 阅读 · 0 评论 -
UDP 套接字编程入门
概述在使用TCP编写的应用程序和使用UDP编写的应用程序之间存在一些本质差异,其原因在于这两个传输层之间的差别:UDP是无连接不可靠的数据报协议,不同于TCP提供的面向连接的可靠字节流。从资源的角度来看,相对来说UDP套接字开销较小,因为不需要维持网络连接,而且因为无需花费时间来连接连接,所以UDP套接字的速度也较快。 因为UDP提供的是不可靠服务,所以数据可能会丢失。如果数据对于我们来说非常重要原创 2017-03-20 08:25:20 · 12079 阅读 · 0 评论 -
体验 gRPC 那些事儿
我们来看 google 对于 gRPC 的定义:A high performance, open-source universal RPC framework即 gRPC 是一个开源的高性能通过 RPC 框架。具体来说,它具有以下特点:- 使用 protocol buffers 来作为序列化和反序列化,以及接口定义语言 (IDL)- 跨语言,跨平台,gRPC支持多种平台和多种语言,这应该是原创 2017-01-31 22:29:30 · 13723 阅读 · 0 评论 -
负载均衡(Load Balancing)学习笔记三——负载均衡算法
本文讲述实现负载均衡的常用算法。轮询法(Round Robin)轮询法是负载均衡中最常用的算法,它容易理解也容易实现。 轮询法是指负载均衡服务器(load balancer)将客户端请求按顺序轮流分配到后端服务器上,以达到负载均衡的目的。 假设现在有6个客户端请求,2台后端服务器。当第一个请求到达负载均衡服务器时,负载均衡服务器会将这个请求分派到后端服务器1;当第二个请求到害时,负载均衡服务器会原创 2017-01-23 19:42:36 · 14451 阅读 · 1 评论 -
一致性Hash(Consistent Hashing)原理剖析
引入在业务开发中,我们常把数据持久化到数据库中。如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取。读取数据的过程一般为: 图1:加入缓存的数据读取过程对于分布式缓存,不同机器上存储不同对象的数据。为了实现这些缓存机器的负载均衡,可以使用式子1来定位对象缓存的存储机器: m = hash(o) mod n ——式子原创 2017-01-08 00:07:28 · 27562 阅读 · 12 评论 -
负载均衡(Load Balancing)学习笔记二
概述文章 负载均衡(Load Balancing)学习笔记(一) 讲述了负载均衡的一般性原理,本文继续介绍常见的实现负载均衡的方法。HTTP重定向HTTP重定向服务器是一台普通的Web服务器,用户的请求先到达重定向服务器,这台服务器会挑选一台后端服务器的地址(例如使用轮询的方式),并将该地址写入HTTP重定向响应结果中(以响应状态码302返回)返回给用户。用户将根据这个新的地址重新发送请求到选中的原创 2017-01-21 16:13:20 · 4925 阅读 · 2 评论 -
CDN的作用与基本过程
简介CDN,Content Distribute Network,可以直译成内容分发网络,CDN解决的是如何将数据快速可靠从源站传递到用户的任务。用户获取数据时,不需要直接从源站获取,通过CDN对于数据的分发,用户可以从一个较优的服务器获取数据,从而达到快速访问,并减少源站负载压力的目的。动机为什么不进行数据的直接交付,即让用户直接从源站获取数据呢? 我们常说的互联网实际上由两层组成,一层是以T原创 2016-10-13 17:56:32 · 26439 阅读 · 6 评论 -
状态服务器与无状态服务器(要点)
对于服务器程序来说,有个基本假设,即服务器是基于状态请求,还是基于无状态请求。根据这个假设,可以将服务器划分为状态服务器和无状态服务器。状态服务器如果是状态化请求,那么服务端一般需要保存请求的相关信息,每个请求可以默认地使用以前的请求信息。状态服务器具有以下特点: - 保存客户请求的数据(状态) - 服务端容易对客户状态进行管理 - 服务端并不要求每次客户请求都携带额外的状态数据无状态服务器无原创 2015-11-27 10:02:47 · 13383 阅读 · 4 评论 -
Google Protocol Buffers 初体验
最近在看RPC的相关的实现,其中google的 gRPC 默认使用 Protocol Buffers 来作为其接口描述语言(IDL,Interface Definition Language)以及使用 Protocol Buffers 实现消息的序列化与反序列化。因此,很有必要对 protocol buffers 作个初步的了解。 下文以 protobuf 来简称 protocol buffer。原创 2017-01-30 20:30:05 · 1359 阅读 · 0 评论 -
图解UNIX的I/O模型
一、简述UNIX系统将所有的外部设备都看作一个文件来看待,所有打开的文件都通过文件描述符来引用。文件描述符是一个非负整数,它指向内核中的一个结构体。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。而对于一个socket的读写也会有相应的文件描述符,称为socketfd(socket描述符)。 在UNIX系统中,I/O输入操作(例如标准输入或者套接字的输入)通常包含以下两个不同的原创 2016-06-09 13:29:12 · 5474 阅读 · 3 评论 -
TCP的连接管理
简述TCP是面向连接的协议,TCP把连接作为最基本的抽象。每一条TCP连接唯一地被通信两端的两个端点所确定。那么,TCP连接的端点是什么呢?TCP连接的端点又叫套接字(socket),根据TCP协议的规定,端口号拼接到IP地址即构成了套接字,即 套接字 socket = (IP地址:端口号)这样一来,TCP连接可以以下式子表示 TCP连接 ::= {socket1, socket2} =原创 2016-08-02 17:05:37 · 13680 阅读 · 1 评论 -
RPC 基本原理与 Apach Thrift 初体验
概述RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议,此协议允许进程间通信。简单来说,当机器 A 上的进程调用机器 B 上的进程时,A 上的调用进程被挂起,而 B 上的被调用进程开始执行。调用方可以通过参数将信息传送给被调用方,然后可以通过被调用方传回的结果得到返回。RPC 框架屏蔽了底层传输方式(TCP/UDP)、序列化和反序列化(XML/JSON/二进制)等原创 2017-02-07 14:19:46 · 8560 阅读 · 1 评论 -
I/O多路复用之select系统调用
I/O多路复用模型允许我们同时等待多个套接字描述符是否就绪。Linux系统为实现I/O多路复用提供的最常见的一个函数是select函数,该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生或经历一段指定的时间后才唤醒它。 作为一个例子,我们可以调用select,告知内核仅在下列情况发生时才返回: - 当集合{0, 4}中任意描述符准备好读时返回 - 当集合{1, 2,原创 2017-03-25 23:52:03 · 2892 阅读 · 0 评论 -
多线程并发服务器
在多进程并发服务器的应用程序中,父进程accept一个连接,fork一个子进程,该子进程负责处理与该连接对端的客户之间的通信。 尽管多进程的编程模型中,各进程拥有独立的地址空间,减少了出错的概率,然而,fork调用却存在一些问题: - fork是昂贵的,fork要把父进程的内存映像复制到子进程,并在子进程中复制所有描述符,这个操作是较重量级的。 - fork返回之后父子进程之间信息的传递需要进原创 2017-03-25 15:45:23 · 9878 阅读 · 4 评论 -
TCP套接字编程入门
概述套接字(socket)是一种通信机制,凭借这种机制,客户与服务器的通信既可以在本地单机上进行,也可以跨网络进行。 图:基本的TCP客户/服务器应用程序的套接字函数图中展示了一对TCP客户与服务器进程之间进行通信时调用套接字函数的交互情况。服务器首先启动,然后监听客户的连接。稍后客户试图连接服务器,客户连接成功后,客户给服务器发送请求,服务器处理请求,并且返回给客户一个响应。这个过程一直持续下去原创 2017-03-21 23:46:04 · 10353 阅读 · 2 评论 -
多进程并发服务器
我们来考虑有多个客户同时连接一个服务器的情况。在前面的TCP套接字编程的例子中,我们已经看到,服务器程序在接受来自客户端的一个新连接时,会创建出一个新的套接字(已连接套接字),而原先的监听套接字则继续监听后面的连接请求。如果服务器不能立刻接受后来的连接,它们将被放到队列中以等待处理。 原先的套接字仍然可用并且套接字的行为就像文件描述符,这一事实给我们提供了一种同时服务多个客户的方法。如果服务器调用原创 2017-03-23 16:40:56 · 5711 阅读 · 1 评论 -
epoll 水平触发与边缘触发
epoll也是实现I/O多路利用的一种方法,为了深入了解epoll的原理,我们先来看下epoll水平触发(level trigger, LT,LT为epoll的默认工作模式)与边缘触发(edge trigger, ET)两种工作模式。使用脉冲信号来解释LT和ET可能更加贴切。Level是指信号只需要处于水平,就一直会触发;而edge则是指信号为上升沿或者下降沿时触发。说得还有点玄乎,我们以生活中的一原创 2017-03-28 08:36:44 · 37724 阅读 · 17 评论 -
监听套接字与已连接套接字
监听套接字(listening socket)和已连接套接字(connected socket)之间的区别常会使很多人感到迷惑。本文简要描述一下这两者的区别。为了说明监听套接字与已连接套接字的区别,我们先来看一下套接字在连接中的含义。 从内核的角度来看,一个套接字就是通信的一个端点。一个连接由它两端的套接了地址唯一确定,这对套接字地址叫做套接字对(socket pair),由下列4元组来表示:原创 2017-03-22 21:39:36 · 17749 阅读 · 3 评论