作者:手机用户2502896943 | 来源:互联网 | 2014-05-28 16:53
基础知识:介绍JSONJSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式mongoshellmongoisafullJavaScriptshell,soanyJavaScriptfunction,syntax,orclasscanbeusedintheshell.本文不介绍自动分片的
基础知识:
介绍 JSON JSON(Javascript Object Notation) 是一种轻量级的数据交换格式 mongo shell mongo is a full Javascript shell, so any Javascript
function, syntax, or class can be used in the shell.
本文不介绍自动分片的机制和部署.
mongos ,这个程序相当于一个数据库的路由器,可以实现自动分片(auto-sharding) .
replication set的部署安装
Replica Sets 使用 n 个 Mongod
节点,构建具备自动容错转移(auto-failover)、自动恢复(auto-recovery) 的高可用方案
生产环境都必须是replication set模式,因为主从不能保障服务高可用.
至少保证有3个节点(或者2个节点+1个 arbiter. ,
一般为2~7个node)
1.安装
wget
http://fastdl.
mongodb.org/linux/
mongodb-linux-x86_64-2.0.3.tgz
mkdir $HOME/app
cd app
tar zxvf ../mongodb-linux-x86_64-1.6.5.tgz
ln -s mongodb-linux-x86_64-1.6.5 mongodb
cd
vi .bash_profile
,添加到Path路径.PATH=$HOME/app/mongodb/bin:$PATH:$HOME/bin
2. 配置
source .bash_profile
创建数据目录,日志目录和配置文件目录,编辑参数文件
cd
mkdir data
mkdir data/db
mkdir data/log
mkdir data/conf
vi /home/mongodb/data/conf/mongodb.cnf
dbpath=/home/mongodb/data/db
logpath=/home/mongodb/data/log/mongodb.log
fork=true
logappend=true
解释:
?dbpath:默认/data/db
?port:默认27017,还有一个http端口28017 (监听端口+1000)
?fork:以daemon方式启动
?logpath:日志路径,增加?logappend,以追加日志的方式,否则每次启动会覆盖旧日志.
?config or -f :可以用命令行参数也可以使用配置文件.
创建启动脚本
vi /home/mongodb/start_mongodb.sh
#!/bin/bash
#source $HOME/.bash_profile
BIN_PATH=$HOME/app/mongodb/bin
cd $BIN_PATH
./mongod -f /home/mongodb/data/conf/mongodb.cnf ?rest ?replSet
myset
解释:
启动加?rest ,可以在web页面执行一些管理命令.方便我们查看replication set状态.
?replSet 复制集名称
3. 启动mongodb
运行启动脚本,确认服务正常启动
./start_mongodb.sh
检查端口 netstat -tlpn |grep mongo
检查日志 /home/mongodb/data/log/mongodb.log
4. 关闭已经安装好的mongodb节点, 打包/home/mongodb目录到其他节点,解压,然后运行启动脚本.
kill mongod实例进程id
tar czvf mongodb.tar.gz mongodb ?exclude=mongodb/data/db/*
?exclude=mongodb/data/log/*
在其他节点使用start_mongodb.sh启动mongod服务.
5. 配置replciation set
包括主(primary)节点和次要(secondary) ,节点还有其他一些状态: 略
1). 登录要第一个节点(未来做Primary节点的)
mongo
2). >
rs.status()
#会显示“errmsg” : “can’t get local.system.replset ,还没有初始化
3). > rs.initiate(
)
例子:
> // all at once method
> cfg = {
_id : “acme_a”,
members : [
{ _id : 0, host : "sf1.acme.com" },
{ _id : 1, host : "sf2.acme.com" },
{ _id : 2, host : "sf3.acme.com" } ] }
> rs.initiate(cfg)
> rs.status()
—也可以使用简易的方式.全部使用默认值,不建议
rs.initiate()
#初始化节点,这个节点可以原来存在数据,其他节点必须是空的
以上命令默认把本机的节点加入复制集.
会使用主机名,以后的配置稍繁琐,所有客户端服务器需要在/etc/hosts里添加主机名映射.
如果添加的是内网域名呢? 短连接和长连接的定义一样吗?
4). >
rs.status()
#确认已经创建了replication set,已经拥有一个成员
>
db.isMaster()
#确认本节点是master
5). 登录其他节点
在每个其他节点/etc/hosts内 添加第一个primary节点主机的主机名.
mongo ?host primary节点的主机ip
rs.add(“要添加的节点ip”);
6).web界面观看,确认
http://主节点ip:28017/
#主节点ip端口(默认27017)+1000 = 28017 有一个web界面方便查看复制集的状态.
相关命令
rs.help()
rs.status()
rs.conf()
db.isMaster()
安装目录/bin下的程序解释
mongod 主数据库程序
mongo 数据库shell工具(可以使用Javascript和服务器交互)
其他工具略:mongoimport,mongoexport,mongodump,mongorestore,bsondump,mongofiles,mongostat
默认的端口:
mongod :27017
mongos: 27017
shard server (mongod ?shardsvr) : 27018
config server (mongod ?configsvr) : 27019
web stats page for mongod : add 1000 to port number (28017, by
default)
1.可考虑关闭atime
2. 设置文件描述符限制 (> 4000+) # (see
etc/limits and ulimit)
3. 不要使用大内存页
4. dmesg 检查下;
5.
考虑BIOS禁用NUMA,或者使用numactl命令启动mongod(mongod启动的时候会自动检查os配置,并提示warnings)
6. 使用ntp同步好各主机的时间
7. 内核版本 > 2.6.36
================================================================
维护
1. 启动,见安装部分.关闭:
1). kill pid
2). mongo登录关闭(本地或者验证用户才能这样关闭)
> use admin
> db.shutdownServer();
如果关闭复制集(replication set)的主库,那么mongodb会检查是否有
复制超时<10秒的secondary节点,没有的话,就不关闭主节点,除非强制执行.
如果有的话,那么primary节点step
down,等待secondary节点跟上primary节点.然后60秒后,primary节点关闭.
强制关闭的方法:
> db.shutdownServer({force : true})
一直检查N秒,如果N秒内有满足条件(复制超时<10秒)的次要节点,那么关闭主节点.
> db.shutdownServer({timeoutSecs : 5})
2 .查看服务状态
http接口查看
?nohttpinterface #禁用它
>use admin
>db.addUser(“root”, “abcd”); #添加了一个管理用户
http://localhost:28017/_status #输入上面配置的用户和密码即可.
以上需要使用带权限认证的方式启动才生效(未验证)
?rest 这个参数可以让web界面执行一些管理命令.
获取mongodb状态
db.serverStatus命令
rs.status()
具体参考监控章节
故障处理
强制一个节点为主库. (v2.0+)
必须在primary库运行, 默认的优先级是1, 所以在主库上指定某个节点的优先级> 主库的优先级即可.
原来的主库会短暂失去响应,估计在几秒内.
$ mongo
> // example : give 2st member priority 2
> cOnfig= rs.conf()
> config.version++
> // the default priority is 1
> config.members[1].priority = 2
> rs.reconfig(config)
查看,终止当前的操作
db.currentOp();
> db.killOp(1234/*opid*/)
> // same as: db.$cmd.sys.killop.findOne({op:1234})