• 1. Mongodb集群搭建
  • 2. Mongodb集群搭建Mongodb一共有三种集群搭建的方式: Replica Set(副本集) Sharding(切片) Master-Slaver(主从) Replica Set 和 Sharding 整合搭建
  • 3. Replica Set(副本集)Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点 建立副本集(Replica Set)来保证1个服务挂了,可以有其他服务顶上,程序正常运行,几个服务的数据都是一样的,后台自动同步副本集是必须的,因为他可以当你的主服务器挂掉后,根据选举机制自动选举出1个最适合的从服务器来做主服务器继续运行
  • 4. 副本集的主节点的选择是由仲裁节点中的选举机制选举出来的(bully算法)。各个节点之间的是通过心跳来判断是否正常运行。 Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。别的节点可以选择接受这个声称或是拒绝并进入主节点竞争。被其他所有节点接受的节点才能成为主节点。节点按照一些属性来判断谁应该胜出。这个属性可以是一个静态ID,也可以是更新的度量像最近一次事务ID(最新的节点会胜出) 另外声明:假如 133.1.1.1(主)、133.1.1.2(备)、133.1.1.3(备) 主节点宕机或者坏掉了,133.1.1.3通过选举成为主节点,等到133.1.1.1修好了重新加入该副本集,主节点仍然为133.1.1.3 。 Replica Set(副本集)
  • 5. 为什么副本集的节点个数要为奇数个? 考虑复制集中成员个数时,一般需要考虑以下几个因素: 成员个数应为奇数,奇数个成员能够保证复制集选出一个主机。如果成员个数为偶数,应需要增加一个仲裁器。 需要考虑容错性。容错性是指复制集中最多允许几个成员不可用,但是这时复制集依然能够选出主机。拥有不同数量复制集中具有不同的容错性。
  • 6. Replica Set(副本集) 主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。 仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。如果没有仲裁节点的话,主节点挂了备节点还是备节点,不会使备节点变为主节点。
  • 7. Replica Set(副本集)步骤1【创建数据存放目录】 创建4个,3个Mongodb服务器,1个仲裁服务器。创建4个节点分配数据存放的位置空间 $  mkdir -p /scmgt/data/r0 $  mkdir -p /scmgt/data/r1 $  mkdir -p /scmgt/data/r2 $  mkdir -p /scmgt/data/r3步骤2 【启动三个节点】 --dbpath   数据文件路径 --logpath  日志文件路径 --port        端口号,默认是27017.我这里使用的也是这个端口号. --replSet   复制集的名字,一个replica sets中的每个节点的这个参数都要用一个复制集名字,这里是test. --replSet test/  这个后面跟的是其他standard节点的ip和端口 --maxConns   最大连接数 --fork       后台运行 --logappend   日志文件循环使用,如果日志文件已满,那么新日志覆盖最久日志。
  • 8. Replica Set(副本集)启动第一个standard节点(ip:192.168.0.11) /mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.12:27017 --maxConns=2000 --fork --logappend   启动第二个standard节点 (ip:192.168.0.12) /mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.11:27017 --maxConns=2000 --fork –logappend 启动arbiter节点,也就是仲裁节点 (ip:192.168.0.13)。 注意!--replSet test/后面写的是两个standard节点的ip和端口 /mongodb/bin/mongod --dbpath=/mongodb/mongodb_date --logpath=/mongodb/mongodb_log/mongod.log --port 27017 --replSet test/192.168.0.11:27017,192.168.0.12:27017 --fork --logappend
  • 9. Replica Set(副本集)步骤3 【初始化节点】 在第二个启动的节点上,运行mongo db.runCommand({"replSetInitiate" : { "_id" : "test", "members" : [ { "_id" : 0, "host" : "192.168.0.11:27017" }, { "_id" : 1, "host" : "192.168.0.12:27017" } ]}}) 加入arbiter节点 PRIMARY> rs.addArb("192.16.0.13:27017");
  • 10. Replica Set(副本集)rs.status() 通过这个命令,可以查看各个节点的ip、角色已经是否正常 rs.stepDown()   这个命令可以强制primary和standard节点角色互换,从而验证是否能够实现failover功能。 添加普通数据节点 PRIMARY> rs.add(“ip:port”) 例如:(“192.168.0.12:27017”) 删除节点 PRIMARY> rs.remove("ip:port") 显示当前谁是主节点 PRIMARY> rs.isMaster()
  • 11. Sharding(切片)MongoDB分片的基本思想就是将集合切分成小块.这些块分散到若干片里面,每个片只负责总数据的一部分.应用程序不必知道哪片对应哪些数据,甚至不需要知道数据已经被拆分了,所以在分片之前要运行一个路由进程,进程名mongos,这个路由器知道所有数据的存放位置,所以应用可以连接它来正常发送请求. Mongod 配置节点:为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,它可以决定该条记录属于哪个chunk。Config Servers就是用来存储:所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。
  • 12. Sharding(切片) 在搭建分片的时候,一定要在启动路由进程前,先启动配置节点,因为路由进程是去读取配置节点的信息,从而去mongod的实例中读取数据并返回的,在这里强调下,不是配置节点去读写分片中数据,而是通过路由进程直接访问。
  • 13. Sharding(切片)Shard 节点:即存储实际数据的分片,每个Shard可以是一个mongod实例 路由节点:客户端由此接入,然后询问配置节点需要到哪个Shard上查询或保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod的查询或更新请求原封不动地发给路由节点,而不必关心所操作的记录存储在哪个Shard上。 Shard Server 1:27017 Shard Server 2:27018 Config Server  :27027  Route Process:40000
  • 14. Sharding(切片)搭建步骤 步骤一: 启动Shard Server mkdir -p /opt/mongodb/data/shard/s0 --创建数据目录 mkdir -p /opt/mongodb/data/shard/s1 mkdir -p /opt/mongodb/data/shard/log --创建日志目录   /opt/mongodb/bin/mongod --port 27017 --dbpath /opt/mongodb/data/shard/s0 --fork --logpath /opt/mongodb/data/shard/log/s0.log --启动Shard Server实例1   /opt/mongodb/bin/mongod --port 27018 --dbpath /opt/mongodb/data/shard/s1 --fork --logpath /opt/mongodb/data/shard/log/s1.log --启动Shard Server实例2
  • 15. Sharding(切片)步骤二:启动Config Server mkdir -p /opt/mongodb/data/shard/config --创建数据目录/opt/mongodb/bin/mongod --port 27027 –dbpath /opt/mongodb/data/shard/config --fork         --logpath /opt/mongodb/data/shard/log/config.log --启动Config Server实例 (注意,这里我们完全可以像启动普通mongodb服务一样启动,不需要添加—shardsvr和configsvr参数。因为这两个参数的作用就是改变启动端口的,所以我们自行指定了端口就可以)步骤三: 启动Route Process /opt/mongodb/bin/mongos --port 40000 --configdb localhost:27027 --fork --logpath /opt/mongodb/data/shard/log/route.log --chunkSize 1 --启动Route Server实例   mongos启动参数中,chunkSize这一项是用来指定chunk的大小的,单位是MB,默认大小为200MB,为了方便测试Sharding效果,我们把chunkSize指定为 1MB。意思是当这个分片中插入的数据大于1M时开始进行数据转移
  • 16. Sharding(切片)步骤四: 配置Sharding 接下来,登录到mongos,添加Shard节点 [root@localhost ~]# /opt/mongo/bin/mongo admin --port 40000 --此操作需要连接admin库 MongoDB shell version: 2.0.1 connecting to: 127.0.0.1:40000/admin > db.runCommand({ addshard:"localhost:27017" }) --添加 Shardb Server { “shardAdded” : “shard0000”, “ok” : 1 } //显示添加成功 > db.runCommand({ addshard:"localhost:27018" }) { "shardAdded" : "shard0001", "ok" : 1 } > db.runCommand({ enablesharding:"test" }) --设置数据库启用分片功能. { "ok" : 1 } > db.runCommand({ shardcollection: "test.users", key: { id:1 }}) --设置分片的集合名称。且必须指定Shard Key,系统会自动创建索引 { "collectionsharded" : "test.users", "ok" : 1 }
  • 17. Sharding(切片)删除片用removeshard就能从集群中删除片.removeshard会把给定片上的所有块的数据都挪到其他片上db.runCommand({"removeshard":"127.0.0.1:27017"}) 显示当前分块信息 db.printShardingStatus()
  • 18. Master-Slaver(主从) 这个是最简答的集群搭建,不过准确说也不能算是集群,只能说是主备。并且官方已经不推荐这种方式。 ./mongod --master --dbpath /data/masterdb/       主节点   ./mongod --slave --source  --dbpath /data/slavedb/      备节点          基本上只要在主节点和备节点上分别执行这两条命令,Master-Slaver就算搭建完成了。我没有试过主节点挂掉后备节点是否能变成主节点,不过既然已经不推荐了,大家就没必要去使用了。
  • 19. Replica Set 和 Sharding 整合搭建架构图:整个大框是一个 Sharding(切片集),有路由节点(mongos)、配置节点(config servers)、多个分片节点(shard)。 由上图可以发现,每个shard有多个mongod组成,这里每个shard节点又使用了主从集或者副本集来提高整个mongodb系统的性能。 一个配置节点有多个服务器,每个服务器存储的数据是相同的,这样做的目的是为了当有一台服务器出现宕机或者损坏的情况下,其他服务器可以作为备用节点使用。
  • 20. Replica Set 和 Sharding 整合搭建mongos:可以有多个,相当于一个控制中心,负责路由和协调操作,使得集群像一个整体的系统。mongos可以运行在任何一台服务器上,有些选择放在shards服务器上,也有放在client 服务器上的。mongos启动时需要从config servers上获取基本信息,然后接受client端的请求,路由到shards服务器上,然后整理返回的结果发回给client服务器。 config server:存储集群的信息,包括分片和块数据信息。主要存储块数据信息,每个config server上都有一份所有块数据信息的拷贝,以保证每台config server上的数据的一致性。
  • 21. Replica Set 和 Sharding 整合搭建流程图:
  • 22. Replica Set 和 Sharding 整合搭建实例: 1,shard服务器:使用Replica Sets确保每个数据节点都具有备份、自动容错转移、自动恢复的能力。 2,配置服务器:使用使用3个配置服务器确保数据完整性 3,路由进程:使用3个路由进程实现平衡,提高客户端接入性能,架构如下
  • 23. Replica Set 和 Sharding 整合搭建现在我们开始搭建整个架构(因为没那么多机器,使用本地的目录来模拟机器) 主机  ip 服务及端口 ServerA Mongodb1 mongod shard11:10001 Mongodb2 127.0.0.1 mongod shard21:20001 Mongodb3 mongod config 1: 30001 Mongodb4 mongos :40000 ServerB Mongodb5 mongod shard12:10002 Mongodb6 127.0.0.1 mongod shard22:20002 Mongodb7 mongod config 2: 30002 Mongodb4 mongos :40000 ServerC Mongodb8 mongod shard13:10003 Mongodb9 127.0.0.1 mongod shard23:20003 Mongodb10 mongod config 3: 30003 Mongodb4 mongos :40000
  • 24. Replica Set 和 Sharding 整合搭建1,启动Shard1进程并配置Replica Sets 启动mongod shard11进程,副本集名称:shard1启动mongod shard12进程,并设置副本集:shard1启动mongod shard13进程,并设置副本集:shard1
  • 25. Replica Set 和 Sharding 整合搭建把这三个进程配置成副本集,新开一个cmd,用来执行各种非启动命令,连接到上面三个进程中的任何一个,把他们配置成副本集,操作如下
  • 26. Replica Set 和 Sharding 整合搭建2,启动Shard2进程并配置Replica Sets 启动mongod shard21进程,副本集名称:shard2启动mongod shard22进程,并设置副本集:shard2启动mongod shard23进程,并设置副本集:shard2
  • 27. Replica Set 和 Sharding 整合搭建把这三个进程配置成副本集,操作如下
  • 28. Replica Set 和 Sharding 整合搭建两个副本集够成的分片已经配置完成 3.下面配置Config server和Route process
  • 29. Replica Set 和 Sharding 整合搭建 4 配置Route Processchunk大小为1M,方便我们测试效果。5 配置分片的表和片键
  • 30. Replica Set 和 Sharding 整合搭建我用的还是Friends库中的FriendUser表来做分片,片键是_id,因为cmd宽度太小了添加分片的命令显示不完全,我手动把他们列出来 添加分片 db.runCommand({addshard:"shard1/127.0.0.1:10000,127.0.0.1:10001,127.0.0.1:10002"}) db.runCommand({addshard:"shard2/127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002"}) 到此整个构架已经配置完成了。 使用stats()来查看 分片状态
  • 31. Replica Set 和 Sharding 整合搭建
  • 32. 谢 谢~