kafka消息与同步机制


如上图所示:Producer根据指定的partition方法(默认round-robin、hash等),将消息发布到指定topic的partition里面;kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否被消费;Consumer从kafka集群pull数据,并控制获取消息的offset。
下面讨论以下Kafka如何确保消息在producer和consumer之间的传输。producer与consumer有可能的delivery guarantee:

  • At most once 消息可能会丢,但绝不会重复传输
  • At least one 消息绝不会丢,但可能会重复传输
  • Exactly once 每条消息肯定会被传输一次且仅传输一次,很多时候这是用户所想要的

Continue reading "kafka消息与同步机制"

Kafka几个重要的配置总结

注意:配置基于Kafka 0.8.2.1

broker配置

#非负整数,用于唯一标识broker
broker.id 0

#kafka持久化数据存储的路径,可以指定多个,以逗号分隔
log.dirs /tmp/kafka-logs

#broker接收连接请求的端口
port 9092

#指定zk连接字符串,[hostname:port]以逗号分隔
zookeeper.connect

#单条消息最大大小控制,消费端的最大拉取大小需要略大于该值
message.max.bytes 1000000

#接收网络请求的线程数
num.network.threads 3

#用于执行请求的I/O线程数
num.io.threads 8

Continue reading "Kafka几个重要的配置总结"

ElasticSearch数据迁移

使用 https://github.com/taskrabbit/elasticsearch-dump

安装npm后使用 npm install elasticdump -g 安装。

使用参考:

ES=http://search-es-0.search-es.app.svc.cluster.local:9200
ED=http://es-0.es.infra.svc.cluster.local:9200

for index in `curl -s -XGET $ES/_cat/indices?h=i`
do
    # settings, analyzer, data, mapping, alias, template
    echo "elasticdump --input=$ES/$index --output=$ED/$index"
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=settings --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=analyzer --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=alias --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=template --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=mapping --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    elasticdump --input=$ES/$index --output=$ED/$index --limit=10000 --type=data --searchBody '{"query": { "match_all": {} }, "stored_fields": ["*"], "_source": true }'
    echo ""
done

 

Continue reading "ElasticSearch数据迁移"

regex – 如何在Go中执行不区分大小写的正则表达式?

可以将不区分大小写的标志设置为正则表达式中的第一项。

你这样做通过添加(?i)到正则表达式的开头。

reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \\._-]", -1))

对于一个固定的正则表达式它看起来像这样。

r := regexp.MustCompile(`(?i)CaSe`)

有关标志的更多信息,请搜索syntax documentation中的术语“flags”。

Continue reading "regex – 如何在Go中执行不区分大小写的正则表达式?"

正则表达式或("|")匹配优先级控制

最近在使用阿里云的日志服务,其中比较灵活的地方是支持自定义正则匹配,可以使用正则匹配字段,也可以作为多行日志的条件。公司的日志格式没有一个统一的标准,大概有几十种日志格式,还好我的正则原本玩得666,否则我们这日志部署到阿里云日志服务上可能一般人得玩累死。

匹配多行日志开始头(单行亦如此)的正则格式如下:

(^\[[A-Za-z]+|^\[\d{4,}|^\d{4,}|^\[\d{1,2}\-\w+\-\d{2,}|^\d+\.\d+\.\d+\.\d+|^time=).+

匹配日志内容的正则格式如下:

(.*?((\d{4}[-/\.]\d{2}[-/\.]\d{2}|\d{1,2}[-/\.][A-Za-z]{3,}[-/\.]\d{4})[:\sT-]*\d{0,2}:{0,1}\d{0,2}:{0,1}\d{0,2}\.{0,1}\d{0,9}[\sZ]{0,1}[\+-]{0,1}[:\d]*|\d{10}).+)

Continue reading "正则表达式或("|")匹配优先级控制"