Base64 编码

Base64,是一种二进制数据转换为可打印字符的编码。用于一些不支持二进制数据的场景。比如常见的 HTTP 、SMTP 协议是文本协议,其中要传递一些二进制的数据(如:AES算法加密后的数据)时就需要把其转换为文本形式的字符串。Base64编码后的数据有2个特性,其一是文本字符串,其二是这些字符还是可打印的。

二进制转换为普通文本的编码,英文称为:Binary-to-text encoding。也是有很多种形式,除了Base64,还有 BinHex,就是把二进制数据转换为16进制字符串的形式。

阅读剩余部分...

7
Jan 2019
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Logstash 聚合插件 aggregate filter 的使用心得

在ELK常规的使用模式下,我们收集Nginx访问日志是按照单行进行的。这样比如说有10个用户请求,对应在ElasticSearch中就是10条记录(也称为10个document)。下面将分别描述此种收集方法的优缺点。

首先,这样的收集方式非常利于按照指定字段去搜索,并根据匹配的记录去查看其它字段的信息。比如统计客户端IP为 127.0.0.1 的请求有多少,使用IPhone 手机的请求有多少。当出现 499 、502 状态码时,看看这些请求的URL是什么,然后快速定位问题。这些方法都是非常非常实用而且好用的。

其次,除了上面的这些需求之外,我们还想要制作统计图,比如统计按时间范围统计总请求数,4xx 数量,5xx数量,响应时间超过 500ms的请求数,输出的字节数量,平均响应时间。特别是最后2项,时间范围跨度越长,数据量越大,计算时间就越长。据我们实际使用中的数据量,单个索引,每天 3亿的文档数量,对应就有120G左右的数据,在单个dashboard中同时展示上面的几种图标,如果时间跨度超过1小时,页面加载时间就会超过 2s 。而kibana又提供了自动刷新功能,这样如果有多个人同时使用 elasticsearch就会咔咔的慢。

阅读剩余部分...

28
Dec 2018
AUTHOR WiFeng
CATEGORY Web,Asset
COMMENTS No Comments

全局唯一 ID 如何生成?

ID 生成,提到这个词可能最快想到的就是 MySQL 数据库 insert 时的自增ID。当业务访问量剧增,单表的 insert 性能遇到瓶颈时,我们就必须使用分库、分表机制来分担这些负载到单个MySQL表上,但是我们都知道MySQL表中的主键自增是基于单表的,如果2个表中有2个自增字段,那他们默认都是从1开始自增,每次增加步长为1,那么这在有些业务场景下就不满足需求了。比如订单系统,必须要保证订单ID是全局唯一的,也就是所有订单库、表中的ID不能相同,不能用2个相同的订单ID代表不同的订单信息。

那么,我们有没有办法来解决这个问题,那肯定是有的,我想所有的方案不外乎这3种,第一,直接使用MySQL来解决,第二,依赖其他中间件生成唯一 ID(比如 redis),第三,业务中使用算法实现唯一ID。我们接下来分别来阐述这3种不同的解决方案,及其对应的优缺点。

阅读剩余部分...

28
Dec 2018
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Redis Replication 实现原理

    对于 Master/Slave 模式,在我们常用的Mysql中你一定有或多或少的了解,应该知道它的一些价值,比如灾备、读写分离。就灾备一项就足以使我们必须使用它,因为一旦服务器软硬件故障,可能造成数据永不可恢复。你可能会说,可以提前做好数据文件备份,但是要远比修改一个 IP 更加复杂与时间开销更大。在Master/Slave 模式下还可以结合LVS/Keepalived 实现故障自动转移,使其具体业务方无感知。

    在 Redis 2.8 版本之前,Master/Slave 之前只支持全量同步(full resync),从 2.8版本开始支持了部分重同步(partial resynchronization),使得在短暂的网络中断恢复后,不需要进行全量数据同步,而是只同步最近新增的数据即可。那么如何理解这个“短暂”,其实是取决于配置参数与实际场景,下面将带大家一起抽丝剥茧,找出真相。

阅读剩余部分...

11
Dec 2018
AUTHOR WiFeng
CATEGORY Redis
COMMENTS No Comments

Javascript Ajax 跨域之 CORS 实战

众所周知,在javascript中使用ajax请求外部资源时有跨域限制。我们在讲解实战之前有必要搞清楚浏览器为什么要加这个限制,也就是要知其然也需要知其所以然。

不过,我们还应该先了解Cookie,在一个已经登录过的站点,浏览器会保存一个登录凭证,这个凭证就是保存在cookie中的其中一个值。有了登录凭证,在短时间内是不需要重新登录就可以访问该站点上属于用户的任何内容的。当我们登录了一个站点A,上面有一个按钮,其中显示“抽奖”,你也许会去点一下碰碰运气。但是这个抽奖按钮实际执行的动作也许你并不能从页面信息中准确无误的获取到,那如果这个按钮的背后行为是从你的银行账户转出一笔金额到一个盗窃者账户,现在你还敢点那个按钮吗? 

阅读剩余部分...

18
Nov 2018
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

Redis Cluster 实现原理

1. 简介

Redis Cluster 是 Redis 官方提供的集群模式。在Redis 3.0 版本开始支持,是在原有的 Redis 版本中增加了集群相关的实现,是同一个项目。Redis Cluster 方式各个节点其实是一样的,都是Redis节点,本身支持执行Redis的所有命令,也是数据的存储节点,只是额外支持一些 Cluster 命令。但是 Redis Sentinel 模式中,Sentinel 则是一个全新的角色,并不是数据的存储节点,不允许执行常规的 set / get / inc 等操作,主要运用于故障检测、故障发现、故障转移这些场景。

在之前的一篇文章中记录了关于 Redis Cluster 的学习笔记,其中是按照程序执行顺序编排的,也包括了一些细节方面的说明,对于研究 Redis 源码的同学可能有帮助,基本每一小节内容对应源码中的一小段程序。而这篇文章将是以一个使用者的角度去理解 Redis Cluster,所以更加宏观一些,某些细节可能就不会提到。关于细节可以参考:Redis Cluster 学习笔记

阅读剩余部分...

19
Oct 2018
AUTHOR WiFeng
CATEGORY Redis
COMMENTS No Comments

Redis Cluster 学习笔记


  1. 启动节点
  2. 通过命令配置集群(a. 加入节点  b. 分派slot  c. 添加slave)
  3. 接受命令处理
    1. 根据key,转发到不同的节点
    2. 特殊的标记{…},可以分派key到相同的节点,{} 不能在key的结尾。如果有{…} ,hash算法则使用{与}中间的字符串来计算,所以一定要在{}中间有字符,不然所有的key将会分配到一个节点。
    3. 命令中有多个key,如果这些key不在相同的slot(即使在相同的节点也不行),则返回错误(getNodeByQuery)
    4. 根据key获取节点(getNodeByQuery)

阅读剩余部分...

30
Sep 2018
AUTHOR WiFeng
CATEGORY Redis
COMMENTS No Comments

搭建调用链路监控系统

现在微服务非常盛行的年代,在公司内,有各种各样的微服务相关的实践。今天我们不展开微服务具体是什么,只需要了解在一个互联网服务系统内部可能是由N多个子服务组成,每个子服务独立开发、部署、维护,通过API/RPC与其他服务通信,而不是直接共同操作相同的数据库、表来实现数据交互。在这样的架构之下,服务间的调用链路关系可能是这样的:

a -> b -> d -> e
a -> c -> d -> b -> f

以这个单向的调用为例,实际场景可能是更加复杂的网状形式。比如 a 是对用户提供服务,其内部的2个功能分别会有2个不同的调用链路。这时如果 a 检测到一个错误发生,那么怎么确定是 a 自身异常导致的,还是由于上游服务 b/d/e 异常导致的。如果不能很好的、快速的定位最根本的异常产生在哪里,那么势必会影响故障恢复时间,进而影响到服务的可用性。

阅读剩余部分...

5
Jun 2018
AUTHOR WiFeng
CATEGORY Web
COMMENTS 7 Comments

搭建ELK日志监控平台那些事

ELK 是 elasticsearch / logstash / kibana 这三个英文单词的缩写,也即表明,这个技术栈中包含这三个组件,都是一家公司出品(www.elastic.co)。

kibana 负责展示,数据从elasticsearch中获取 
logstash 负责收集并解析日志数据,然后输出指定格式到elasticsearch
elasticsearch 负责保存数据,并提供检索功能。

这些组件可以在具体场景中按需组合使用,也可以单独使用。其中最有名气的当属 elasticsearch,是基于 Lucene 实现的高可用,高性能的搜索服务。现在,众多中大型企业级搜索就是使用的它,值得我们去好好学习一下。

阅读剩余部分...

23
May 2018
AUTHOR WiFeng
CATEGORY Asset
COMMENTS No Comments

Redis Sentinel 高可用原理

现在 B/S C/S 架构的软件系统设计时,我们通常需要把服务端设计为高可用系统,比如 3个9(99.9%),4个9(99.99%),5个9(99.999%)。这是由于随着用户请求量的增加,服务端系统需要处理的事务会增加,进而可能会导致服务端系统无法快速、正确响应用户请求,使得用户体验变得非常糟糕。最终可能会使得用户流失,对广告、会员等这部分收入产生严重影响。另外,Redis作为基础组件,一旦出现故障,可能会使得好多业务出现异常。因此高可用是非常有必要的,也是一个软件开发者应该具备的基本能力之一。

阅读剩余部分...

20
Apr 2018
AUTHOR WiFeng
CATEGORY Redis
COMMENTS 2 Comments