西维蜀黍

【Cache System】Redis Cluster

Redis Cluster

Redis Cluster 是Redis3.0之后,官方提供的Redis集群解决方案,由 Redis 官方团队来实现。

在3.0之前,为了解决容量高可用用方面的需求,基本上只能通过客户端分片 + Redis sentinel或者添加 proxy(twemproxy、codis)方案解决。

Redis Cluster最大的特性,就是对Redis集群提供了水平扩展的能力(horizential scalibility),即当整个 Redis 集群出现存储容量或者性能 bottleneck 时,使用 Redis Cluster 可以通过增加新的 master Redis node从而快速解决bottleneck。

除此之外,Redis Cluster提供了强大的高可用机制(即 failure failover)。即当集群中任何一个master Redis node无法正常工作时(比如因为底层依赖的硬件故障、网络问题),它对应的 slave Redis node就会自动代替它(当然,这里有一个前提,是我们设置了slave Redis node)。

与Codis 和 Twemproxy 不同的是:Redis Cluster并非使用Porxy模式来连接集群节点,而是使用无中心节点的模式来组建集群(即没有coordinator)。

Redis Cluster实现在多个节点之间进行数据共享,即使部分节点失效或者无法进行通讯时,Cluster仍然可以继续处理请求。若每个主节点都有一个从节点支持,在主节点下线或者无法与集群的大多数节点进行通讯的情况下, 从节点提升为主节点,并提供服务,保证Cluster正常运行。

  ...


【Cache System】Redis 集群方案

Redis 集群方案

Redis 的集群解决方案有社区的,也有官方的,社区的解决方案有 Codis 和Twemproxy。

Codis

Codis 由我国的豌豆荚团队开源

Twemproxy

Twemproxy 由Twitter团队开源。

  ...


【Redis】Codis Pipeline

codis proxy 处理 “pipeline” 的逻辑:只是在从client 到proxy 有效率的提升(因为使用一次 pipeline意味着只有一次RTT)。而从 proxy 到 redis node的这个过程,依然是对 pipeline 中的每个命令串行地分别进行处理,即使这些命令对应的key位于不同的slot。

By right,可以实现成当这些命令对应的key位于不同的slot,以slot为单位异步地去执行,以如果有两个命令,他们对应的key位于不同的slot,则这两条命令会被并行的去执行,而当他们对应的key位于同一个slot,则自然而然地串行的去执行(因为Redis是单线程的)。

  ...


【Mattermost】webhook

Incoming Webhooks

Mattermost supports webhooks to easily integrate external applications into the server.

Use incoming webhooks to post messages to Mattermost public channels, private channels and direct messages. Messages are sent via an HTTP POST request to a Mattermost URL generated for each application and contain a specifically formatted JSON payload in the request body.

  ...


【ELK】ELK(Elasticsearch+Logstash+Kibana)学习

日志服务

日志服务是我们应用程序后端不可或缺的一个组件,通常我们会组合使用 ELK(Elasticsearch+Logstash+Kibana)技术栈来自行搭建一个日志存储和分析系统。

  ...


【Lucene】Lucene 语法

Kibana使用的查询语法是Lucene的查询语法。

  ...


【MySQL】将执行结果输出到文件

Approach 1

mysql> select count(1) from table  into outfile '/tmp/test.log';

Query OK, 31 rows affected (0.00 sec)

在目录/tmp/下会产生文件test.xlog

遇到的问题:

mysql> select count(1) from table into outfile '/tmp/test.log';
ERROR 1 (HY000): Can't create/write to file '/tmp/test.log' (Errcode: 13)

原因:mysql User没有向/tmp/下写的权限。

  ...


【Golang】通过私有库安装依赖

Situation

公司一个 Golang 的项目,使用到了公司的私有仓库,去执行go mod tidy(下载依赖)的时候,到download公司私有库的时候就报错,报错信息也不明显,只是提示找不到影响版本unkown revision。

  ...


【Golang】使用 - 生成随机数

GoLang 中的伪随机数

在GoLang 中,我们可以通过 math/rand 包里的方法来生成一个伪随机数:

package main

import (
  "fmt"
  "math/rand"
)

func main() {
  fmt.Println(rand.Int())   // => 5577006791947779410
}

上面的代码中,我们通过 rand.Int() 方法来生成一个伪随机数。看起来好像没什么问题嘛,人家也很 OK 啦。

但是细心的你会发现。无论你运行多少次,它都会生成一样的结果。

我们知道 JavaScript 中的 Math.random() 每次都会返回一个不一样的数字,但是 GoLang 中的伪随机数生成器默认情况下竟然会返回相同的数值,这还不反了天了?

都是伪随机数生成器,为什么差别就这么大呢?这里我们就要了解一下“随机种子”的概念啦。

  ...


【Git】忽略已经提交的文件

​

Situaion

在初始化git仓库的时候,没有创建.gitignore文件来过滤不必要提交的文件,后来却发现某些文件不需要提交,但是这些文件已经被提交了。

这时候创建.gitignore文件并添加对应规则以忽略这些文件,就会发现,对这些文件的修改仍然会被 track到,即忽略ignore的规则对那些已经被track的文件无效。

其实.gitignore文件只会忽略那些没有被跟踪的文件,也就是说ignore规则只对那些在规则建立之后被新创建的新文件生效。

因此推荐: 初始化git项目时就创建.gitignore文件。

  ...