使用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,并对其他节点的实例进行管理,或许可以实现一些大数据方面的潜能,梦想可能会变得更加广阔。

广告
将在 10 秒后关闭
bannerAds