如上图所示为一个高可用处理大批量应用日志的模型,系统应用日志数据通过对应语言的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配置。日志则会将不同级别的日志自动路由到各个分区。