先扯点蛋
公司有个项目要求使用InfluxDB时序数据库储存点东西。第一次听说还有这种数据库,哈哈哈,孤陋寡闻了,先从各位大佬的博客看起,慢慢学习,逐渐了解了之后在服务器上进行安装。直接使用官方包进行安装很简单,查看官方说明即可。安装之后使用才发现,开源的只支持单机版的,但是公司用不能这么low吧,怎么也要“高可用”一点,于是自己参考MySQL主从复制原理、半同步操作步骤及原理和饿了么 Influxdb 实践之路,做了InfluxDB主从系统。
客户端系统
客户端系统拓扑图
这个系统主要是用来从kafka获取数据源,经过处理之后存到InfluxDB中去,这里参考了「饿了么」那篇文章,但是我看过他们的源码,基本上搞不懂,就根据文章的描述搞了一个简陋版的东西吧,这里涉及到kafka和influxdb-java,项目源代码可以看这里。该项目启动运行参考其中的README。
InfluxDB主从同步系统
InfluxDB同步系统
主从同步架构,是简陋版的MySQL主从同步。脚本读取InfluxDB的增删改操作日志,使用脚本将记录写入从机中。经过测试,运行状况良好,只要主从机不挂,同步系统可以健康运行。
同步脚本使用Python编写,项目源代码在这里。该项目启动运行参考其中的README。
为什么使用Python脚本来编写主从同步代码?
- 主要是考虑到降低与数据库的代码耦合程度,InfluxDB源码如果出现大规模的升级改动,同步脚本只需略作修改就可以了。
- 毕竟Python是世界上**的语言。?
InfluxDB源码修改
下载源码
在github上下载InfluxDB源码(这里使用的是我的fork地址,已经修改好的源码)。
修改源码
由于脚本需要读取InfluxDB的增删改操作日志,需要对源码中这一部分操作的日志进行修改,方便脚本解析日志。官方版的日志不记录写入操作的数据值,所以需要我们自己修改源码中对应的记录写日志的地方。
修改文件influxdb/services/httpd/handler.go
// 记录日志的具体方法 func buildLogLine(l *responseLogger, r *http.Request, start time.Time, body string) string { redactPassword(r) username := parseUsername(r) host, _, err := net.SplitHostPort(r.RemoteAddr) if err != nil { host = r.Rem