<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [TOC] 參考 :[https://cnodejs.org/topic/599e1c1fbae6f2ed6f7e4cb5](https://cnodejs.org/topic/599e1c1fbae6f2ed6f7e4cb5) ### MongoDB分片集群 **(Sharding)** ***** Sharding cluster是一種可以水平擴展的模式,在數據量很大時特給力,實際大規模應用一般會采用這種架構去構建 **MongoDB分片群集主要有如下三個組件:** * Shard:分片服務器,用于存儲實際的數據塊,實際生產環境中一個shard server 角色可以由幾臺服務器組成一個Peplica Set 承擔,防止主機單點故障。 * Config Server:配置服務器,存儲了整個分片群集的配置信息,其中包括chunk信息。 * Routers:前端路由,客戶端由此接入,且讓整個群集看上去像單一數據庫,前端應用可以透明使用。 **為何需要水平分片** 1)減少單機請求數,將單機負載,提高總負載 2)減少單機的存儲空間,提高總存空間 ` ` #### Linux下構建 虛擬機一 | **角色** | **IP** | **端口** | **副本集名稱** | | --- | --- | --- | --- | | mongos| 192.168.0.174|27017| | | shard1| 192.168.0.174|27018| rep_shard1| | shard2| 192.168.0.174|27019| rep_shard2| | confserver| 192.168.0.174|2000| rep_confsvr| ``` docker run -it --net=mynet --ip=192.168.0.174 -p 17017:27017 -p 17018:27018 -p 17019:27019 -p 10000:20000 -v /root/Docker/Mongodb/sd174/:/data/ --privileged=true --name mongo_v1 mongo:latest /bin/bash ``` 虛擬機二 | **角色** | **IP** | **端口** | **副本集名稱** | | --- | --- | --- | --- | | mongos| 192.168.0.175|27017| | | shard1| 192.168.0.175|27018| rep_shard1| | shard2| 192.168.0.175|27019| rep_shard2| | confserver| 192.168.0.175|2000| rep_confsvr| ``` docker run -it --net=mynet --ip=192.168.0.175 -p 27017:27017 -p 27018:27018 -p 27019:27019 -p 20000:20000 -v /root/Docker/Mongodb/sd175/:/data --privileged=true --name mongo_v2 mongo:latest /bin/bash ``` 虛擬機三 | **角色** | **IP** | **端口** | **副本集名稱** | | --- | --- | --- | --- | | shard1| 192.168.0.176|27018| rep_shard1| | shard2| 192.168.0.176|27019| rep_shard2| | confserver| 192.168.0.176|2000| rep_confsvr| ``` docker run -it --net=mynet --ip=192.168.0.176 -p 37017:27017 -p 37018:27018 -p 37019:27019 -p 30000:20000 -v /root/Docker/Mongodb/sd176/:/data/ --privileged=true --name mongo_v3 mongo:latest /bin/bash ``` ` ` ##### 搭建配置服務器 因為Mongodb3.4版本后需要配置服務器必須配置為副本集,所以需要給**配置服務器配置副本集** 分別在三臺機器上創建config01目錄 ``` >mkdir config01 ``` 在三臺機器上分別執行命令: ``` mongod --dbpath config01 --replSet conServer --configsvr --port 20000 --bind_ip_all ``` 然后通過mongo隨意進入一個副本集成員,并為配置服務器的副本集進行配置: ``` mongo --port 20000 --host localhost > var conf = { _id: 'conServer', version: 1, members: [ { _id: 0, host: '192.168.0.174:20000' }, { _id: 1, host: '192.168.0.175:20000' }, { _id: 2, host: '192.168.0.176:20000' } ] }; > rs.initiate(conf); var conf = { _id: 'conServer', version: 1, members: [ { _id: 0, host: '192.168.0.90:27100' }, { _id: 1, host: '192.168.0.90:27101' }, { _id: 2, host: '192.168.0.90:27102' } ] }; ``` 至此我們的配置服務器配置完成。 ` ` ##### 搭建分片服務器 官方建議我們的分片服務區至少在3個或以上才能發揮出更好的性能,我們這里也創建三個分片服務器。 下面創建三個空數據庫目錄,然后啟動它們,在啟動的時候需要加上[`--shardsvr`]以表示這是一個分片服務器(沒有強制是副本集)分別在三臺機器上創建分片副本集**shardServer0**, **shardServer1**, **shardServer2**: ``` $ mkdir sd01 sd02 $ mongod --dbpath sd01 --shardsvr --port 27018 --replSet rep_shard1 --bind_ip_all $ mongod --dbpath sd02 --shardsvr --port 27019 --replSet rep_shard2 --bind_ip_all ``` 啟動每臺虛擬機的 27018 實例即分片 1 并配置副本集: ``` >mongo --port 27018 --host localhost >var conf = { _id: 'rep_shard1', version: 1, members: [ { _id: 0, host: '192.168.0.174:27018 ' }, { _id: 1, host: '192.168.0.175:27018' }, { _id: 2, host: '192.168.0.176:27018' } ] }; > rs.initiate(conf); var conf = { _id: 'rep_shard3', version: 1, members: [ { _id: 0, host: '192.168.0.90:27022' } ] }; ``` 啟動每臺虛擬機的 27019 實例即分片 2 并配置副本集: ``` >mongo --port 27019 --host localhost >var conf = { _id: 'rep_shard2', version: 1, members: [ { _id: 0, host: '192.168.0.174:27019 ' }, { _id: 1, host: '192.168.0.175:27019' }, { _id: 2, host: '192.168.0.176:27019' } ] }; > rs.initiate(conf); ``` 啟動虛擬機一和虛擬機二的 27017 實例即 mongos 路由,注意這里是通過 mongos 啟動非 mongod ` ` ` ` ##### 搭建路由服務器 mongodb提供了一個路由工具,它會隨著我們下載包一起下載,名字為`mongos`或`mongos.exe`,通過它配置路由功能。 啟動路由我們需要加上參數[`--configdb`](https://docs.mongodb.com/manual/reference/program/mongos/),它的語法為: ``` --configdb 配置服務器副本集名稱/配置服務器1地址端口,配置服務器1地址端口... ``` 啟動路由,并為路由指定一個端口,用于開放給客戶端鏈接: ``` $ mongos --configdb conServer/192.168.0.174:20000,192.168.0.175:20000,192.168.0.176:20000 --port 27017 --bind_ip_all ``` 登錄虛擬機一的 mongos 終端,和普通登錄 MongoDB 一樣,只需將端口改成 mongos 的端口 27017 即可,運行以下命令將 rep_shard1 和 rep_shard2 分片加入集群,到此一個分片環境已經搭建完成: ``` sh.addShard("rep_shard1/192.168.0.174:27018,192.168.0.175:27018,192.168.0.176:27018") sh.addShard("rep_shard2/192.168.0.174:27019,192.168.0.175:27019,192.168.0.176:27019") ``` ` ` ##### 驗證分片集群是否搭建成功 通過運行`sh.status()`命令可以查看分片相關信息,如有以下輸出,說明分片集群搭建成功。 ` ` ##### 創建新用戶 這里的登錄密碼就是config集群配置的用戶名和密碼;上面介紹的兩種登錄方式在這里也適用;這里用mongo連接的時候 端口可以不指定 因為mongo默認的啟動端口就是27017 和我們這邊設置的相同; 這里使用root用戶登錄: ``` mongo; use admin; db.auth('root','root'); ``` 登錄到任意一臺route服務器,已root用戶登錄,并創建新用戶; ``` mongo; use admin; db.auth('root','root'); use database01; db.createUser( { user: "readWrite", pwd: "readWrite", roles: [ { role: "readWrite", db: "database01" } ] } ) ``` ` ` #### 單機構建分片 ***** ##### 搭建配置服務 首先建立三個空的數據庫目錄,用于搭建配置服務器的副本集,并分別啟動它們,在啟動的時候需要加上我們副本集的名稱和[`--configsvr`](https://docs.mongodb.com/manual/reference/program/mongod/)來表示這是一個配置服務器,并分別指定不同的端口: ``` mkdir config01 config02 config03 mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config01 --replSet conServer --configsvr --port 10000 --bind_ip_all mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config02 --replSet conServer --configsvr --port 10001 --bind_ip_all mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\config03 --replSet conServer --configsvr --port 10002 --bind_ip_all ``` 隨便進入哪一個副本: ``` mongo --port 10000 --host localhost ``` 添加其他副本集: ``` var conf = { _id: 'conServer', version: 1, members: [ { _id: 0, host: 'localhost:10000' }, { _id: 1, host: 'localhost:10001' }, { _id: 2, host: 'localhost:10002' } ] }; rs.initiate(conf); ``` ` ` ##### 搭建分片服務器 創建三個空目錄,在啟動的時候需要加上[`--shardsvr`](https://docs.mongodb.com/manual/reference/program/mongod/)以表示這是一個分片服務器: ``` mkdir sh0 sh1 sh2 mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard01 --shardsvr --port 20000 mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard02 --shardsvr --port 20001 mongod --dbpath C:\Users\Administrator\Desktop\Pkg\mongodb\shard03 --shardsvr --port 20003 ``` ` ` ##### 搭建路由服務器 啟動路由,并為路由指定一個端口,用于開放給客戶端鏈接: ``` mongos --configdb conServer/localhost:10000,localhost:10001,localhost:10002 --port 3000 --bind_ip_all ``` 添加分片服務 ``` mongo --port 3000 --host localhost > sh.addShard('ip:20000'); > sh.addShard('ip:20001'); > sh.addShard('ip:20002'); ``` 如果你可以通過`rs.status()`方法中返回的`shards`字段看是否添加成功。 刪除分片 ``` db.adminCommand( { removeShard: "shard0000" } ) ``` ` ` ##### 配置片鍵 到目前為止,分片服務器已經搭建完成,但是目前分片服務器無法正常工作,我們所有的操作都將在隨機的一個主分片上操作,這是因為分片服務器不知道怎么進行分片,所以我們還需要配置片鍵來告訴分片服務器按照什么來分片。 分片是基于數據庫集合中的文檔的一個鍵進行分片的,比如選擇username鍵,那么會根據這個鍵的順序就行分片,而mongodb會自動平衡分片的數據。 Mongodb要求作為片鍵的鍵必須是索引過的,所以我們在建立片鍵之前需要對鍵進行索引,建立后片鍵就是集合中的最重要的索引。 在生產環境中建議先想好數據建構建立索引和片鍵后開始操作數據,這樣會減輕分片服務器的負載。 首先我們在需要進行分片的數據庫上開啟分片功能,通過`sh.enableSharding`方法開啟。 ``` mongo --port 3000 --host localhost sh.enableSharding('test'); ``` 然后在開啟分片的數據庫中的test集合插入測試數據,注意此時我們還沒有進行配置片鍵,所以所有的數據操作都在分片服務器隨機分配的一個主分片上面進行的。 ``` for(var i = 0; i < 100; i++){ db.test.insert({ username: 'user' + i, idNum: i }) } ``` 這時候以username為片鍵,通過[`sh.shardCollection`](https://docs.mongodb.com/manual/reference/method/sh.shardCollection/)方法進行建立,它的語法為: ``` sh.shardCollection(namespace, key, unique, options) ``` 首先給我們要建立的片鍵建立索引: ``` > db.test.ensureIndex({'username': 1}); ``` 然后建立片鍵: ``` > sh.shardCollection('test.test', {username:1}); ``` 等待幾分鐘后,可以通過`sh.status`方法查看數據分片的情況了,可以從中很清楚的看見哪些數據在哪個分片服務器上面,并且通過[`explain`](https://wuyizhou.com/2017/08/mongodb-index-one.html)方法來查看我們查詢的過程中哪些分片服務器參與了查詢。 ### 分片 [分片](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-sharding)是一種用于在多臺計算機之間分配數據的方法. MongoDB使用分片來支持具有非常大的數據集和高吞吐量操作的部署. ### MongoDB分片集群 MongoDB分片[群集](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-sharded-cluster)由以下組件組成: ``` * 碎片:每個碎片包含碎片數據的子集. 每個分片都可以部署為[副本集] * mongos:`mongos`充當查詢路由器,在客戶端應用程序和分片群集之間提供接口. * config服務器:配置服務器存儲集群的元數據和配置設置. 從MongoDB 3.4開始,必須將配置服務器部署為副本集(CSRS). ``` ### 分片key MongoDB使用分片[鍵]在各個分片之間分發集合的文檔. 分片[鍵](https://s0docs0mongodb0com.icopy.site/manual/reference/glossary/#term-shard-key)由目標集合中每個文檔中存在的一個或多個字段組成. 1. 在分片集合時選擇分片鍵. 分片后不能更改分片鍵的選擇. 分片集合只能有*一個分片*密鑰. 請參閱分片[密鑰規范](https://s0docs0mongodb0com.icopy.site/manual/core/sharding-shard-key/#sharding-shard-key-creation). 2. 要分片非空集合,該集合必須具有以分片鍵開頭的[索引]. 對于空集合,如果集合尚不具有指定分片鍵的適當索引,則MongoDB會創建索引. 3. 分片密鑰的選擇會影響分片群集的性能,效率和可伸縮性. 選擇分片密鑰可以使具有最佳硬件和基礎結構的群集成為瓶頸.[分片]密鑰及其后備索引的選擇也會影響群集可以使用的[分片策略](https://s0docs0mongodb0com.icopy.site/manual/sharding/#sharding-strategy). ![dGh0JO.png](https://s1.ax1x.com/2020/08/20/dGh0JO.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看