mongodb高可用集群03---分片與副本集結合


1)架構圖:

 

2)四個組件:mongos、config server、shard、replica set

mongos,數據庫集群請求的入口,所有的請求都通過mongos進行協調,不需要在應用程序添加一個路由選擇器,mongos自己就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境通常有多mongos作為請求的入口,防止其中一個掛掉所有的mongodb請求都沒有辦法操作。

config server,顧名思義為配置服務器,存儲所有數據庫元信息(路由、分片)的配置。

Shard,和大數據存儲HDFS分片存儲的思想的東西。

Replica set,副本集服務器。

 

3)准備環境:

ip:192.168.30.131
ip:192.168.30.132
ip:192.168.30.134

4)在每台機器上建立mongos、config、shard1、shard2、shard3五個目錄。

#建立mongos目錄
mkdir -p /data/mongodbtest/mongos
#建立config server 數據文件存放目錄
mkdir -p /data/mongodbtest/config/data 
#建立config server 日志文件存放目錄
mkdir -p /data/mongodbtest/config/log
#建立config server 日志文件存放目錄
mkdir -p /data/mongodbtest/mongos/log
#建立shard1 數據文件存放目錄
mkdir -p /data/mongodbtest/shard1/data
#建立shard1 日志文件存放目錄
mkdir -p /data/mongodbtest/shard1/log
#建立shard2 數據文件存放目錄
mkdir -p /data/mongodbtest/shard2/data
#建立shard2 日志文件存放目錄
mkdir -p /data/mongodbtest/shard2/log
#建立shard3 數據文件存放目錄
mkdir -p /data/mongodbtest/shard3/data
#建立shard3 日志文件存放目錄
mkdir -p /data/mongodbtest/shard3/log
cd /data/mongodbtest

5)安裝mongodb

這里不多說了,看上個文章,還是在/data/mongodbtest/single里

 

6)規划5個組件對應的端口號,由於一個機器需要同時部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口進行區分。

這個端口可以自由定義,在本文 mongos為 20000, config server 為 21000, shard1為 22001 , shard2為22002, shard3為22003.

 

參數說明:

dbpath:數據存放目錄
logpath:日志存放路徑 logappend:以追加的方式記錄日志
replSet:replica set 的名字
port:mongodb 進程所使用的端口號,默認為 27017 fork:以后台方式運行進程

journal:寫日志
smallfiles:當提示空間不夠時添加此參數
其他參數
pidfilepath:進程文件,方便停止 mongodbdirectoryperdb:為每一個數據庫按照數據庫名建立文件夾存放 bind_ip:mongodb 所綁定的 ip 地址
oplogSize:mongodb 操作日志文件的最大大小。單位為 Mb,默認為硬盤剩余空間的 5%
noprealloc:不預先分配存儲
shardsvr:分片
configsvr:配置服務節點
configdb:配置 config 節點到 route 節點

7)在每台機器上啟動配置服務器

/data/mongodbtest/single/mongodb/bin/mongod --dbpath /data/mongodbtest/config/data/ --configsvr --port 21000 --logpath /data/mongodbtest/config/log/config.log –fork

8)在每台服務器上啟動mongos服務器

/data/mongodbtest/single/mongodb/bin/mongos --configdb 192.168.30.134:21000,192.168.30.132:21000,192.168.30.131:21000 --port 20000 --logpath /data/mongodbtest/mongos/log/mongos.log –fork

9)配置各個分片的副本集

#在每個機器里分別設置分片1服務器及副本集shard1

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodbtest/shard1/data --logpath /data/mongodbtest/shard1/log/shard1.log --fork -nojournal --oplogSize 10

#在每個機器里分別設置分片2服務器及副本集shard2

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodbtest/shard2/data --logpath /data/mongodbtest/shard2/log/shard2.log --fork -nojournal --oplogSize 10

#在每個機器里分別設置分片3服務器及副本集shard3

/data/mongodbtest/single/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodbtest/shard3/data --logpath /data/mongodbtest/shard3/log/shard3.log --fork -nojournal --oplogSize 10

任意登陸一個機器,比如登陸192.168.30.131,連接mongodb

#設置第一個分片副本集
/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22001
> use admin;
switched to db admin
#定義副本集配置
>config={_id:"shard1",members:[
... {_id:0,host:"192.168.30.131:22001"},
... {_id:1,host:"192.168.30.132:22001"},
... {_id:2,host:"192.168.30.134:22001",arbiterOnly:true}]#指定仲裁節點
... }
{
         "_id" : "shard1",
         "members" : [
                   {
                            "_id" : 0,
                            "host" : "192.168.30.131:22001"
                   },
                   {
                            "_id" : 1,
                            "host" : "192.168.30.132:22001"
                   },
                   {
                            "_id" : 2,
                            "host" : "192.168.30.134:22001",
                            "arbiterOnly" : true
                   }
         ]
}
#初始化副本集配置
>rs.initiate(config); 
#設置第二個分片副本集
/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22002 > use admin; >config={_id:"shard2",members:[ ... {_id:0,host:"192.168.30.131:22002"}, ... {_id:1,host:"192.168.30.132:22002"}, ... {_id:2,host:"192.168.30.134:22002",arbiterOnly:true}] ... } >rs.initiate(config); #設置第三個分片副本集 /data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:22003 > use admin; >config={_id:"shard3",members:[ ... {_id:0,host:"192.168.30.131:22003"}, ... {_id:1,host:"192.168.30.132:22003"}, ... {_id:2,host:"192.168.30.134:22003",arbiterOnly:true}] ... } >rs.initiate(config);

10)設置分片配置且生效

/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:20000
mongos> use admin;
#串聯路由服務器與分配副本集1、23
#如里shard是單台服務器,用db.runCommand( { addshard : “[: ]” } )命令,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });格式
mongos> db.runCommand({addshard:"shard1/192.168.30.131:22001,192.168.30.132:22001,192.168.30.134:22001"});
{ "shardAdded" : "shard1", "ok" : 1 }
mongos> db.runCommand({addshard:"shard2/192.168.30.131:22002,192.168.30.132:22002,192.168.30.134:22002"});
{ "shardAdded" : "shard2", "ok" : 1 }
mongos> db.runCommand({addshard:"shard3/192.168.30.131:22003,192.168.30.132:22003,192.168.30.134:22003"});
{ "shardAdded" : "shard3", "ok" : 1 }
#查看分片服務器的配置
mongos>db.runCommand({listshards:1});
{
         "shards" : [
                   {
                            "_id" : "shard1",
                            "host" : "shard1/192.168.30.131:22001,192.168.30.132:22001"
                   },
                   {
                            "_id" : "shard2",
                            "host" : "shard2/192.168.30.131:22002,192.168.30.132:22002"
                   },
                   {
                            "_id" : "shard3",
                            "host" : "shard3/192.168.30.131:22003,192.168.30.132:22003"
                   }
         ],
         "ok" : 1
}

注:因為192.168.30.134是每個分片副本集的仲裁節點,所以在上面結果沒有列出來。

11)指定的數據庫和集合分片生效

/data/mongodbtest/single/mongodb/bin/mongo 127.0.0.1:20000
mongos> use admin;
#指定testdb庫分片生效
mongos>db.runCommand({enablesharding:"testdb"});
{ "ok" : 1 }
#指定數據庫里需要分片的集合和片鍵,片鍵為id且唯一
mongos> db.runCommand({shardcollection:"testdb.teble1",key:{id:1},unique:true});
{ "collectionsharded" : "testdb.teble1", "ok" : 1 }

12)測試分布配置是否成功:

mongos> use testdb;
#插入測試數據
mongos> for(var i=1;i<=5000;i++) db.teble1.save({id:i,"test1":"testval1"});
WriteResult({ "nInserted" : 1 })
#查看分片情況
mongos> db.teble1.stats()
{
         "sharded" : true,
         "paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
         "userFlags" : 1,
         "capped" : false,
         "ns" : "testdb.teble1",
         "count" : 5000,
         "numExtents" : 6,
         "size" : 560000,
         "storageSize" : 712704,
         "totalIndexSize" : 351568,
         "indexSizes" : {
                   "_id_" : 188048,
                   "id_1" : 163520
         },
         "avgObjSize" : 112,
         "nindexes" : 2,
         "nchunks" : 3,
         "shards" : {
                   "shard1" : {
                            "ns" : "testdb.teble1",
                            "count" : 4991,
                            "size" : 558992,
                            "avgObjSize" : 112,
                            "numExtents" : 4,
                            ……#省略
                   },
                   "shard2" : {
                            "ns" : "testdb.teble1",
                            "count" : 1,
                            "size" : 112,
                            "avgObjSize" : 112,
                            "numExtents" : 1,
                            "storageSize" : 8192,
                            "lastExtentSize" : 8192,
                            ……
                   },
                   "shard3" : {
                            "ns" : "testdb.teble1",
                            "count" : 8,
                            "size" : 896,
                            "avgObjSize" : 112,
                            "numExtents" : 1,
                            "storageSize" : 8192,
                            "lastExtentSize" : 8192,
                            …….
                   }
         },
         "ok" : 1
}

13)java程序調用分片集群

public class TestMongoDBShards {
       public static void main(String[] args) {
             try {
                  List<ServerAddress> addresses = new ArrayList<ServerAddress>();
                  ServerAddress address1 = new ServerAddress("192.168.30.131" , 20000);
                  ServerAddress address2 = new ServerAddress("192.168.30.132" , 20000);
                  ServerAddress address3 = new ServerAddress("192.168.30.134" , 20000);
                  addresses.add(address1);
                  addresses.add(address2);
                  addresses.add(address3);

                  MongoClient client = new MongoClient(addresses);
                  DB db = client.getDB( "testdb" );
                  DBCollectioncoll = db.getCollection( "table1" );
                  BasicDBObject object = new BasicDBObject();
                  object.append( "id" , 1);
                  DBObjectdbObject = coll.findOne(object);
                  System.out .println(dbObject);
            } catch (Exception e) {
                  e.printStackTrace();
            }
      }
}

 

 

方案缺陷:

仲裁節點很閑,而主從節點承擔全部讀寫壓力,是服務器負載不均衡,資源浪費。

方案改型成,如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM