Mongo权威指南(进阶篇)

Mongo权威指南(进阶篇)
固定集合
之前的普通集合都是动态创建的,无需事先定义。Mongo还支持一种固定集合,需要事先创建,并且大小固定。固定集合是一个很有趣的环形队列,空间不足的情况下最新插入的文档将被删除。
固定集合也有限制,不能手动删除文档(自动淘汰除外),更新操作不能导致文档移动
创建固定集合:
db.createCollection('my_collection', {capped: true, size:100000, max:1000})
也可以将普通集合转换成固定集合:
db.runCommand({convertToCapped:'teset', size: 1000})
GridFS 文件系统
特点:

  1. 不会产生磁盘碎片
  2. 分片和复制机制完善,故障恢复容易
  3. 分布式
    使用:
    mongo提供mongofiles可以进行GridFS文件系统的操作
    添加文件: mongofiles put xxxx.txt
    列出文件: mongofiles list
    取出文件: mongofiles get xxx.txt
    删除文件: mongofiles delete xxx
    在mongo命令行下,可以在db.fs.files中查看文件的信息:
    文件信息提供了md5,时间戳,chunksize,文件大小,唯一id,文件名

管理与权限管理,备份
toto
缺点
故障恢复能力差,更存储引擎有关
复制
主从复制 master/slave

master 配置:
安全:添加用户 use admin db.addUser('usename', 'pass', readonly) ; 启动 mongod –auth #以认证方式启动
主从:mongod –master –port 12345 –dbpath /dir/to/db #启动时指定为master
slave 配置:
主从:mongod –slave –port 67890 –dbpath /dir/to/db1 #注意如果在同一台机器上时端口号和dbpath均应该不同,master设置了认证的话使用 –keyFile filepath 指定认证文件

  使用`mongo --port 67890` 登录到Slave终端, `use local; db.sources.insert({'host':'localhost:12345'})`,添加slave

注意:主从复制不会复制local数据库
副本集 Replica set
副本集是有自动故障恢复能力的主从集群,但没有固定明确的master和slave,却而代之的是活跃节点(primary)和备份节点(secondary),在活跃节点故障的时候,备份节点会变成活跃节点

副本集配置:
创建dbpath目录
启动mongod,mongod –dbpath /path/to/db –port 1234 –replSet setname/hostname:2345
注:hostname:2345 是副本集的其他机器的机器名和端口号,多个使用逗号隔开
连接其中一台机器,执行命令 db.runCommand({'replSetInitiate': {'id':'setname','members': [{'id':1,'host':'kisayhost:50000'},{'_id':2,'host':'kisayhost:50001'}]}})
rs.addArb('hostname:3456') 添加仲裁节点到副本中,也就是只做投票的(不接受复制的数据,也不能成为活跃节点)
添加普通节点使用 rs.add('hostname:6789')
在其他副本集合中查询数据时可能报错 error: { “$err” : “not master and slaveOk=false”, “code” : 13435 },这是由于secondary默认是作为备份使用,未启用读扩展,不允许直接读操作,执行rs.setSlaveOk() 解决,也可以使用全名db.getMongo().setSlaveOk()
副本集的操作可以使用rs.*系列函数,rs是 replSet的缩写
其他

Mongo的副本集仅支持单个master,是为了避免多master导致的数据的不一致
副本集中的主机至少有三个才会有master,否则会降级为secondary,这样做的原因是为了避免出现多个master的情况(假设一个只有两个主机的副本集,因为网络原因两台主机断开通信,这时会出现两个master,当网络故障恢复的时候,那…)
最多使用一个arbiter(仲裁者),如果集合的主机数量为基数时不需要仲裁者,仲裁者对速度和数据的安全性等完全没意义,所以尽量少用这个避免带来不必要的麻烦,即使members的数量是偶数。最好的办法就是使用奇数个members

你可能感兴趣的:(mongodb)