如上图所示为一个高可用处理大批量应用日志的模型,系统应用日志数据通过对应语言的mongodb客户端进行收集输入到mongo集群 路由服务器 ,路由服务器根据 配置中心集群 将日志数据根据设置的 片键 路由到各个 分片集群 。下文将对该模型进行逐步说明如何搭建。
分片集群
针对大批量的系统应用日志,存在单节点无疑难以保证数据的高可用性,若节点因一些不可避免的原因(如停电,磁盘损坏)挂掉则影响正常使用。搭建主从结构则是一个不错的选择,搭建主从结构可参考 前篇文章 。
然而单个主从结构并无法应付大批量的数据,随着系统运行时间的推移,数据逐日增长。单个主从集群会逐步膨胀一致饱和,直到饱和的时候再进行扩展则显得有些为时已晚。何不趁早进行分片处理。类似于我们常用的关系型数据库mysql进行分库分表存储。庆幸的是mongodb在进行分片的时候并不像mysql分库分表需要我们借助第三方工具,而mongodb已经为我们提供了一定的分片路由能力。我们只需要搭建若个主从结构集群以接入配置服务中心。
此处需要说明的是,搭建分片集群的时候,我们有必要在配置文件中标识集群角色为分片服务集群,如下
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
net:
port: 27017
# bindIp: 10.5.204.86 # Listen to local interface only, comment to listen on all interfaces.
replication:
replSetName: rs2
oplogSizeMB: 1024
sharding:
clusterRole: shardsvr #此处为重点
配置集群
如图中所示的CS1,CS2即为我们的配置中心集群。对于配置中心集群,在安装好mongodb后我们需要修改配置文件如下:
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
net:
port: 27017
# bindIp: 10.5.204.86 # Listen to local interface only, comment to listen on all interfaces.
replication:
replSetName: cs #集群名字
oplogSizeMB: 1024
sharding:
clusterRole: configsvr #标识该集群为配置服务
初始化配置中心与前面的普通主从集群一样。不过需要在集群信息中需要体现出配置标识被激活,可通过如下命令方式补全
rs.initiate();
rs.reconfig({
_id: "cs",
configsvr: true,
members: [
{
_id: 0,
host: "10.5.204.73:27018",
priority: 2
},
{
_id: 1,
host: "10.5.204.73:27017",
priority: 1
}
]
});
其中 configsvr:true 信息不可缺少,两个节点则是对应配置服务集群的节点信息.
路由服务
可以在指定目录下创建mongos.conf文件,内容如下
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongos.log
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongos.pid # location of pidfile
# network interfaces
net:
port: 27019
# bindIp: 10.5.204.86 # Listen to local interface only, comment to listen on all interfaces.
sharding:
configDB: cs/10.5.204.73:27017,10.5.204.73:27018 #此处为标识配置服务集群信息
使用如下命令启动路由服务
/usr/bin/mongos -f /etc/mongos.conf
接下来便可以在配置路由服务中添加分片集群,例如
use admin;
#添加分片集群信息
db.runCommand({addshard:"rs3/10.5.204.84:27017,10.5.204.84:27018"});
片键设置
在客户端登录mongos,登录方式与普通的mongo服务一样.运行如下命令
use admin;
#指定对log数据库开启分片功能
sh.enableSharding('log');
#对log数据库中的log集合的level字段进行hash分区
sh.shardCollection("log.log",{level:'hashed'}})
此处用作测试时将选择日志的级别作为片键仅供参考。
测试
在系统中集成mongodb收集日志时,仅需配置mongos服务的信息作为应用mongodb配置。日志则会将不同级别的日志自动路由到各个分区。