使用fluentd和MongoDB构建日志服务器
使用Fluentd和MongoDB搭建了一个日志服务器。所有数据都在此处可得。
如果能實現的話,設定其實很簡單,但碰到了一些問題,所以我稍微寫一點。
暂时先根据以下规则进行设置。
-
- ポート 24224 でまちうけ
-
- ログは MongoDB の fluentd データベースにつっこむ
fluentd で処理対象にするタグは node ではじまるもの
Node.js からのログを想定
このときに使う MongoDB ユーザーは readWrite ロールの logger ユーザー
できるだけ権限を限定する
ログ解析するときは dbOwner ロールを持つ fluentd ユーザーを使って MongoDB にもぐる
MongoDB 是一种面向文档的数据库管理系统。
安装和设置
可以从epel安装,但是版本较旧,建议从官方的yum仓库中获取。可以参考这些,然后进行操作。
设置仅启用了身份验证,其他都是默认值。顺便说一下,看到从2.6版本起可以用yaml进行配置,但是可能写错了,没有完全读懂。示例还是旧的,算了,总有一天会搞定的,所以就不管了。
修改配置后启动mongod。
添加管理用户
当启动mongod时,使用–auth选项,或者在配置文件中写入auth=true,即可启用认证。如果重视性能等方面的考虑,可能不应该使用它,但目前就先使用认证。
在启动后的首要事项是添加管理员用户。如果没有用户注册,似乎可以从本地连接而无需验证,但是如果有任何用户注册,则必须通过验证才能执行任何操作。
创建一个名为root的用户,该用户具有在admin数据库中具有root角色的权限。请准备以下文件:mongo admin mongodb-admin.js。
/*
* Usage
* mongo admin mongodb-admin.js
*
* A script to add administration user
* */
var USERNAME = 'root';
var PASSWORD = 'root';
// Check if user is registered
var authed = db.auth(USERNAME, PASSWORD);
if (authed === 1) {
quit();
}
// Register user
db.createUser({
user: USERNAME,
pwd: PASSWORD,
roles: [
{
role: 'root',
db: 'admin'
}
]
});
只要先记录下来mongo -u root -p root –authenticationDatabase admin,就算以后遇到问题,也能通过这个进行配置更改。
流畅的推导
添加用户到MongoDB。
首先,在 MongoDB 中添加一个用户。写个这样的脚本会很方便。
/*
* Usage
* mongo fluentd fluentd-users-mongodb.js -u root -p root --authenticationDatabase admin
* */
// User definitions to register
var newUsers = [
{
user: 'logger',
pwd: 'logger',
roles: [
{
role: 'readWrite',
db: 'fluentd'
}
]
},
{
user: 'fluentd',
pwd: 'fluentd',
roles: [
{
role: 'dbOwner',
db: 'fluentd'
}
]
}
];
// Check if initial settings are done
var currentUsers = db.getUsers();
if (currentUsers.length === newUsers.length) {
quit();
}
// Drop users for database
db.dropAllUsers();
// Add users
for (var i = 0, length = newUsers.length; i < length; ++i) {
db.createUser(newUsers[i]);
}
所以,这样启动。很长。
mongo fluentd fluentd-users-mongodb.js -u root -p root --authenticationDatabase admin
安装
在安装之前,要进行NTP的设置、增加文件描述符数量,还要确保TCP连接数量不会溢出等等。好像要非常充分地利用这些资源。
所以,使用Yum从RPM安装。能够通过Yum进行统一管理更加方便。
设定
将所有的配置内容写入 /etc/td-agent/td-agent.conf 文件。稍后再用 “include” 进行分隔。实际运行的配置在这里。
首先,设置期望的端口。
# Listen at the port 24224
<source>
type forward
port 24224
</source>
所以,指定处理数据并进行 MongoDB 写入设置。
# from Node.js
<match node.**>
type mongo
host localhost
port 27017
database fluentd
user logger
password logger
collection app
flush_interval 1s
</match>
只要启动fluentd,它就会快速地摄取日志信息。
确认动作
我想在 Node.js 端使用 fluent-logger-node 进行测试。
var logger = require('fluent-logger');
logger.configure('node', {
host: '192.168.50.120',
port: 24224,
timeout: 3.0
});
logger.emit('info', { test: 'test data' });
把这样东西制作出来。
npm install fluent-logger
node fluentd-test.js
我要在日志服务器的一侧查看一下。
mongo fluentd -u fluentd -p fluentd --eval 'db.app.find()'
{ "_id" : ObjectId("5402c483dd3aa90a27000001"), "test" : "test data", "time" : ISODate("2014-08-31T06:45:23.046Z") }
有什么事情发生了!
思考之处
据说 MongoDB 有一个功能称为分片,可以将多个实例集中管理为一个实例。通过在服务器上启动 mongos 代替 mongod,并对其他节点的实例进行管理,或许可以实现一些大数据方面的潜能,梦想可能会变得更加广阔。