• 再学Paxos算法

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    Paxos算法应该是最著名的分布式一致性算法之一了。然而说起来令人汗颜,我对Paxos的算法的理解一直都是糊里糊涂的。国庆假期在看《SRE Google运维解密》,“分布式共识系统”(也就是Chubby)章节,也在强调Paxos算法。正好趁着这个机会,好好学习总结一下。

    Paxos算法可以分为Basic Paxos和Multi-Paxos两种形式,它们的主要特点如下,为了对比起见,这里把它们列在一起了:

    ● Basic Paxos (“single decree”): 

    • 一个或者多个服务器发起提议 
    • 系统会在一个被选择的提议值上达成一致
    • 只有一个提议值会被选择

    ● Multi-Paxos: 

    • Multi-Paxos通过多回合的Basic Paxos算法在一列的值上形成一致,这一系列值相当于redo log,它的一致性
    【查看更多】
  • 《Docker源码分析》笔记

    最近几天的时间都在看《Docker源码分析》,买书的时候是觉得需要补补Docker原理方面的知识。因为过多的Docker书籍都偏向于使用,究其原因是Docker本身的工具属性很强。到目前为止,看完了全书大约70%的内容,关于镜像下载和管理部分的内容暂时略过了。

    • 负面评价:

    我对本书的整体评价不高,好在本来的期望值也不高。在我看来,这本书主要的问题在于本末倒置。cgroup和namespace作为Docker的基础技术,本书基本没怎么分析和介绍,甚至整个libcontainer都没有花多少篇幅。此外,UnionFS之类的文件系统也算是Docker作为虚拟化产品的一大特色,依然是寥寥数笔就带过了。

    • 正面评价:

    正如前文所说,Docker是一个工具性的产品,易用性是它的基本属性。当然这也导致了很少有用户去深入研究Docker实现方面的东西。像我这样好奇心… 【查看更多】

  • Innodb存储引擎中锁的简析

    mariadb

    基本概念

    innodb是MySQL/MariaDB的默认存储引擎,也是最广泛使用的存储引擎。几年前研究MySQL实现的时候,也看过一本关于innodb的书,但是理解并不到位。最近计划补充一下存储方面的知识,这里就从innodb入手研究一下。对于一个五级数据库引擎(实现事务功能),锁的设计是非常重要的,这篇博客的主题也就是学习innodb中锁。

    innodb中有不少锁,这篇blog主要研究一下几个点,前两点是锁的模式,后两个知识点是锁的类型。这里我想强调一下,锁的模式和锁的类型是两个概念,千万不要搞混了。很多资料上,包括MySQL的官方文档上,都把这些知识点混在一起,给我带来了不少困惑。

    • Shared and Exclusive Locks:共享锁和互斥锁
    • Intention Locks:意向锁

    两种类型的锁:

    • Record Locks
    • Gap Locks

    1. Shared and Exclusive
    【查看更多】
  • 初步学习分布式数据库

    写本文的初衷是由于最近在看《大规模分布式存储系统》,期间有不少疑问以及一些新的认识。这里就准备把自己的疑问和认识记录一下,供以后回炉知识点。这里行文的逻辑大致是以不同的数据库产品或者技术展开,可能会显得比较乱。而且,就目前来说,我对各种分布式数据库的理解都还很肤浅,本文权当自娱自乐了,摘抄很多。

    1. Hbase/BigTable

    作者在书中把Hbase定义为分布式表格系统,其实也没有什么毛病。Hbase的事务支持相当有限,只支持行级事务。Hbase的系统架构图如下:

    Hbase

    Client:包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息

    Master:为Region server分配region,负责Region server的负载均衡,发现失效的Region server并重新分配其上的region,管理用户对table的增删改查操作… 【查看更多】

  • 理解Spring Cloud Hystrix

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    hystrix-logo-tagline-640

    Spring Cloud“全家桶”风头正劲,Hystrix作为服务容错保护组件也是挺有名气。最近我有在看一些Spring Cloud的内容,其中就包括Hystrix。这里我打算从宏观理论和微观实现两个部分来分析Hystrix。

    1. Hystrix的宏观知识

    首先是宏观理论了,先抛出两个问题。Hystrix的设计目的是什么?应该怎么完成这些目标?针对第一个问题,我们首先需要明确的是微服务架构应该是有一定的容错性的,而服务不可用的问题是客观存在的。而且这些服务错误常常会恶化和扩散,结果造成更严重的负面影响。所以在无法绝对保证服务可用性的前提下,我们需要一种机制来保护服务错误。

    Hystrix的作用主要体现在一下几个方面,

    • 保护和控制底层服务的高延迟和失效对上层服务的影响。
    • 避免复杂分布式中服务失效的雪崩效应。在大型的分
    【查看更多】
  • 基于OpenGL ES实现多媒体全景渲染

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    panorama

    近几年来,VR型的多媒体变得越来越常见。在YouTube上就有很多360度视频,很多地图产品也提供全景街道图。作为开发者,我们不禁要想如何实现多媒体的全景渲染呢?

    其实,渲染VR的多媒体其实并不难,这里就以360度视频为例介绍一下。我也没有尝试过从头写一个360视频渲染库(目前能力和精力都不太允许),所以这篇博客其实是基于开源库的——https://github.com/ashqal/MD360Player4Android。此外,我不准备详细去介绍这个库怎么使用,而是基于它分析整个渲染流程。

    全景视频一般由鱼眼镜头产生,鱼眼镜头的物理结构大致如下:

    eye_fish

    最左边的就是一个曲面的镜头,光线就是从这里进入相机的。然后,光线经过一系列的光学【查看更多】

  • Java线程池、Executor原理分析

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)thread_pool1. 线程池作用与基本知识

    在开始之前,我们先来讨论下“线程池”这个概念。“线程池”,顾名思义就是一个线程缓存。它是一个或者多个线程的集合,用户可以把需要执行的任务简单地扔给线程池,而不用过多的纠结与执行的细节。那么线程池有哪些作用?或者说与直接用Thread相比,有什么优势?我简单总结了以下几点:

    • 1. 减小线程创建和销毁带来的消耗

    对于Java Thread的实现,我在前面的一篇blog中进行了分析。Java Thread与内核线程是1:1(Linux)的,再加上Thread在Java层与C++层都有不少成员数据,所以Java Thread其实是比较重的。创建和销毁一个Java Thread需要OS和JVM都做不少工作,因此如果将Java Thread缓存起来,可以实现一定的效率提升。

    • 2. 更加方便和
    【查看更多】
  • JVM原理与实现——Reference

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    duke_beer1. Reference的基本介绍

    reference的中文含义是“引用”。由于本文所基于的HotSpot虚拟机主要使用C++开发,因此我担心有人会把C++的引用和这里的reference混为一谈。所以,我会尽量使用reference(首字母小写)来表述”引用“这个概念。通常我们写下如下的语句: Object obj; 其实就是定义了一个reference。我可以很直白的说出一个结论——在32位机器上HotSpot的reference就是一个32bit的指针。如下图所示,reference指向一个堆空间的实际对象。这种常用的reference,我们给它起个名字——StrongReference。之所以这样叫,是为了体现它和其他Reference(即将登场)的联系与区别。

    image

    在java.lang.ref包下,有这样几个类:SoftReference、WeakReference以及Phan【查看更多】

  • JVM原理与实现——Synchronized关键字

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    openJDK_gitar

    在多线程的Java程序中,Synchronized关键字是经常出现的。这篇文章里,我们就来研究一下它的实现原理。比如以下的示例程序:

    public class SynchronizedTest {
        int syncFunc() {
            synchronized(this) {
                int a = 0;
                return a;
            }
        }
    }
    

    对应的字节码如下:

    Compiled from "SynchronizedTest.java"
    public class SynchronizedTest {
      public SynchronizedTest();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return
    
      int syncFunc();
        Code:
           0: aload_0
           1: dup
           2: astore_1
           3:
    【查看更多】
  • JVM原理与实现——Thread

    本文出自:【InTheWorld的博客】 (欢迎留言、交流)

    Jaa

    前言

    之前研究OpenJDK的时候,并没有注意Java线程模型方面的东西。最近在学习一些Java并发方面的知识时,关于JVM线程实现原理的疑问又浮上心头。昨天晚上,突然想起以前研究OpenJDK的资料还在,于是开始在OpenJDK的源码里面研究Thread的实现。搞到凌晨三点多,差不多弄清楚了一个大概,这篇博文就主要把把相关的知识点记录下来。

    1. Java中Thread

    对于Java开发者来说,java.lang.Thread的确是再熟悉不过了。Java多线程程序都是通过它来实现功能的。有关Thread的使用方式,这里我不想赘述了,而是直奔Thread的实现原理。任【查看更多】