使用知乎kids日志系统

󰃭 2016-08-01

KIDS项目介绍:https://github.com/zhihu/kids

kids是知乎开源的分布式日志聚合系统,是「Kids Is Data Stream」的递归缩写,采用 Scribe 的消息聚合模型和 Redis 的 pub/sub 模型。有以下特点:

1.实时订阅

2.分布式收集、集中存储

3.多线程模型

4.使用redis协议

5.无第三方依赖

一.kids安装

wget https://codeload.github.com/zhihu/kids/tar.gz/1.0.0
tar -zxvf 1.0.0
cd kids-1.0.0/
./autogen.sh 
./configure # –prefix=/your/path 
make 
make test #optional 
make install

默认情况下,kids会被安装到/usr/local/bin/kids下,如果需要按照在别的目录下,使用 –prefix 选项设置指定的安装位置,运行 ./configure –help 获取更多设置选项。

二.启动kids

kids的启动方式很简单kids -c xxxx即可。

三.关于配置文件

nlimit pubsub 32MB 16MB 10min;                                                                      
worker_threads 3; # worker线程的数量,server除此之外还会有1个负责调度的master线程和1个storer线程,对于 agent 一般只需要一个工作线程,将其设为 CPU 核数 – 1 能最大化 server 的处理能力
max_clients 20; # 每个host的最大连接数,当 host 的连接数超过该值后,新建立的连接会被强制 close

log {
	level info; # Kids 自身的 log 等级,Level 可以根据以下状态设置debug, info, warning, error, critical, fatal。Debug 模式需要在编译时定义 LOGDEBUG
	file /data/logs/kids/kids.log; #日志文件的存放位置, 设置为 stderr 会直接输出至命令行
}

listen {
	host 127.0.0.1; # 监听host(本机这个可以不写)
	port 9876; # 监听端口
	socket /data/logs/kids/kids.sock;
}

store file { # 日志存储方式
	path /data/logs/kids/[topic]/[date];
	name [time].log;
	rotate 1hour; # 时间单位支持hour与min
   # 采用该配置后,kids 会将日志按照 /topic/date/time.log 的形式存储,每小时进行一次文件的切分
}

关于其他配置文件中的配置

1.网络存储,将日志通过网络转发给指定机器

store network {
   host xxx;
   port xxx;
}

2.空存储,不会对指定的日志进行任何存储,可与其它存储组合对指定日志进行过滤

store null {
   topic kids.inoretopic; # 忽略kids.inoretopic的存储
}

3.日志按照配置文件中的顺序尝试存储,如果某一存储方式存储成功,则不再继续对该日志进行后续存储 采用该配置后 kids 会忽略 kids.ignoretopic1 与 kids.ignoretopic2 的存储,对于其他 topic,会转发至 kidsserver:3388,若转发失败,会保存到指定文件中。

store priority {
	store null {
		topic kids.ignoretopic1;
		topic kids.ignoretopic2;
	}
	store network {
		host kidsserver;
		port 3388;
	}
	store file {
		path /path/to/logs/[topic]/[date];
		name [time].log;
		rotate 1hour;
	}
}

4.BufferStore 使用 Primary 与 Secondary 两级存储, 当 Primary 存储出现异常时,会将日志缓存至 Secondary 存储中,当 Primary 恢复后,会将 Secondary 中的缓存重新存储至 Primary

store buffer {
	store network primary { # primary
		host kidsserver;
		port 3388;
	}
	store file secondary { # secondary
		path /data/kidsbuf;
		rotate 5min;
	}
}

5.MultipleStore 会将日志存储至多个位置,通过定义 success 的类型,判断存储的成功与失败。 success 的值可选 any 或者 all。

store multiple {
	success any;
	# master
	store buffer {
		store network primary {
			host kidsserver;
			port 3388;
		}
		store file secondary {
			path /tmp/kidsbuf;
			rotate 10min;
		}
	}
    
	# backup
	store buffer {
		store network primary {
			host kidsbackup;
			port 3388;
		}
		store file secondary {
			path /tmp/kidsbuf2;
			rotate 10min;
		}
	}
}