使用ebpf跟踪rpcx微服务

ebpf是一种创新的革命性技术,它能在内核中运行沙箱程序, 而无需修改内核源码或者加载内核模块。将 Linux 内核变成可编程之后,就能基于现有的(而非增加新的)抽象层来打造更加智能、 功能更加丰富的基础设施软件,而不会增加系统的复杂度,也不会牺牲执行效率和安全性。

BPF的第一个版本在1994年问世。我们在使用tcpdump工具编写规则的时候其实就使用到它了,该工具用于查看或”嗅探”网络数据包。

阅读全文

使用visual studio code开发Go程序

在visual studio code 1.0发布之前我也曾多次尝试使用visual studio code开发Go程序,但是都放弃了,一是Go的插件还没发布或者不完善,而是vscode还不是那么方便,所以我一直使用atom + goplus + godebug编写Go的代码,而且用起来也非常的顺手方便。 现在vscode 1.0发布了,而且支持10种本地化语言,我尝试使用它编写Go程序,功能和性能都不错,所以目前atom和vscode都是我的菜。

本文简单介绍一下使用vscode开发Go的一些配置,速览vscode + Go 的功能。

阅读全文

uriDB网站的可扩展的技术栈

背景

uriDB本身不生产干货,uriDB技术流网站只是大自然的搬运工。
Hacker News诞生依赖,已经有多个中文技术头条的网站了,比如开发者头条极客头条,为什么还要做这样一个雷同的头条网站呢?

有两个原因:
一是我想做一个分类头条的网站,按照技术领域对文章进行分类,这样只对前端感兴趣的同学可以只跟踪最新的前端文章。 同时uriDB只会筛选最新的技术干货,不会将问答,闲聊等技术层次低的文章收录。
二是这么多年来,我涉及的领域包括后台,大数据,前端和移动端的技术也是我感兴趣的领域。心中那份对技术的持久的热情,促使我将多年的技术积累以某种具体的形式呈现出来,籍此展示并能持久的进行技术架构的演化。

因此,uriDB技术流网站也就孵化出来了。虽然目前的访问量比较少,但是看的用户数和访问量在逐步的提升,也是一件令人欣慰的事。至少,这个网站收集的干货也为那些执着学习的同学带来些许的便利和技能提升。

与其说uriDB类似Hacker News网站, 还不说说它类似今日头条, 只不是今日头条上全是新闻类的内容,而uriDB上全是技术干货。今日头条会将目标网站上的内容抓去过来进行重新排版,更加适合阅读。我也抓去了目标文章的内容,却没有进行重新排版显示,主要是考虑到了版权的问题,还是老老实实的做Hacker News一样的转发。

这个网站是2015年国庆节期间开始启动的,也是作为我的side project在维护。我会时不时的将我的新的想法,技术灵感应用于这个网站上。

阅读全文

使用Go开发一个 Slack 运维机器人

受湾区日报的自动化机器人启发:湾区日报的第一个“员工”:Slack/Hubot, 我决定为自己的 side project 写一个自动化的slack运维机器人。

uriDB技术流是一个搜集高质量技术文章的网站。主要是由爬虫到一些技术站点寻找关注度高的技术文章,以及一些技术聚合站点的高质量的文章,我也会发一些平常自己看到的技术文章。uriDB也允许用户注册发布文章。

因为这是自己的 side project, 我不会将精力全部放在这个项目上。 如果有一个机器人,可以方便的维护这个站点,那么可以极大减少我的工作量。

这个网站后台完全是由 Go 开发的,所以我还是想用Golang实现这个机器人,而没有采用hubot + hubot-slack

目前这个机器人实现了基本的功能:

  • 发表一个文章链接
  • 修改文章的元数据
  • 删除文章
  • 分析一个文章链接

有时间我会将服务器性能监控等功能加上。

阅读全文

基于Golang将MongoDB的数据同步到Elasticsearch

Elasticsearch是一个分布式可扩展的实时搜索和分析引擎。它能帮助你搜索、分析和浏览数据。Elasticsearch 是一个基于Lucene实现的搜索服务器,用Java开发实现。它提供了RESTful web接口,并作为Apache许可条款下的开放源码发布,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

Elasticsearch关键概念

Cluster集群

有相同集群名称的节点Node的集合。集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。


Cluster集群


Node节点

一个elasticsearch运行的实例。其实就是一个java进程。一般情况下,一个节点运行在一台机器上。

Shards分片

代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

Replicas副本

代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

Recovery恢复

代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

River

代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。River在1.5中弃用了,2.0中移除了。

Gateway

代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

Discovery.zen

代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

Transport

代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

Index索引

Elasticsearch用来存储数据的逻辑区域,它类似于关系型数据库中的table概念。一个index可以在一个或者多个shard上面,同时一个shard也可能会有多个replicas。

Document

Elasticsearch里面存储的实体数据,类似于关系数据中一个table里面的一行数据。 document由多个field组成,不同的document里面同名的field一定具有相同的类型。document里面field可以重复出现,也就是一个field会有多个值,即multivalued。

Document type

为了查询需要,一个index可能会有多种document,也就是document type,但需要注意,不同document里面同名的field一定要是相同类型的。

Mapping

存储field的相关映射信息,不同document type会有不同的mapping。

阅读全文