MongDB分布式集群可以对数据进行备份,提升数据安全性,以及提升集群提升读写服务的能力和数据存储能力。主要经过副本集(replica)对数据进行备份,经过分片(sharding)对大的数据进行分割,分布式存储在不一样节点上。mongodb
副本集由若干台服务器组成,分为三种角色:主服务器、副服务器、仲裁服务器。根据集群搭建的需求,仲裁服务器不是必需的。主服务器提供主要的对外读写的功能,副服务器做为备份。当主服务器不可用时,其他服务器根据投票选出一个新的主服务器,提供读写功能。所以,副本集能够提升集群的可用性。数据库
分片主要是为减少高数据量和高吞吐量的数据库应用对单机性能形成的压力。将大的数据分片存储在不一样节点上,外部读写只操做相应的一个或一小部分节点,一次减小每一个分片节点村春的数据量和处理的请求数 。安全
其中每一个分片是一个副本集,副本集的结构以下图 服务器
注意:在生产环境中,配置服务器务必使用三个,而不是一个;每一个分片节点都部署成副本集,而不是一个单独的Mongo服务器架构
配置文件用于在启动mongod时加载配置,也可使用该命令行启动项,不过配置项不少的时候,命令行参数不少。因此应该把配置项都写到配置文件中。每一个节点都有一个配置文件。app
配置文件主要包括如下配置项:分布式
如下以部署一个有三个节点(一个primary,一个secondary, 一个arbiter)1rs0的副本集为例,并假设三个节点的hostname是:hostname_primary:1111, hostname_secondary:2222, hostname_arbiter:3333。其中端口号按需求定;另外,假设三个节点配置文件的路径分别为:config_path_primary, config_path_secondary, config_path_arbiter。此时,配置文件中不该该设置keyFile和auth两个配置项
replSet配置项应该设置为rs0,不然在下面的步骤中会遇到下面的错误函数
{ "ok" : 0, "errmsg" : "Attempting to initiate a replica set with name rs0, but command line reports rs1; rejecting", "code" : 93 }
部署步骤:性能
1.启动三个节点ui
mongod -f config_path_primary mongod -f config_path_secondary mongod -f config_path_arbiter
2.在primary节点所在的机器登录上primary节点
mongo --port 1111
3.初始化
rs.initiate({_id : "rs0", members : [{_id : 0, host : "hostname_primary:1111"}]})
结果应该以下
{"ok" : 1}
4.添加secondary节点
rs.add("hostname_secondary:2222")
结果以下
{"ok" : 1}
5.添加仲裁节点
rs.addArb("hostname_arbiter:3333")
结果仍是以下:
{"ok" : 1}
到了这里,一个三个节点的副本集rs0就部署好了^-^,若是须要部署更多节点,执行步骤4。
如今运行
rs.conf()
能够看到以下结果:
{ "_id" : "rs1", "version" : 3, "members" : [ { "_id" : 0, "host" : "localhost:4094", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 1, "host" : "localhost:4095", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 }, { "_id" : 2, "host" : "localhost:4096", "arbiterOnly" : true, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : 0, "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatTimeoutSecs" : 10, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 } } }
分片部署就是要将几个不一样的副本集联系起来。如今部署一个有三个配置服务器,一个mongos,一个分片的集群。
1.部署配置服务器,三个配置服务器的配置文件分别为:配置服务器也是mongod实例,因此须要在配置文件中指示其做为配置服务器运行,加上选项
configsvr=true
不该该有选项
replSet=rs0
由于它不是做为副本集的节点运行。
设三个配置服务器的hostname分别为: hostname_config_1, hostname_config_2, hostname_config_3,端口分别为:4444, 5555, 6666
启动三个配置服务器:
mongod -f config_path_conf1 mongod -f config_path_conf2 mongod -f config_path_conf3
2.部署mongos服务器,设其hostname为host_name_mongos,端口为8888。其配置文件路径为config_path_mongos,因为mongos不存储数据,因此不须要dbpath 选项。同时因为mongos要从配置服务器上获取集群的配置信息,因此须要制定配置服务器的hostname和端口,加上选项configdb
configdb = hostname_config_1:4444, hostname_config_2 : 5555, hostname_config_3 : 6666
启动mongos服务器
mongos -f config_path_mongos
注意这里是mongos,不是mongod。不是我打错字了!
3.在mongos所在机器登录mongos服务器
mongo –port 8888
此时,运行
sh.status()
你会发现,shards一项里什么都没有,这是由于咱们尚未给这个集群加分片。
4.添加rs0成为集群的分片
sh.addShard("rs0/hostname_primary:1111")
这里括号里面只须要是副本集名加上一个副本集中的成员便可,不必定要是primary节点。如:
sh.addShard("rs0/hostname_secondary:2222") sh.addShard("rs0/hostname_arbiter:3333")
也是能够的。若是获得以下结果:
{“shardAdded” : “rs1”, “ok” : 1}
那么添加分片节点成功了。如今再运行
sh.status()
获得的结果为
sharding version: { "_id" : 1, "minCompatibleVersion" : 5, "currentVersion" : 6, "clusterId" : ObjectId("559f7fc9d8cec40f5a0f7609") } shards: { "_id" : "rs0", "host" : "rs0/hostname_primary:1111,hostname_secondary:2222" } balancer: Currently enabled: yes Currently running: no Failed balancer rounds in last 5 attempts: 0 Migration Results for the last 24 hours: No recent migrations databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" }
shards不为空了,rs成为了一个shard节点
权限认证是很是重要的,生产环境中的集群必需有权限认证,并且须要比较严格的权限认证。
1.建立第一个用户
在上面部署成功的集群上执行如下步骤,在数据库admin中建立第一个具备最高root权限的用户root:
use admin db.createUser({user : "root", pwd : "q,.wemr213oiz923*(*LNY", roles : [{role : "root", db : "admin"}]})
2.关闭全部上面部署的节点,能够用
db.shutdownServer()
也能够暴力kill
3.产生keyFile,并复制到每一个运行集群节点的服务器上。
openssl rand -base64 741 > mongodb-keyfile chmod 600 mongodb-keyfile
4.在每一个节点的配置文件中加上选项:
keyFile = <key_file_path>
5.在出mongos外的全部节点的配置文件中加上选项
auth = true
6.重启全部节点,到此权限认证已经搞完了,如今就能够插入数据库,并按需求添加用户,赋予相应的权限。进行认证受权的函数为db.auth(), 例如:
db.auth("root", "<password>")
此时拥有root权限,能够进行一切操做。