本文档主要介绍了mongodb安装,添加副本集、分片及日常维护操作,mongodb2.4.10支持hash分区,针对大并发访问,提供了较好的性能,建议使用ssd硬盘
下载Mongodb 软件
groupadd app
useradd app –g app
su – app
mkdir shard
mkdir logs
mkdir conf
tar xzvf mongodb-linux-x86_64-2.4.10.tgz –C /home/app
创建配置文件
vi /home/app/conf/shard.conf
配置选项:
dbpath = /home/app/shard
bind_ip=10.0.0.1
port = 27018
logpath = /home/app/logs/shard.log
logappend = true
replSet = rs1
shardsvr = true
fork = true
启动mongod服务
numactl --interleave=all /home/app/mongodb2.4.10/bin/mongod -f /home/app/conf/shard.conf
在第二个host上启动同样的mongod服务
numactl --interleave=all /home/app/mongodb2.4.10/bin/mongod -f /home/app/conf/shard.conf
配置选项修改:
bind_ip=10.0.0.2
在第三个host上配置仲裁者服务
配置选项:
vi /home/app/conf/arbiter.conf
dbpath = /home/app/arbiter
port = 27020
logpath = /home/app/logs/arbiter.log
logappend = true
fork = true
启动仲裁者:
numactl --interleave=all /home/app/mongodb2.4.10/bin/mongod -f /home/app/conf/arbiter.conf
部署副本集
连接主节点mongod:
/home/app/mongodb2.4.10/bin/mongo --host 10.0.0.1 --port 27018
为副本集添加成员:
rs.add(“10.0.0.1:27018”)
rs.add(“10.0.0.2:27018”)
rs.addArb(“10.0.0.3:27020”)
设置成员优先级:
var config = rs.config()
config.members[0].priority = 2
config.members[1].priority = 1
rs.reconfig(config)
查看副本集状态:
rs.status() / rs.isMaster() / rs.conf()
创建配置服务器 (建议3台,避免单点故障)
配置选项:
vi /home/app/conf/config.conf
dbpath = /home/app/configdb
port = 27019
logpath = /home/app/logs/config.log
logappend = true
configsvr = true
fork = true
启动配置服务器进程:
numactl --interleave=all /home/app/mongodb2.4.10/bin/mongod -f /home/app/conf/config.conf
创建mongos服务
配置选项:
vi /home/app/conf/route.conf
configdb = 10.0.0.3:27019
logpath = /home/app/logs/route.log
logappend = true
fork = true
启动mongos进程:
numactl --interleave=all /home/app/mongodb2.4.10/bin/mongos -f /home/app/conf/route.conf
启动分片集群
将副本集添加为分片:
sh.addShard(“rs1/10.0.0.1:27018”)
查看集群状态:
sh.status()
对数据库启用分片:(集合也需要分片,命令见分片集群常用管理命令)
sh.enableSharding(“tts_test”)
分片集群配置成功
分片集群常用管理命令
创建索引:
db.users.ensureIndex("xx" : 1 }
db.users.ensureIndex(("xx" : 1 }),{"background" : true } )
1或-1代表索引的方向
散列片键(使用HASH分片,解决部分分片负载不均衡问题) :
db.users.ensureIndex({"username": "hashed"})
sh.shardCollection("app.users",{"username": "hashed"})
压缩数据:
db.runCommand({"compact" : "collname"})
空间不会减小,但是占用资源较多
释放空间:
进入数据库 db.repairDatabase()
replSet 架构,可以停掉数据库,然后删除数据目录,从新从复制组中全同步数据,这个时候要考虑 oplog 的尺寸
1)将 primary stepDown,不出意外新的 primary 会起来;
2)将原 primary kill 掉;
3)删掉所有 data 数据(调用 repair 很慢,真不如干掉重新来);
4)再重启动原 primary 的进程;
5)以此循环完成整个复制组的全部重建。
主从切换:
rs.stepDown([secs])
查看复制:
db.printReplicationInfo()
db.printSlaveReplicationInfo()
停止服务:
kill pid
db.shutdownServer()
db.adminCommand({"shutdown" : 1})
均衡器管理
sh.getBalancerState()
sh.isBalancerRunning()
sh.setBalancerState(true) #关闭均衡器sh.setBalancerState(false)
mongodb状态监控
mongostat它的输出有以下几列:
insert 每秒插入次数
query 每秒查询次数
update 每秒更新次数
delete 每秒删除次数
getmore 每秒执行getmore次数
command 每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
flushs 每秒执行fsync将数据写入硬盘的次数。
mapped 所有的被mmap的数据量
vsize 虚拟内存使用量
res 物理内存使用量
faults 每秒访问失败数(只有Linux有),数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展
locked % 被锁的时间百分比,尽量控制在50%以下吧
idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了
qr 客户端等待从 MongoDB 实例读取数据的队列长度。
qw 客户端等待向 MongoDB 实例写入数据的队列长度。
ar 执行读取操作的活动客户端的数目。
aw 执行写入操作的活动客户端的数目。
netIn MongoDB 收到的网络流量,这包括 mongostat 本身的流量。
netOut MongoDB 发送的网络流量,这包括 mongostat 本身的流量。
conn 打开连接的总数。
set 副本集的名称(如适用)。
repl 节点的复制状态。(M:主版本,SEC:次,REC:恢复,UNK:未知,SLV:从属)