Qmeta: RabbitMQ元数据备份工具

RabbitMQ的元数据泛指服务器端的Exchange、Binding、Queue、Vhost、Policy、账户、权限等定义信息。对元数据进行备份有两个好处:

1. 队列迁移。可以直接导入,不必所有信息重新输入。
2. 故障恢复。『单机磁盘故障引发RabbitMQ镜像队列数据丢失』一文中分析了镜像队列数据丢失的场景,如果元数据进行过备份的话,可以快速恢复服务。

RabbitMQ管理插件本身提供了元数据备份的API(GET /api/definitions),关键是如何高效地备份,特别是当手上有上百个RabbitMQ节点需要运维的时候。

Qmeta是我用Go写的一个RabbitMQ元数据备份小工具,它支持批量备份元数据,并以json的形式存储在备份目录下。

使用方式:
1. 构建

$ git clone git@github.com:fengchj/ftool.git
$ cd ftool/qmeta
$ go build 

2. 使用

$ qmeta -h
Usage of qmeta:
  -file="config": config file contains RabbitMQ node addrs.
$ cat config
127.0.0.1:15672 guest guest
10.20.30.40:15672 guest guest
$ qmeta -file config
Host 127.0.0.1 backup done!
Host 10.20.30.40 backup done!
$ cd qmeta_{time-in-second}
$ ls -l
127.0.0.1.json
10.20.30.40.json

简单介绍下Qmeta的实现:

1. flag包解析配置文件路径。
2. 每个节点的备份任务交给独立的goroutine处理。
3. net/http包发送HTTP GET请求,设置连接超时参数Timeout。
4. 所有goroutine共享http.Client实例,协程安全。
5. 使用带缓冲区的channel来实现主程序和goroutine的同步,当所有goroutine返回后,安全关闭channel。
6. 协程在defer语句中进行channel数据写入,以此来保证是否备份成功,goroutine都会返回。

--EOF--