集群复制方式及区别
1. 复制方式
复制是跨多个MongoDB服务器(节点)分布和维护数据的方法。MongoDB提供的复制方法有两种:一、主从复制(有点过时);二、可复制集群。
2. 区别
相同点:主节点接受所有的请求,然后所有的从节点读取,并且异步同步所有数据。
不同点:可复制集群额外增加了自动化灾备机制,如果主节点宕机,无论什么原因,其中一个从节点会自动提升为主节点;可复制集群节点上限为50,主从复制则任意数量。
问题:假如一部分数据a写入主节点A,但是数据a还没有复制到其他节点,主节点A挂了,从节点b成为主节点,然后又写入了一部分数据b,那么a和b两份数据如何正常的保存在各个副本集。(下次整理好补充)
副本集集群
1. 副本集集群简介
副本集集群:主服务器的主节点宕机后,从服务器的从节点会在自己和裁判的投票上,让自己成为主节点;当宕机的主节点再重新启动时,它将成为从节点。(从节点想要升为主节点,支持率需要大于50%,所以副本集的节点数加仲裁数必须大于3)
2. 搭建副本集集群
分别启动两个节点和一个仲裁:
mongod --dbpath"F:\MongoDBGroup\Copy1\db" --port 8881 --replSet group
mongod --dbpath"F:\MongoDBGroup\Copy2\db" --port 8882 --replSet group
mongod --dbpath"F:\MongoDBGroup\Arbiter\db" --port 8880 --replSet group
进入其中一个节点管理(不能为裁判节点),并设置集群
mongo127.0.0.1:8881/admin
db.runCommand({"replSetInitiate":{"_id":"group","members":[{"_id":1,"host":"127.0.0.1:8881","priority":1.0},{"_id":2,"host":"127.0.0.1:8882"},{"_id":3,"host":"127.0.0.1:8880","arbiterOnly":true}]}})
查看副本集状态:
当关掉节点1,节点2从从节点升为了主节点。
再次启动节点1,节点1变为从节点。
分片集群:(海量数据分布式集群)
启动配置服务器:
mongod --configsvr --dbpath"F:\MongoDBGroup\Shard\Config1\db" --port 7001 --replSet config
mongod --configsvr--dbpath "F:\MongoDBGroup\Shard\Config2\db" --port 7002 --replSet config
mongo 127.0.0.1:7001/admin
db.runCommand({"replSetInitiate":{"_id":"config","members":[{"_id":1,"host":"127.0.0.1:7001"},{"_id":2,"host":"127.0.0.1:7002"}]}})
启动两个分片节点:
mongod --dbpath"F:\MongoDBGroup\Shard\Shard1\db" --port 7771 --replSet group1
mongod --dbpath"F:\MongoDBGroup\Shard\Shard2\db" --port 7781 --replSet group2
分别启动副本集和仲裁服务器:
mongod --dbpath "F:\MongoDBGroup\Shard\SCopy1\db" --port 7772--replSet group1
mongod --dbpath "F:\MongoDBGroup\Shard\SCopy2\db"--port 7782 --replSet group2
mongod --dbpath"F:\MongoDBGroup\Shard\SArbiter1\db" --port 7770 --replSet group1
mongod --dbpath"F:\MongoDBGroup\Shard\SArbiter2\db" --port 7780 --replSet group2
配置副本集:
mongo 127.0.0.1:7771/admin
db.runCommand({"replSetInitiate":{"_id":"group1","members":[{"_id":1,"host":"127.0.0.1:7771"},{"_id":2,"host":"127.0.0.1:7772"},{"_id":3,"host":"127.0.0.1:7770","arbiterOnly":true}]}})
mongo 127.0.0.1:7781/admin
db.runCommand({"replSetInitiate":{"_id":"group2","members":[{"_id":1,"host":"127.0.0.1:7781"},{"_id":2,"host":"127.0.0.1:7782"},{"_id":3,"host":"127.0.0.1:7780","arbiterOnly":true}]}})
启动mongos进程,分别配置两个配置服务器:
mongos --configdb config/127.0.0.1:7001,127.0.0.1:7002--port 7701
(PS:mongos进程是轻量级的、不持久化的。因此,它们通常部署在应用服务器上,以确保只有一个网络活跃点来转发请求。换句话说,应用程序连接本地的mongos,而mongos管理与每个分片服务器的连接。)
进入路由节点管理:
mongo 127.0.0.1:7701/admin
db.runCommand({"addshard":"group1/127.0.0.1:7771",allowLocal:true})
db.runCommand({"addshard":"group2/127.0.0.1:7781",allowLocal:true})
启动分片和创建片键:
(PS:片键一经选择无法删除修改,所以设计之初一定要考虑好片键)
db.runCommand({"enablesharding":"test"})
db.runCommand({"shardcollection":"test.User","key":{"Age":1}})
db.runCommand({"shardcollection":"test.User","key":{"Age":1,"_id":1}})
添加用户
db.createUser({user:"admin",pwd:"123456",roles:[{role:"root"}]})
db.auth("test","123456")
附录:
部分指令参数说明:
--dbpath:服务节点路径
--logpath:日志指定文件路径
--port:端口
-- replset:集群名称
--Auth:开启安全认证
--keyFile:集群密钥文件,这个指令默认开启安全认证
)