主从

mongodb可以设置主从数据库,主从之间读写分离。主数据库只写,从数据库只读。最好再设置一个用于仲裁的mongod(arbiter,占用资源很少,不需要独立的服务器),在主数据库宕机的情况下,arbiter会自动将从数据库升级为主数据库。主从服务器更多是为了数据的安全性,虽能提高一点读写性能,但效果不明显。需要注意的是,因为读写分离,在写入的时候,只写入到主数据库,从数据库是异步写入的。所以不能实时读取。

 

集群

也叫分片集群,是将很多mongod集成在一起,每个mondod都只保存部分的数据,以提高整个数据库的负载能力,这是mongodb支持高负载的关键所在。

分片集群的构成元素有:

  • routes :对外暴露的节点,用于客户端访问,为了网络负载均衡,一般都会配置多个,客户端可以选择访问其中的任何一个
  • Configure server :配置服务器,保存所有 shard 的 metadata 。如果它工作不正常,那么整个集群就不能用了。所以一般都配置 3 个 configure server ( 3 个的数据是一模一样的)
  • shard :一个 shard 就是一个 Replica set,也就是上面所说的主从数据库 。真正的存储数据

分片集群的shard肯定不止一个,否则就没有意义。数据分散存储于各shard中。以学生为例,可以根据学号,将学号1-100000的存储于一个shard中,学号100000-200000存储于另一个shard中。于是每个shard存储的数据量都不会太大,必要时候可以增加shard以支持学生数量的增加(这里只是举例,学生不会有太大的数量级)。

 

 分片集群的几点说明:

  1. 分片集群中的 Replica set ,写操作是主从同时进行的,所以读写实时。
  2. 在分片的情况下,如果查询条件里含有分片的条件(比如上述的学号),会智能在有关分片的服务器里查询;如果分片条件不在查询条件中,则全局查询。如果查询语句有排序,mongo会在返回最终结果集之前进行排序
  3. 分片的时候,如果分片条件不是_id,要自己保证_id全局唯一