文章
服务器与存储管理
作者:Orgad Kimchi
2013 年 6 月发布
|
本文首先简要介绍 MongoDB,之后给出了一个在基于 x86 的系统上搭建三节点 MongoDB 集群的示例。前提条件是,您应对 Oracle Solaris 区域和网络管理有一个基本的了解。
MongoDB 是一种面向文档的 NoSQL 开源数据库,它将结构化数据存储为具有动态模式的类似 JavaScript 对象表示法 (JSON) 的文档。这就可以实现快速开发,因为随着应用的演变可以快速修改数据库模式,而无需关闭数据库。此外,MongoDB 还支持使用复制集进行主从复制,它还通过分片特性提供横向可扩展性,这让您可以将数据(基于分片密钥)分发到多个 MongoDB 服务器。
以下是使用 Oracle Solaris 搭建 MongoDB 集群的好处:
在本文所示示例中,将使用 Oracle Solaris 区域、服务管理工具、ZFS 和网络虚拟化技术安装所有 MongoDB 集群构建块。图 1 显示了架构:

图 1.架构
本文使用 Oracle Solaris 11.1,您可以从这里下载。
注:现在仅有适用于基于 x86 的系统上的 Oracle Solaris 的版本可用。没有适用于基于 SPARC 的系统的版本。
/usr/local 目录(如果该目录不存在)。集群配置将以只读文件系统的形式跨区域共享 MongoDB 目录结构。root@global_zone:~# mkdir -p /usr/local
/usr/local: root@global_zone:~# cp /tmp/mongodb-sunos5-x86_64-2.4.1.tgz /usr/local
root@global_zone:~# cd /usr/local root@global_zone:~# tar -xvfz /usr/local/mongodb-sunos5-x86_64-2.4.1.tgz
root@global_zone:~# ln -s /usr/local/mongodb-sunos5-x86_64-2.4.1 /usr/local/mongodb
root@global_zone:~# mkdir /usr/local/mongodb/etc
root@global_zone:~# mkdir /usr/local/mongodb/mongo-extra-64
libstdc。请从 http://mirror.opencsw.org/opencsw/allpkgs/libstdc%2b%2b6-4.7.2%2cREV%3d2013.03.28-SunOS5.10-i386-CSW.pkg.gz 下载 libstdc 软件包。libstdc 软件包:root@global_zone:~# gzip -d /tmp/libstdc++6-4.7.2,REV=2013.03.28-SunOS5.10-i386-CSW.pkg.gz
pkgtrans 命令将软件包转换成文件系统格式:The following packages are available: 1 CSWlibstdc++6 libstdc++6 - The GNU Compiler Collection, libstdc++.so.6 (i386) 4.7.2,REV=2013.03.28 Select package(s) you wish to process (or 'all' to process all packages). (default: all) [?,??,q]:
libstdc 库复制到 /usr/local/mongodb/mongo-extra-64/:
root@global_zone:~# cp /tmp/CSWlibstdc++6/root/opt/csw/lib/amd64/libstdc++.so.6.0.17 \ /usr/local/mongodb/mongo-extra-64/
root@global_zone:~# groupadd mongodb
root@global_zone:~# useradd -g mongodb mongodb root@global_zone:~# passwd mongodb
root@global_zone:~# mkdir -p /export/home/mongodb root@global_zone:~# chown -R mongodb:mongodb /export/home/mongodb
| 文件名 | 说明 |
|---|---|
mongodb-start |
MongoDB 后台进程的启动脚本 |
mongodb.conf |
指定 MongoDB 后台进程相关参数的文件 |
注:要详细了解这些配置文件如何控制 MongoDB,请参见 MongoDB 手册。
root@global_zone:~# cd /usr/local/mongodb/etc
mongodb.conf 文件,按表 2 所述设置属性值:root@global_zone:~# vi mongodb.conf fork = true quiet = true logpath = /var/log/mongodb/mongod.log logappend = true replSet = rs0 rest = true
| 属性 | 值 | 说明 |
|---|---|---|
fork |
true |
启用 mongod 的后台进程模式,它是 MongoDB 系统的主要后台进程。它处理数据请求,管理数据格式,并执行后台管理操作。 |
quiet |
true |
这是详细级别的日志。在诊断或测试情况下,将此值设置为 false。 |
logpath |
/var/log/mongodb/mongod.log |
指定 mongod 后台进程写入输出的文件。如果未设置此值,mongod 将所有输出写入标准输出(如 stdout)。 |
logappend |
true |
确保 mongod 不会覆盖跟踪服务器启动操作之后的现有日志文件。 |
replSet |
rs0 |
指定此服务器的关联副本集。 |
rest |
true |
启用 REST 接口,该接口允许 HTTP 客户端对服务器运行命令。 |
root@global_zone:~# vi /usr/local/mongodb/bin/mongodb-start #!/usr/bin/bash export LD_PRELOAD_64=/usr/local/mongodb/mongo-extra-64/libstdc++.so.6.0.17:/lib/amd64/libumem.so export LC_ALL=C /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
root@global_zone:~# chown -R mongodb:mongodb /usr/local/mongodb-sunos5-x86_64-2.4.1 root@global_zone:~# chmod -R 755 /usr/local/mongodb-sunos5-x86_64-2.4.1
为 MongoDB 区域创建一系列虚拟网络接口 (VNIC):
root@global_zone:~# dladm create-vnic -l net0 mongodb_node1 root@global_zone:~# dladm create-vnic -l net0 mongodb_node2 root@global_zone:~# dladm create-vnic -l net0 mongodb_node3
我们应确保使用网络时间协议 (NTP) 同步 MongoDB 区域上的系统时钟。
注:建议选择可以作为专用时间同步源的 NTP 服务器,这样在关闭计算机进行计划维护时不会对其他服务产生负面影响。
在以下示例中,全局区域配置为 NTP 服务器。
root@global_zone:~# cd /etc/inet root@global_zone:~# cp ntp.server ntp.conf root@global_zone:~# touch /var/ntp/ntp.drift
root@global_zone:~# vi /etc/inet/ntp.conf server 127.127.1.0 prefer broadcast 224.0.1.1 ttl 4 enable auth monitor driftfile /var/ntp/ntp.drift statsdir /var/ntp/ntpstats/ filegen peerstats file peerstats type day enable filegen loopstats file loopstats type day enable filegen clockstats file clockstats type day enable keys /etc/inet/ntp.keys trustedkey 0 requestkey 0 controlkey 0
清单 1.NTP 服务器配置文件
root@global_zone:~# svcadm enable ntp
root@global_zone:~# svcs -a | grep ntp online 16:04:15 svc:/network/ntp:default
MongoDB 和 Oracle Solaris ZFS 都是内存密集型进程。为避免 MongoDB 实例出现内存不足,需要通过调低 zfs_arc_max 参数值来减少 ZFS ARC 缓存的内存消耗。
root@global_zone:~# echo "set zfs:zfs_arc_max=2147483648" >> /etc/system
root@global_zone:~# kstat -m zfs -s c_max
module: zfs instance: 0
name: arcstats class: misc
c_max 2147483648
您可以从输出中看到,zfs_arc_max 属性的值现在为 2 GB。(c_max 是 kstat 命令输出中 zfs_arc_max 的值。)
/etc/system 中实施该属性值。root@global_zone:~# reboot
表 3 显示了我们将创建的 MongoDB 区域配置汇总:
表 3.区域汇总| 区域名称 | 功能 | ZFS 挂载点 | VNIC 名称 | IP 地址 | 内存要求 |
|---|---|---|---|---|---|
mongodb-node1 |
主要 | /zones/mongodb-node1 |
mongodb_node1 |
192.168.1.1 | 14 GB |
mongodb-node2 |
辅助 | /zones/mongodb-node2 |
mongodb_node2 |
192.168.1.2 | 14 GB |
mongodb-node3 |
辅助 | /zones/mongodb-node3 |
mongodb_node3 |
192.168.1.3 | 14 GB |
root@global_zone:~# zfs create -o compression=on -o mountpoint=/zones rpool/zones
mongodb-node1 区域,如清单 2 所示:root@global_zone:~# zonecfg -z mongodb-node1 Use 'create' to begin configuring a new zone. zonecfg:mongodb-node1> create create: Using system default template 'SYSdefault' zonecfg:mongodb-node1> set limitpriv="default,sys_time" zonecfg:mongodb-node1> set autoboot=true zonecfg:mongodb-node1> set zonepath=/zones/mongodb-node1 zonecfg:mongodb-node1> add fs zonecfg:mongodb-node1:fs> set dir=/usr/local zonecfg:mongodb-node1:fs> set special=/usr/local zonecfg:mongodb-node1:fs> set type=lofs zonecfg:mongodb-node1:fs> set options=[ro,nodevices] zonecfg:mongodb-node1:fs> end zonecfg:mongodb-node1> add net zonecfg:mongodb-node1:net> set physical=mongodb_node1 zonecfg:mongodb-node1:net> end zonecfg:mongodb-node1> add capped-memory zonecfg:mongodb-node1:capped-memory> set physical=14g zonecfg:mongodb-node1:capped-memory> end zonecfg:mongodb-node1> verify zonecfg:mongodb-node1> exit
清单 2.创建 mongodb-node1 区域
root@global_zone:~# zonecfg -z mongodb-node2 Use 'create' to begin configuring a new zone. zonecfg:mongodb-node2> create create: Using system default template 'SYSdefault' zonecfg:mongodb-node2> set limitpriv="default,sys_time" zonecfg:mongodb-node2> set autoboot=true zonecfg:mongodb-node2> set zonepath=/zones/mongodb-node2 zonecfg:mongodb-node2> add fs zonecfg:mongodb-node2:fs> set dir=/usr/local zonecfg:mongodb-node2:fs> set special=/usr/local zonecfg:mongodb-node2:fs> set type=lofs zonecfg:mongodb-node2:fs> set options=[ro,nodevices] zonecfg:mongodb-node2:fs> end zonecfg:mongodb-node2> add net zonecfg:mongodb-node2:net> set physical=mongodb_node2 zonecfg:mongodb-node2:net> end zonecfg:mongodb-node2> add capped-memory zonecfg:mongodb-node2:capped-memory> set physical=14g zonecfg:mongodb-node2:capped-memory> end zonecfg:mongodb-node2> verify zonecfg:mongodb-node2> exit
清单 3.创建 mongodb-node2 区域
root@global_zone:~# zonecfg -z mongodb-node3 Use 'create' to begin configuring a new zone. zonecfg:mongodb-node3> create create: Using system default template 'SYSdefault' zonecfg:mongodb-node3> set limitpriv="default,sys_time" zonecfg:mongodb-node3> set autoboot=true zonecfg:mongodb-node3> set zonepath=/zones/mongodb-node3 zonecfg:mongodb-node3> add fs zonecfg:mongodb-node3:fs> set dir=/usr/local zonecfg:mongodb-node3:fs> set special=/usr/local zonecfg:mongodb-node3:fs> set type=lofs zonecfg:mongodb-node3:fs> set options=[ro,nodevices] zonecfg:mongodb-node3:fs> end zonecfg:mongodb-node3> add net zonecfg:mongodb-node3:net> set physical=mongodb_node3 zonecfg:mongodb-node3:net> end zonecfg:mongodb-node3> add capped-memory zonecfg:mongodb-node3:capped-memory> set physical=14g zonecfg:mongodb-node3:capped-memory> end zonecfg:mongodb-node3> verify zonecfg:mongodb-node3> exit
清单 4.创建 mongodb-node3 区域
mongodb-zone1 区域;稍后我们将克隆此区域,以提高其他区域的区域创建速度。root@global_zone:~# zoneadm -z mongodb-node1 install
mongodb-node1 区域,并查看所创建区域的状态,如清单 5 所示:root@global_zone:~# zoneadm -z mongodb-node1 boot root@global_zone:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 mongodb-node1 running /zones/mongodb-node1 solaris excl - mongodb-node2 configured /zones/mongodb-node2 solaris excl - mongodb-node3 configured /zones/mongodb-node3 solaris excl root@global_zone:~# zlogin -C mongodb-node1
清单 5.启动 mongodb-node1 区域
mongodb-node1 区域的以下配置提供区域的主机信息:mongodb-node1。mongodb_node1 的网络接口 IP 地址是 192.168.1.1/24。/etc/hosts 作名称解析。您还可以设置 DNS 进行主机名称解析。root 身份登录区域。root@mongodb-node1:~# pkg install gcc-45
root@mongodb-node1:~# groupadd mongodb
root@mongodb-node1:~# useradd -g mongodb mongodb root@mongodb-node1:~# passwd mongodb
root@mongodb-node1:~# mkdir -p /export/home/mongodb
root@mongodb-node1:~# vi /export/home/mongodb/.profile
PATH=/usr/local/mongodb/bin:$PATH
export LD_PRELOAD_64=/lib/secure/64/libstdc++.so.6.0.1
export LC_ALL=C
ulimit -n 20000
case ${SHELL} in
*bash)
typeset +x PS1="\u@\h:\w\\$ "
;;
esac
清单 6.编辑初始化脚本
root@mongodb-node1:~# chown -R mongodb:mongodb /export/home/mongodb
root@mongodb-node1:~# mkdir -p /data/db root@mongodb-node1:~# chown -R mongodb:mongodb /data/db
root@mongodb-node1:~# mkdir /var/log/mongodb root@mongodb-node1:~# chown -R mongodb:mongodb /var/log/mongodb
libstdc 库创建符号链接,以便将其添加为安全库:root@mongodb-node1:~# ln -s /usr/local/mongodb/mongo-extra-64/libstdc++.so.6.0.17 /lib/secure/64
root@mongodb-node1:~# pkg install ntp
root@mongodb-node1:~# cd /etc/inet root@mongodb-node1:~# cp ntp.client ntp.conf root@mongodb-node1:~# touch /var/ntp/ntp.drift
root@mongodb-node1:~# vi /etc/inet/ntp.conf server <ntp-server> prefer driftfile /var/ntp/ntp.drift statsdir /var/ntp/ntpstats/ filegen peerstats file peerstats type day enable filegen loopstats file loopstats type day enable
注:使用本地时间服务器的 IP 地址或主机名或 http://support.ntp.org/bin/view/Servers/NTPPoolServers 处推荐的服务器的 IP 地址或主机名替换 IP 地址 ntp-server。
root@mongodb-node1:~# svcadm enable ntp
root@mongodb-node1:~# svcs ntp STATE STIME FMRI online 12:44:01 svc:/network/ntp:default
root@mongodb-node1:~# ntpq -p
/etc/hosts 中添加 MongoDB 集群成员的主机名和 IP 地址:root@mongodb-node1:~# cat /etc/hosts ::1 localhost 127.0.0.1 localhost loghost 192.168.1.1 mongodb-node1 192.168.1.2 mongodb-node2 192.168.1.3 mongodb-node3
注:如果您使用 NTP,需要将 NTP 服务器主机名和 IP 地址添加到 /etc/hosts。
服务管理工具是 Oracle Solaris 中用来管理系统和应用服务的特性,它取代了传统的 init 脚本启动。服务管理工具可确保重要系统和应用服务即便在软硬件发生故障时也能继续运行,从而提高了系统的可用性。此外,服务管理工具的自动重启功能还可以在出现错误时重新启动操作系统服务,无需人工干预。
svcbundle 工具创建服务管理工具清单,该清单将在计算机重启时自动启动 MongoDB 并在出现错误时重启服务。root@mongodb-node1:~# svcbundle -s service-name=application/mongodb \ -s start-method="/usr/local/mongodb/bin/mongodb-start" \ -s model=daemon -o mongodb.xml
mondodb.xml 清单,以便使用 MongoDB 组和用户启用服务启动。为此,在 </dependency> 所在代码行后面,添加以下行:<method_context> <method_credential group="mongodb" user="mongodb"/> </method_context>
清单 7 显示修改后的 MongoDB 服务管理工具清单:
root@mongodb-node1:~# vi mongodb.xml
<?xml version="1.0" ?>
<!DOCTYPE service_bundle
SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'>
<!--
Manifest created by svcbundle (2013-Apr-10 11:04:28+0300)
-->
<service_bundle type="manifest" name="application/mongodb">
<service version="1" type="service" name="application/mongodb">
<!--
The following dependency keeps us from starting until the
multi-user milestone is reached.
-->
<dependency restart_on="none" type="service"
name="multi_user_dependency" grouping="require_all">
<service_fmri value="svc:/milestone/multi-user"/>
</dependency>
<method_context>
<method_credential group="mongodb" user="mongodb"/>
</method_context>
<exec_method timeout_seconds="60" type="method" name="start"
exec="/usr/local/mongodb/bin/mongodb-start"/>
<!--
The exec attribute below can be changed to a command that SMF
should execute to stop the service. See smf_method(5) for more
details.
-->
<exec_method timeout_seconds="60" type="method" name="stop"
exec=":kill"/>
<!--
The exec attribute below can be changed to a command that SMF
should execute when the service is refreshed. Services are
typically refreshed when their properties are changed in the
SMF repository. See smf_method(5) for more details. It is
common to retain the value of :true which means that SMF will
take no action when the service is refreshed. Alternatively,
you may wish to provide a method to reread the SMF repository
and act on any configuration changes.
-->
<exec_method timeout_seconds="60" type="method" name="refresh"
exec=":true"/>
<!--
We do not need a duration property group, because contract is
the default. Search for duration in svc.startd(1M).
-->
<instance enabled="true" name="default"/>
<template>
<common_name>
<loctext xml:lang="C">
<!--
Replace this comment with a short name for the
service.
-->
</loctext>
</common_name>
<description>
<loctext xml:lang="C">
<!--
Replace this comment with a brief description of
the service
-->
</loctext>
</description>
</template>
</service>
</service_bundle>
清单 7.MongoDB 服务管理工具清单
root@global_zone:~# svccfg validate mongodb.xml
root@global_zone:~# svccfg import mongodb.xml
root@mongodb-node1:~# svcs mongodb STATE STIME FMRI online 14:51:52 svc:/application/mongodb:default
root@mongodb-node1:~# su - mongodb mongodb@mongodb-node1:~ tail -f /var/log/mongodb/mongod.log
mongotop 命令检查 MongoDB 运行,该命令显示 MongoDB 实例读取和写入数据所用的时间:
mongodb@mongodb-node1:~ /usr/local/mongodb/bin/mongotop
connected to: 127.0.0.1
ns total read write 2013-04-08T16:44:12
mydb.system.users 0ms 0ms 0ms
local.system.users 0ms 0ms 0ms
local.system.replset 0ms 0ms 0ms
local.system.indexes 0ms 0ms 0ms
local.startup_log 0ms 0ms 0ms
local.replset.minvalid 0ms 0ms 0ms
local.oplog.rs 0ms 0ms 0ms
local.me 0ms 0ms 0ms
清单 8.验证 MongoDB 是否正在运行
mongodb-node2 区域,作为 mongodb-node1 的克隆:root@global_zone:~# zoneadm -z mongodb-node1 shutdown root@global_zone:~# zoneadm -z mongodb-node2 clone mongodb-node1
mongodb-node2 区域:root@global_zone:~# zoneadm -z mongodb-node2 boot root@global_zone:~# zlogin -C mongodb-node2
mongodb-node2 区域的最终配置:mongodb-node2。mongodb_node2。none。mongodb-node3 执行类似步骤:root@global_zone:~# zoneadm -z mongodb-node3 clone mongodb-node1 root@global_zone:~# zoneadm -z mongodb-node3 boot root@global_zone:~# zlogin -C mongodb-node3
mongodb-node3 区域的最终配置:mongodb-node3。mongodb_node3。none。mongodb-node1 区域:root@global_zone:~# zoneadm -z mongodb-node1 boot
root@global_zone:~# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / solaris shared 1 mongodb-node1 running /zones/mongodb-node1 solaris excl 2 mongodb-node2 running /zones/mongodb-node2 solaris excl 3 mongodb-node3 running /zones/mongodb-node3 solaris excl
验证所有 MongoDB 区域在 /etc/hosts 中均有以下主机条目:
# cat /etc/hosts ::1 localhost 127.0.0.1 localhost loghost 192.168.1.1 mongodb-node1 192.168.1.2 mongodb-node2 192.168.1.3 mongodb-node3
注:如果您使用 NTP 服务器,还必须将其主机名和 IP 地址添加到 /etc/hosts。
复制通过称为副本集 的服务器组进行。大多数副本集由两个或更多个 mongod 实例组成,其中至多一个指定为主成员,其余作为辅助成员。客户端将所有写入指向主成员,而辅助成员则从主成员异步复制。MongoDB 的数据库复制提供了冗余,有助于确保高可用性。此外,它还简化了备份,可能会增加读取容量。大多数生产部署使用复制。
在本例中,mongodb-node1 将是主成员,mongodb-node2 和 mongodb-node3 将是 rs0 副本集上的辅助成员,如表 4 所示。
| 主机名 | 功能 | 副本集 |
|---|---|---|
mongodb-node1 |
主要 | rs0 |
mongodb-node2 |
辅助 | rs0 |
mongodb-node3 |
辅助 | rs0 |
root@mongodb-node1:~# svcs mongodb STATE STIME FMRI online 14:51:52 svc:/application/mongodb:default
mongodb-node1) 上,使用以下命令连接到 MongoDB shell:root@mongodb-node1:~# su - mongodb mongodb@mongodb-node1:~ /usr/local/mongodb/bin/mongo
mongodb-node1 添加到 rs0 副本集。
> rsconf = { _id: "rs0", members: [ { _id: 0, host: "mongodb-node1:27017" } ] }
您会看到以下输出:
{
"_id" : "rs0",
"members" : [
{
"_id" : 0,
"host" : "mongodb-node1:27017"
}
]
}
> rs.initiate( rsconf )
您会看到以下输出:
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
> rs.conf()
您应看到以下输出,其中只显示副本集中的一个节点 (mongodb-node1):
{
"_id" : "rs0",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "mongodb-node1:27017"
}
]
}
rs.add() 方法将第二个和第三个实例(mongodb-node2、mongodb-node3)添加到 rs0 副本集:
rs0:PRIMARY> rs.add("mongodb-node2")
{ "ok" : 1 }
rs0:PRIMARY> rs.add("mongodb-node3")
{ "ok" : 1 }
rs0:PRIMARY> rs.status()
应显示如清单 9 所示的输出:
{
"set" : "rs0",
"date" : ISODate("2013-04-10T08:23:00Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongodb-node1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 536,
"optime" : {
"t" : 1365582138,
"i" : 1
},
"optimeDate" : ISODate("2013-04-10T08:22:18Z"),
"self" : true
},
{
"_id" : 1,
"name" : "mongodb-node2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 58,
"optime" : {
"t" : 1365582138,
"i" : 1
},
"optimeDate" : ISODate("2013-04-10T08:22:18Z"),
"lastHeartbeat" : ISODate("2013-04-10T08:22:58Z"),
"lastHeartbeatRecv" : ISODate("2013-04-10T08:22:58Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "mongodb-node3:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 42,
"optime" : {
"t" : 1365582138,
"i" : 1
},
"optimeDate" : ISODate("2013-04-10T08:22:18Z"),
"lastHeartbeat" : ISODate("2013-04-10T08:22:58Z"),
"lastHeartbeatRecv" : ISODate("2013-04-10T08:22:59Z"),
"pingMs" : 0
}
],
"ok" : 1
}
清单 9.检查复制配置
您可以从输出看到,mongodb-node1 是主成员,mongodb-node2 和 mongodb-node3 是辅助集群成员。
MongoDB 数据库保存一组集合。集合保存一组文档。文档是一组键值对。
文档有动态模式,这意味着同一集合中的文档不需要有一组相同的字段或结构,而集合文档中的通用字段可以保存不同类型的数据。
要显示数据库列表,请使用以下命令:
rs0:PRIMARY> show dbs local 6.0751953125GB
要切换到名为 mydb 的新数据库,请使用以下命令:
注:您无需在首次使用数据库之前创建数据库。
rs0:PRIMARY> use mydb switched to db mydb
要在名为mydb 的新数据库内将文档插入名为 things 的新集合,请执行以下操作:
j 和 k 的文档:
rs0:PRIMARY> j = { name : "mongo" }
{ "name" : "mongo" }
rs0:PRIMARY> k = { x : 3 }
{ "x" : 3 }
j 和 k 文档插入集合 things:rs0:PRIMARY> db.things.insert( j ) rs0:PRIMARY> db.things.insert( k )
things 集合执行此查询,确认 things 集合中是否有这两个文档:
rs0:PRIMARY> db.things.find()
{ "_id" : ObjectId("5162ef329e3aac3f0f6972de"), "name" : "mongo" }
{ "_id" : ObjectId("5162ef3c9e3aac3f0f6972df"), "x" : 3 }
注:您的文档 ID 值将有所不同。
rs0:PRIMARY> exit
我们通过模拟集群节点故障来测试集群弹性。
如果主 MongoDB 实例出现故障或其他集群成员因网络故障而无法连接,MongoDB 集群将启动选举过程,以选出新的集群主节点。
root 用户身份停止 mongodb-node1 区域上的 MongoDB 服务:root@global_zone:~# zlogin mongodb-node1 root@mongodb-node1:~# svcadm disable mongodb
mongodb-node2),并运行 MongoDB shell: root@global_zone:~# zlogin mongodb-node2 root@mongodb-node2:~# su - mongodb mongodb@mongodb-node2:~ /usr/local/mongodb/bin/mongo
rs.status() 命令获取复制集状态。rs0:PRIMARY> rs.status()
您将看到,mongodb-node2 已提升为主节点,而 mongodb-node3 仍为辅助节点。
注:在选举过程中,可以选举不同的主机作为主节点;例如,可以将 mongodb-node3 作为主成员,而将 mongodb-node2 作为辅助成员。您还可以定义优先级,让一个成员的优先级值高于集合中其他成员。请参见 MongoDB 文档中的示例。
mongodb-node1 区域上启动 MongoDB 实例:root@global_zone:~# zlogin mongodb-node1 root@mongodb-node1:~# svcadm enable mongodb
root@mongodb-node1:~# svcs mongodb
STATE STIME FMRI
online 11:29:09 svc:/application/mongodb:default
mongodb-node1 区域,并运行 MongoDB shell:root@mongodb-node1:~# su - mongodb mongodb@mongodb-node1:~ /usr/local/mongodb/bin/mongo
rs.status() 命令获取复制集状态。rs0:SECONDARY> rs.status()
您将看到,mongodb-node1 现在是辅助成员,而 mongodb-node3 仍为辅助成员。
注:您的集群成员级别可能因选举过程而不同。
rs0:SECONDARY> exit
mongodb@mongodb-node1:~ tail -f /var/log/mongodb/mongod.log
MongoDB 软件包括用于分析数据库负载的内置工具。但为了全面了解性能分析过程,除了数据库之外,还需要观察操作系统。Oracle Solaris 包括一个名为 DTrace 的全面的动态跟踪工具。使用此工具,您可以检查用户程序和操作系统自身的行为。
以下示例演示了如何使用 DTrace 分析 MongoDB 数据库负载过程中的 I/O 负载模式。我们将使用 DTrace Toolkit(这是位于 /usr/dtrace/DTT/ 中的一个 DTrace 脚本集合)运行磁盘 I/O 性能分析。
rs.status( ) 命令获取 MongoDB 主实例名称。您可以在地址为 http://<mongodb_IPaddress>:28017/_replSet 的 Replica Set Status 页面上找到同样的信息,如图 2 所示。
图 2.Replica Set Status 页面
mongodb 用户身份在主 MongoDB 实例上运行以下命令,在 MongoDB 数据库上生成负载。注:在本例中,主成员是 mongodb-node2,但也可以是其他主机。
root@global_zone:~# zlogin mongodb-node2
root@mongodb-node2:~# su - mongodb
mongodb@mongodb-node2:~ /usr/local/mongodb/bin/mongo
rs0:PRIMARY> res = benchRun( { ops : [ { ns : "test.foo" , op : "insert" , doc : { y : { "#RAND_STRING" : [ 10 ] } } } ] , parallel : 2 , seconds : 1000 , totals : true } );
清单 10.生成负载
有关详细的负载说明,请参见 http://www.mongodb.org/about/contributors/js-benchmarking-harness/。
iopattern 脚本(如清单 11 所示),分析磁盘 I/O 负载的类型:root@global_zone:~# /usr/dtrace/DTT/iopattern %RAN %SEQ COUNT MIN MAX AVG KR KW 84 16 196 512 1032704 42302 5 8092 80 20 98 1024 189952 53221 0 5093 72 28 68 4096 97280 58910 0 3912 75 25 77 2048 96256 59910 2 4503 75 25 72 4096 97280 58887 0 4140 76 24 180 512 1046016 141405 0 24856 87 13 110 512 181248 46982 115 4932 75 25 73 4096 96768 58557 158 4016 79 21 77 4096 97280 58387 0 4390 73 27 75 4096 174080 57603 159 4060 66 34 140 512 1048064 262645 0 35908 84 16 120 512 437248 36369 0 4262 79 21 72 4096 97280 58368 0 4104 75 25 74 2560 97280 57489 2 4152
清单 11.分析负载
输出中显示以下项:
%RAN 是随机事件的百分比。%SEQ 是顺序事件的百分比。COUNT 是 I/O 事件数量。MIN 是最小的 I/O 事件大小。MAX 是最大的 I/O 事件大小。AVG 是平均 I/O 事件大小。KR 是本例中读取的总千字节数。KW 是本例中写入的总千字节数。从脚本输出可以看出,I/O 负载主要为随机写入(%RAN 和 KW)。
在本文中,我们了解了如何利用 Oracle Solaris 区域、ZFS、DTrace 以及 Oracle Solaris 中的服务管理工具技术构建、观察和管理 MongoDB 数据库集群。
svcbundle 的更多信息,请参见“在 Oracle Solaris 11 中使用 svcbundle 创建 SMF 清单和配置文件”另请参见该作者发表的其他文章:
下面是其他 Oracle Solaris 11 资源:
Orgad Kimchi 是 Oracle(之前任职于 Sun Microsystems)ISV 工程小组的首席软件工程师。5 年来,他一直专注于虚拟化和云计算技术。
| 修订版 1.1,2013 年 7 月 18 日 |