MongoDB中使用分片集群結(jié)構(gòu)
          1、mongos:

          數(shù)據(jù)庫集群請求的入口,所有的請求都通過mongos進(jìn)行協(xié)調(diào),不需要在應(yīng)用程序添加一個(gè)路由選擇器,mongos自己就是一個(gè)請求分發(fā)中心,它負(fù)責(zé)把對應(yīng)的數(shù)據(jù)請求請求轉(zhuǎn)發(fā)到對應(yīng)的shard服務(wù)器上。在生產(chǎn)環(huán)境通常有多mongos作為請求的入口,防止其中一個(gè)掛掉所有的mongodb請求都沒有辦法操作。

          2、config server:

          顧名思義為配置服務(wù)器,存儲(chǔ)所有數(shù)據(jù)庫元信息(路由、分片)的配置。mongos本身沒有物理存儲(chǔ)分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存里,配置服務(wù)器則實(shí)際存儲(chǔ)這些數(shù)據(jù)。mongos第一次啟動(dòng)或者關(guān)掉重啟就會(huì)從
          config server 加載配置信息,以后如果配置服務(wù)器信息變化會(huì)通知到所有的 mongos 更新自己的狀態(tài),這樣 mongos
          就能繼續(xù)準(zhǔn)確路由。在生產(chǎn)環(huán)境通常有多個(gè) config server 配置服務(wù)器,因?yàn)樗鎯?chǔ)了分片路由的元數(shù)據(jù),這個(gè)可不能丟失!就算掛掉其中一臺(tái),只要還有存貨,
          mongodb集群就不會(huì)掛掉。

          3、shard:

          這就是傳說中的分片了。上面提到一個(gè)機(jī)器就算能力再大也有天花板,就像軍隊(duì)打仗一樣,一個(gè)人再厲害喝血瓶也拼不過對方的一個(gè)師。俗話說三個(gè)臭皮匠頂個(gè)諸葛亮,這個(gè)時(shí)候團(tuán)隊(duì)的力量就凸顯出來了。在互聯(lián)網(wǎng)也是這樣,一臺(tái)普通的機(jī)器做不了的多臺(tái)機(jī)器來做

          首先確定各個(gè)組件的數(shù)量,mongos 3個(gè), config server 3個(gè),數(shù)據(jù)分3片 shard server 3個(gè),每個(gè)shard
          有一個(gè)副本一個(gè)仲裁也就是 3 * 2 = 6 個(gè),總共需要部署15個(gè)實(shí)例。這些實(shí)例可以部署在獨(dú)立機(jī)器也可以部署在一臺(tái)機(jī)器,我們這里測試資源有限,只準(zhǔn)備了
          3臺(tái)機(jī)器,在同一臺(tái)機(jī)器只要端口不同就可以

          解壓壓縮包
          tar zxf mongodb-linux-x86_64-rhel62-3.0.6.tgz mv
          mongodb-linux-x86_64-rhel62-3.0.6 mongodb
          分別在每臺(tái)機(jī)器建立mongos 、config 、 shard1 、shard2、shard3 五個(gè)目錄。
          mkdir -p /usr/nacp/mongodb/mongos/log mkdir -p /usr/nacp/mongodb/config/data
          mkdir -p /usr/nacp/mongodb/config/log mkdir -p /usr/nacp/mongodb/shard1/data
          mkdir -p /usr/nacp/mongodb/shard1/log mkdir -p /usr/nacp/mongodb/shard2/data
          mkdir -p /usr/nacp/mongodb/shard2/log mkdir -p /usr/nacp/mongodb/shard3/data
          mkdir -p /usr/nacp/mongodb/shard3/log
          規(guī)劃5個(gè)組件對應(yīng)的端口號(hào),由于一個(gè)機(jī)器需要同時(shí)部署 mongos、config server
          、shard1、shard2、shard3,所以需要用端口進(jìn)行區(qū)分。這個(gè)端口可以自由定義,在本文 mongos為 20000, config server 為
          21000, shard1為 22001 , shard2為22002, shard3為22003。

          在每一臺(tái)服務(wù)器分別啟動(dòng)配置服務(wù)器。
          /usr/nacp/mongodb/bin/mongod --configsvr --dbpath
          /usr/nacp/mongodb/config/data --port 21000 --logpath
          /usr/nacp/mongodb/config/log/config.log --fork
          在每一臺(tái)服務(wù)器分別啟動(dòng)mongos服務(wù)器。
          /usr/nacp/mongodb/bin/mongos --configdb
          192.168.2.233:21000,192.168.2.235:21000,192.168.2.236:21000 --port 20000
          --logpath /usr/nacp/mongodb/mongos/log/mongos.log --fork
          在每一臺(tái)配置各個(gè)分片的副本集。nojournal 是為了關(guān)閉日志信息。 oplogsize是為了降低 local 文件的大小
          #在每個(gè)機(jī)器里分別設(shè)置分片1服務(wù)器及副本集shard1 /usr/nacp/mongodb/bin/mongod --shardsvr --replSet
          shard1 --port 22001 --dbpath /usr/nacp/mongodb/shard1/data --logpath
          /usr/nacp/mongodb/shard1/log/shard1.log --fork --nojournal --oplogSize 10
          #在每個(gè)機(jī)器里分別設(shè)置分片2服務(wù)器及副本集shard2 /usr/nacp/mongodb/bin/mongod --shardsvr --replSet
          shard2 --port 22002 --dbpath /usr/nacp/mongodb/shard2/data --logpath
          /usr/nacp/mongodb/shard2/log/shard2.log --fork --nojournal --oplogSize 10
          #在每個(gè)機(jī)器里分別設(shè)置分片3服務(wù)器及副本集shard3 /usr/nacp/mongodb/bin/mongod --shardsvr --replSet
          shard3 --port 22003 --dbpath /usr/nacp/mongodb/shard3/data --logpath
          /usr/nacp/mongodb/shard3/log/shard3.log --fork --nojournal --oplogSize 10
          分別對每個(gè)分片配置副本集
          #設(shè)置第一個(gè)分片副本集 /usr/nacp/mongodb/bin/mongo 127.0.0.1:22001 #使用admin數(shù)據(jù)庫 use admin
          #定義副本集配置 config = { _id:"shard1", members:[
          {_id:0,host:"192.168.2.233:22001",arbiterOnly:true},
          {_id:1,host:"192.168.2.235:22001"}, {_id:2,host:"192.168.2.236:22001"} ] }
          #初始化副本集配置 rs.initiate(config); #設(shè)置第二個(gè)分片副本集 /usr/nacp/mongodb/bin/mongo
          127.0.0.1:22002 #使用admin數(shù)據(jù)庫 use admin #定義副本集配置 config = { _id:"shard2",
          members:[ {_id:0,host:"192.168.2.233:22002"},
          {_id:1,host:"192.168.2.235:22002",arbiterOnly:true},
          {_id:2,host:"192.168.2.236:22002"} ] } #初始化副本集配置 rs.initiate(config);
          #設(shè)置第三個(gè)分片副本集 /usr/nacp/mongodb/bin/mongo 127.0.0.1:22003 #使用admin數(shù)據(jù)庫 use admin
          #定義副本集配置 config = { _id:"shard3", members:[ {_id:0,host:"192.168.2.233:22003"},
          {_id:1,host:"192.168.2.235:22003"},
          {_id:2,host:"192.168.2.236:22003",arbiterOnly:true} ] } #初始化副本集配置
          rs.initiate(config); #mongodb默認(rèn)是從主節(jié)點(diǎn)讀寫數(shù)據(jù)的,副本節(jié)點(diǎn)上不允許讀,需要設(shè)置副本節(jié)點(diǎn)可以讀。
          repset:SECONDARY> db.getMongo().setSlaveOk();
          設(shè)置分片配置,讓分片生效。
          如里shard是單臺(tái)服務(wù)器,用 db.runCommand( { addshard : “[: ]” }
          )這樣的命令加入,如果shard是副本集,用db.runCommand( { addshard :
          “replicaSetName/[:port][,serverhostname2[:port],…]” });這樣的格式表示 #連接到mongos
          /usr/nacp/mongodb/bin/mongo 127.0.0.1:20000 #使用admin數(shù)據(jù)庫 user admin。
          #串聯(lián)路由服務(wù)器與分配副本集1 db.runCommand( { addshard :
          "shard1/192.168.2.233:22001,192.168.2.235:22001,192.168.2.236:22001"});
          #串聯(lián)路由服務(wù)器與分配副本集2 db.runCommand( { addshard :
          "shard2/192.168.2.233:22002,192.168.2.235:22002,192.168.2.236:22002"});
          #串聯(lián)路由服務(wù)器與分配副本集3 db.runCommand( { addshard :
          "shard3/192.168.2.233:22003,192.168.2.235:22003,192.168.2.236:22003"});
          查看分片服務(wù)器的配置
          db.runCommand( { listshards : 1 } ); #內(nèi)容輸出 { "shards" : [ { "_id" : "shard1",
          "host" : "shard1/192.168.0.136:22001,192.168.0.137:22001" }, { "_id" :
          "shard2", "host" : "shard2/192.168.0.136:22002,192.168.0.137:22002" }, { "_id"
          : "shard3", "host" : "shard3/192.168.0.136:22003,192.168.0.137:22003" } ], "ok"
          : 1 } 分片副本集的仲裁節(jié)點(diǎn),所以在上面結(jié)果沒有列出來。
          連接在mongos上,準(zhǔn)備讓指定的數(shù)據(jù)庫、指定的集合分片生效。
          #指定testdb分片生效 db.runCommand( { enablesharding :"testdb"}); #指定數(shù)據(jù)庫里需要分片的集合和片鍵
          db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
          我們設(shè)置testdb的 table1 表需要分片,根據(jù) id 自動(dòng)分片到 shard1 ,shard2,shard3
          上面去。要這樣設(shè)置是因?yàn)椴皇撬衜ongodb 的數(shù)據(jù)庫和表 都需要分片!

          測試分片配置結(jié)果。
          #連接mongos服務(wù)器 /usr/nacp/mongodb/bin/mongo 127.0.0.1:20000 #使用testdb use testdb;
          #插入測試數(shù)據(jù) for (var i = 1; i <= 100000; i++)
          db.table1.save({id:i,"test1":"testval1"}); #查看分片情況如下,部分無關(guān)信息省掉了
          db.table1.stats(); { "sharded" : true, "ns" : "testdb.table1", "count" :
          100000, "numExtents" : 13, "size" : 5600000, "storageSize" : 22372352,
          "totalIndexSize" : 6213760, "indexSizes" : { "_id_" : 3335808, "id_1" : 2877952
          }, "avgObjSize" : 56, "nindexes" : 2, "nchunks" : 3, "shards" : { "shard1" : {
          "ns" : "testdb.table1", "count" : 42183, "size" : 0, ... "ok" : 1 }, "shard2" :
          { "ns" : "testdb.table1", "count" : 38937, "size" : 2180472, ... "ok" : 1 },
          "shard3" : { "ns" : "testdb.table1", "count" :18880, "size" : 3419528, ... "ok"
          : 1 } }, "ok" : 1 }
          java程序調(diào)用分片集群,因?yàn)槲覀兣渲昧巳齻€(gè)mongos作為入口,就算其中哪個(gè)入口掛掉了都沒關(guān)系,使用集群客戶端程序如下:
          public class TestMongoDBShards { public static void main(String[] args) { try
          { List<ServerAddress> addresses = new ArrayList<ServerAddress>(); ServerAddress
          address1 = new ServerAddress("192.168.2.233" , 20000); ServerAddress address2 =
          new ServerAddress("192.168.2.235" , 20000); ServerAddress address3 = new
          ServerAddress("192.168.2.236" , 20000); addresses.add(address1);
          addresses.add(address2); addresses.add(address3); MongoClient client = new
          MongoClient(addresses); DB db = client.getDB( "testdb" ); DBCollection coll =
          db.getCollection( "table1" ); BasicDBObject object = new BasicDBObject();
          object.append( "id" , 1); DBObject dbObject = coll.findOne(object); System. out
          .println(dbObject); //讀操作從副本節(jié)點(diǎn)讀取 ReadPreference preference = ReadPreference.
          secondary(); DBObject dbObject = coll.findOne(object, null , preference);
          System. out .println(dbObject); } catch (Exception e) { e.printStackTrace(); }
          } }
          primary:默認(rèn)參數(shù),只從主節(jié)點(diǎn)上進(jìn)行讀取操作;
          primaryPreferred:大部分從主節(jié)點(diǎn)上讀取數(shù)據(jù),只有主節(jié)點(diǎn)不可用時(shí)從secondary節(jié)點(diǎn)讀取數(shù)據(jù)。
          secondary:只從secondary節(jié)點(diǎn)上進(jìn)行讀取操作,存在的問題是secondary節(jié)點(diǎn)的數(shù)據(jù)會(huì)比primary節(jié)點(diǎn)數(shù)據(jù)“舊”。
          secondaryPreferred:優(yōu)先從secondary節(jié)點(diǎn)進(jìn)行讀取操作,secondary節(jié)點(diǎn)不可用時(shí)從主節(jié)點(diǎn)讀取數(shù)據(jù);
          nearest:不管是主節(jié)點(diǎn)、secondary節(jié)點(diǎn),從網(wǎng)絡(luò)延遲最低的節(jié)點(diǎn)上讀取數(shù)據(jù)。
          //連接到MongoDB服務(wù) 如果是遠(yuǎn)程連接可以替換“l(fā)ocalhost”為服務(wù)器所在IP地址 //ServerAddress()兩個(gè)參數(shù)分別為
          服務(wù)器地址 和 端口 ServerAddress serverAddress = new ServerAddress("localhost",27017);
          List<ServerAddress> addrs = new ArrayList<ServerAddress>();
          addrs.add(serverAddress); //MongoCredential.createScramSha1Credential()三個(gè)參數(shù)分別為
          用戶名 數(shù)據(jù)庫名稱 密碼 MongoCredential credential =
          MongoCredential.createScramSha1Credential("username", "databaseName",
          "password".toCharArray()); List<MongoCredential> credentials = new
          ArrayList<MongoCredential>(); credentials.add(credential); //通過連接認(rèn)證獲取MongoDB連接
          MongoClient mongoClient = new MongoClient(addrs,credentials);
          MongoClientOptions.Builder build = new MongoClientOptions.Builder();
          //與數(shù)據(jù)最大連接數(shù)50 build.connectionsPerHost(50);
          //如果當(dāng)前所有的connection都在使用中,則每個(gè)connection上可以有50個(gè)線程排隊(duì)等待
          build.threadsAllowedToBlockForConnectionMultiplier(50);
          build.connectTimeout(1*60*1000); build.maxWaitTime(2*60*1000);
          MongoClientOptions options = build.build(); MongoClient client = new
          MongoClient("127.0.0.1", options);

          友情鏈接
          ioDraw流程圖
          API參考文檔
          OK工具箱
          云服務(wù)器優(yōu)惠
          阿里云優(yōu)惠券
          騰訊云優(yōu)惠券
          京東云優(yōu)惠券
          站點(diǎn)信息
          問題反饋
          郵箱:[email protected]
          QQ群:637538335
          關(guān)注微信

                日本黄色网址大全 | 丁香五月婷婷激情小说 | 被窝电影网午夜伦电影韩国 | 五月乱伦电影 | 1000部A片无码成人免费看 |