浅谈数据库同步和迁移

  本文将主要首先聊一聊数据库同步和迁移两个话题,之后将会围绕这2个话题介绍一下阿里云最近开源的基于MongoDB和Redis的数据同步&迁移工具MongoShake和RedisShake,最后介绍一些用户的使用案例。 1. 同步   现在大部分数据都支持集群版的数据,也就是说一个逻辑单元中有多个db节点,不同节点之间通常通过复制的方式来实现数据的同步,比如Mysql的的基于binlog的主从同步,Redis的基于sync/psync机制的aof主从同步,MongoDB基于oplog的主从同步等等。这些机制支撑了一个单元下的数据冗余高可用和读写分离负载分担。   但仅仅一个逻辑单元内的数据同步对于很多业务通常不够用,很多业务需要跨逻辑单元的数据同步的能力,例如同城多机房,异地多数据中心同步等。容灾,多活是最常见的两种业务场…

Read more

混合逻辑时钟

  本文将首先依次简单介绍分布式系统下的物理时钟(Physical Time,也称PT),逻辑时钟(Logical Clock,也称LC),向量时钟(Vector Clock,也称VC),真实时钟(True Time,也称TT)的基本概念,然后着重笔墨介绍混合逻辑时钟(Hybrid Logical Clock,也称HLC),论文来自Logical Physical Clocks and Consistent Snapshots in Globally Distributed Databases。   说明:本文描述的时间戳和时钟是一个概念。 1. 物理时钟-Physical Time, PT   物理时钟即机器本地的时钟,而由于设备硬件不同,本身存在偏差,一天的误差可能有毫秒甚至秒级,所以需要对不同的机器时钟进行同步使得机器的时…

Read more

ssdb迁移数据到redis

  最近搞了个软件,把ssdb的数据迁移到redis上去,官方的ssdb只支持从redis到ssdb的迁移,而不支持从ssdb到redis的反向链路版权。于是,我自己搞了一个进行迁移。 原理   ssdb-port作为从节点(slave)与主节点(master)进行交互并同步数据,在数据同步过程中进行截取然后解析适配发送到配置文件制定的redis中。下面是基本的架构图。   关于ssdb和redis的命令对照可以参考ssdb的github命令对照文档。 下载链接   请参见我发布在阿里云官网的地址。…

Read more

go sync.Map存在bug

go的sync.Map有bug,并发量大的时候读取,已经store的数据,Load显示不存在,被这个坑搞了一天。改为读写锁加持的普通map解决了。具体原因不明。…

Read more

MongoShake开源

1.背景   在当前的数据库系统生态中,大部分系统都支持多个节点实例间的数据同步机制,如Mysql Master/Slave主从同步,Redis AOF主从同步等,MongoDB更是支持3节点及以上的副本集同步,上述机制很好的支撑了一个逻辑单元的数据冗余高可用。   跨逻辑单元,甚至跨单元、跨数据中心的数据同步,在业务层有时候就显得很重要,它使得同城多机房的负载均衡,多机房的互备,甚至是异地多数据中心容灾和多活成为可能。由于目前MongoDB副本集内置的主从同步对于这种业务场景有较大的局限性,为此,我们开发了MongoShake系统,可以应用在实例间复制,机房间、跨数据中心复制,满足灾备和多活需求。   另外,数据备份是作为MongoShake核心但不是唯一的功能。MongoShake作为一个平台型服务,用户可以通过对接Mongo…

Read more

tcmalloc浅析

  最近学习了tcmalloc机制,它是go里面用到的内存分配机制。本文参考tcmalloc,加上一部分自己的理解。 tcmalloc VS ptmalloc(glibc 2.3 malloc)   对于小内存来说,tcmalloc提供线程级别的内存分配,这样就减少了线程之间的竞争,ptmalloc2也提供线程级别分配,但是它的内存被分配到某个线程后就不能重新分配给别的线程,这造成了较大的资源浪费。对于大内存来说,tcmalloc也采用了细粒度且高效的分配策略。   在2.8 GHz P4环境下,tcmalloc执行小内存malloc/free的时间大约为50ns,小于ptmalloc2的300ns。   另外在空间利用上,tcmalloc额外空间比较少,N个8字节的对象占用的总空间大概为8N*1.01,而pt…

Read more

go并发需要注意的问题

  用go写并发的确很方便,协程相比于线程轻量很多,关于协程与线程的区别,可以参考我的这篇博客:go中的协程与线程的区别。本文主要讲一下一些并发中应该注意的坑,学习go没多久,可能有认知不到位的地方,欢迎指正。 1. channel   go中通过channel进行消息通信,channel函数传参通过引用实现。go中有2种channel,分别是无缓存的channel(unbuffered channel)和有缓存的channel(buffered channel),前者cap为0,后者大于0。无缓存的channel主要用于同步:生产者写入channel然后阻塞,直到消费者读取后,生成者才从阻塞状态返回;有缓存队列适用于异步:在队列为满的情况下(len < cap),生产者将消息塞入channel就返回。   由于go存在垃圾…

Read more

go中的协程与线程的区别

  对用户来说,协程与线程几乎没什么区别,但是实际上还是有一些区别的。   说明:本文对协程和goroutine,OS线程和内核线程都是一个概念,未加区分。 1. 栈大小区别   我们知道,线程是有固定的栈的,基本都是2MB,当然,不同系统可能大小不太一样,但是的确都是固定分配的。这个栈用于保存局部变量,用于在函数切换时使用。但是对于goroutine这种轻量级的协程来说,一个大小固定的栈可能会导致资源浪费:比如一个协程里面只print了一个语句,那么栈基本没怎么用;当然,也有可能嵌套调用很深,那么可能也不够用。   所以go采用了动态扩张收缩的策略:初始化为2KB,最大可扩张到1GB。 2. goroutine没有id   每个线程都有一个id,这个在线程创建时就会返回,所以可以很方便的通…

Read more

golang net/rpc源码分析

  为什么需要rpc框架?一次rpc需要指定调用的方法,参数,接收返回值。如果没有rpc框架,裸写tcp,什么时候知道报文传递完毕的界限。最简单我们可以搞个私有协议,TLV格式指定:T(type)指定类型,L(length)指定长度,V(Value)指定值,但是这个也会带入一些问题,比如规范问题,不同服务提供不同协议,这不乱套了吗;另外还有效率问题,比如我要传递一个数组怎么传?基于以上几个问题,rpc框架出现了,rpc框架采用序列化操作将请求和返回在发送端进行序列化,然后在接收端进行解序列化达到目的,如下图所示,图片来自博客。 服务调用流程如下: client调用client stub,这是一次本地过程调用 client stub将参数打包成一个消息,然后发送这个消息。打包过程(序列化)也叫做 marshalling client所在的系统将消息发送给serve…

Read more

golang实现mapreduce单进程版本

  元旦放假的第一天,在家没事干,用golang实现了一下mapreduce的单进程版本,github地址。处理对大文件统计最高频的10个单词,因为功能比较简单,所以设计没有解耦合。   本文先对mapreduce大体概念进行介绍,然后结合代码介绍一下,如果接下来几天有空,我会实现一下分布式高可用的mapreduce版本(1月6日update:这个主要看需求,1.如果master挂了,当前执行的任务丢了就丢了,接下来下发的任务还能执行,那么这个很好实现,可以做多个Master,每次任务分发给一个master执行,北向搞一个负载均衡器就可以,或者弄一个注册中心;2.如果要高可用指的是已经执行的mapreduce任务在主master挂掉后仍然继续执行,那么多个master之间需要做数据同步,可以用Redis或者kafka做消息同步,但是有种过度设计的感觉…

Read more

go https example

  本文首先大概介绍一下https的协议原理(其实是TLS协议原理),然后给出构建https的go代码例子。 1.HTTPS协议   网上已经有很多资料介绍HTTPS协议了,我归纳一下,加深自己的记忆。   HTTPS是HTTP通过SSL/TLS加密的方式进行通讯,TLS是SSL的改进版本。TLS协议可以分为握手阶段和对话阶段,握手阶段采用非对称加密方式(密钥由第三方机构提供),对话阶段采用对称加密方式(密钥由握手阶段协商得出)。   握手阶段主要分为4个步骤(细分来说,可以有多个步骤,具体查看RFC文档): 1.1 Client Hello   客户端向服务器端发起hello请求,同时带入以下信息: 客户端支持的加密方式 客户端支持的SSL/TLS协议版本号 客户端生成的随机数1,该随机数…

Read more

小谈程序员面试

  最近我的一位技术不错的同学想换工作,然后跟我吐槽在面试中碰到了一些奇怪的面试官问了一些不着边际的题目,让我这位同学很是苦恼。其实我之前一直想说说面试,但是也一直比较懒。这次听完他的谈话,结合我的一些面试别人的经验和自己被面试的经验,今天分别来谈谈从面试官角度和被面试者出发,我对一次”良好“面试的看法吧。因为我是做后台开发的,所以讲的东西可能有点偏重于后台开发,但是我觉得面试方法来说是具有普适性的。 1. 从面试官角度出发 面试题目应该覆盖足够广的程度。比如我是做后台开发的,我认为一次合格的后台开发面试应该覆盖到:数据结构&算法、操作系统、网络知识、某一门求职者擅长的编程语言。以上4个我认为是必须需要考察的,另外还有一些比如数据库、分布式、Linux基本操作等相应知识也可以进行适当的考察。不能一次面试只面操作系统,这个就没办法进行系统而全面的考察。 面试考…

Read more

线段树小结

  线段树是一种比较强大的数据结构,主要用于在动态更新区间的情况下,保持查找和更新在O(log(n))级别的时间复杂度。虽然它不是一颗完全二叉树,但构造时按照完全二叉树进行构树,没有的话叶结点留空,数组按完全二叉树构造:对于父节点编号为x,其左右儿子结点分别为:2x和2x+1。如下图所示:   Management range表示该结点的『负责输入结点』的范围,1-3表示负责输入结点1,2和3,即:in[1],in[2]和in[3]。value值表示初始化值,刚开始构造时值为0,构造之后的值为子结点的『某种运算』结果:比如,对于『求区间最小值』,则value(4) = min(value(8), value(9)),value(1) = min(value(2), value(3))`,这个在图中未标出来。图中蓝色结点为输入的结点,虚线方向为数组的输…

Read more

算法题:遍历树中m个点最少需要经过多少个结点

  给定一棵树,从树中任意结点出发,遍历m个结点,最少需要结果多少个结点,结点可以重复走。   思路:找树中最长的链,也就是树的“直径”,假设为d,如果m小于等于d,则输出m就可以了;如果m大于d,则输出d+(m-d)*2,这是因为最长链上的分支路径需要走2遍(一来一回)。那么,直径也就是最长链怎么求?先从任意一个叶子节点x出发,找到最长的路径,假设路径结尾是y节点;再以y为根,找出最长的路径,这条路径就是树的最长路径。两次dfs可以搞定了。   代码: #include <iostream> #include <vector> using namespace std; vector<int> vis; vector<vector<int>> tree; pair&l…

Read more

父进程捕获SIGCHLD信号依旧产生僵死进程

  最近自己写的一段代码出现了很多僵死进程,简约版本代码如下: #include <stdio.h> #include <string> #include <unistd.h> #include <stdlib.h> #include <iostream> #include <sys/wait.h> #include <pthread.h> using namespace std; int cnt = 0; void sig_handler(int signo) { pid_t pid; int stat; pid = wait(&stat); cout << "cnt:" << ++cnt << ", pi…

Read more

Broadview功能简介

  Broadcom最近推出了他们的新产品broadview,提供telemetry的监控方式,将问题定位至芯片级别,其架构如下:   在交换机侧加入agent,提供对芯片级别的操作:包括信息采集以及报文注入等,北向提供REST接口提供信息交互,控制器侧提供操作的具体逻辑。其官网介绍的功能如下: Buffer statistics tracking Packet tracing and injection Black hole detection Performance metrics for BST Drop counters due to congestion Support for StrataXGS and StrataDNX silicon families Reference implementation for applications…

Read more

数据中心网络监控小结

  最近调研了一些关于数据中心网络监控的论文和解决方案,主要关于丢包和延时的定位排查,现在telemetry的技术比较火热,写点东西小结一下,越来越懒得写博客了,写的不是很详细,特别是后面几篇,也可能有理解不到位的地方,欢迎指正。 1. Pingmesh   Pingmesh是微软在2015年提出的,其架构模式在那之前已经在微软的数据中心运行了超过4年,采用商用交换机,每天收集10TB的延迟数据。它能够解决以下三个问题: 定位业务的延迟是否因为网络 提供并且跟踪当前网络服务水平(service level agreement ) 自动排除障碍   微软数据中心采用CLOS架构,如下图所示。拥有的规模如下:服务器规模在10万级别,交换机规模为万,服务器上联万兆。论文中阐述的一些统计和架构如下:时延统计采用端到端,中控系统为微软自己的…

Read more

OpenDaylight中DataStore Tree Notification示例

  DataStore有三种监听事件DataChangeListener、DataTreeChangeListener和DOMDataTreeChangeListener,他们具体的区别可以参考这篇博客,本文主要介绍一下DataTreeChangeListener。DataTreeChangeListener可以用来监听整棵树或者某个子树,子树结点的改变将引发由该子节点递归到根结点整个支路结点都发生改变,原理是version号的变化,具体可以参考我之前的博客。 实验 yang文件   包含多级container的yang文件定义如下: container threshold { description "Threshold configuration"; container temperature {…

Read more

memcpy, memmove和copy/copy_if/copy_n/copy_backward的区别

  在C++中有多种方式可以进行数据拷贝,但它们实现的方式略有不同。 memcpy   memcpy原型如下,其以字节为单位,可以用来拷贝非重合区域。也就是说如果拷贝的源、目的有重合部分的话,结果是undefined,意味着可能偶尔也是对的。但最好不要这么做,原则上memcpy是一种后向拷贝机制:从区间的最后一个元素开始进行拷贝,直到第一个元素。 void* memcpy( void* dest, const void* src, std::size_t count ); memmove   memmove可以支持重合区域的拷贝,其实现可以理解为memmove用另外一块buffer缓存src数据,然后往dst拷贝。但实际上并不是这样,代码在输入时会进行判断:如果src地址小于dst地址,进行后向拷贝;反之如果src地址大于ds…

Read more