window配置mongodb叢集(複本集)

來源:互聯網
上載者:User

標籤:解釋   最大   word   insert   就是   pat   except   記錄檔   cursor   

參數解釋:

dbpath:資料存放目錄

logpath:日誌存放路徑

pidfilepath:進程檔案,有利於關閉服務

logappend:以追加的方式記錄日誌(boolean值)

replSet:複本集的名字,每一個複本集名字相同

port:mongodb的連接埠號碼

oplogSize:mongodb動作記錄檔案的最大大小,單位為Mb,預設為硬碟剩餘空間的5%

noprealloc:不預先分配儲存

fork:以後台方式運行進程(linux使用)

directoryperdb:為每一個資料庫按照資料庫名建立檔案夾存放

health表示複本集中該節點是否正常,0表示不正常,1表示正常

state表示節點的身份,0表示非主節點,1表示主節點

stateStr用於對節點身份進行字元描述,PRIMARY表示主節點,SECONDARY表示副節點

name是複本集節點的ip和連接埠資訊

priority:複本集節點優先權,這個值的範圍是0--100,值越大,優先權越高,預設的值是1,假設值是0,那麼不能成為primay

arbiterOnly:設定仲裁節點

首先我們先來搭建一個複本集(複本集結構為1個主節點,一個從節點一個仲裁節點)

第一步:我們在原生1001、1002和1003三個連接埠上啟動三個不同的Mongodb執行個體;

mongod --port 1001 --dbpath F:/mongos/mongodb1/data  --logpath  F:/mongos/mongodb1/log/mongodb.log  --pidfilepath F:/mongos/mongodb1/mongodb1.pid  --replSet test --logappend  --directoryperdb
mongod --port 1002 --dbpath F:/mongos/mongodb2/data --logpath F:/mongos/mongodb2/log/mongodb.log  --pidfilepath F:/mongos/mongodb2/mongodb2.pid --replSet test --logappend   --directoryperdb
mongod --port 1003 --dbpath F:/mongos/mongodb3/data --logpath F:/mongos/mongodb3/log/mongodb.log  --pidfilepath F:/mongos/mongodb3/mongodb3.pid --replSet test --logappend   --directoryperdb

第二步:登入到1001執行個體上編寫指令,將三個不同的Mongodb執行個體結合在一起形成一個完整的複本集;

cd F:\mongos\mongodb1\bin

mongo 127.0.0.1:1001

use admin

config_test={_id:"test",members:[
    {_id:0,host:"127.0.0.1:1001",priority:1},
    {_id:1,host:"127.0.0.1:1002",priority:1},
    {_id:2,host:"127.0.0.1:1003",arbiterOnly:true},
]};
這裡,members中可以包含多個值,這裡列舉的就是剛才啟動的三個Mongodb執行個體,並且通過_id欄位給複本集起了名字test。

第三步:通過執行下面的命令初始化複本集。

rs.initiate(config_test);

這裡使用上面的配置初始化Mongodb複本集。

rs.status()

想查看複本集的狀態

到這裡搭建起一個由三個Mongodb執行個體構成的名稱為test的複本集了。

複本集現在搭建起來了,那麼這個複本集能不能解決我們上面主從模式的兩個問題呢?

我們首先從第一個問題開始看,我們將1001連接埠的Mongodb伺服器給關閉,然後我們使用rs.status()命令來查看下,如下所示:

從返回包資訊中,可以看到關閉1001連接埠後,在複本集節點的狀態中該節點是不可達的,重新選取產生的主節點是1002連接埠上啟動的Mongodb執行個體,選舉過程是這樣的,當主節點掛掉之後,其他節點可以發起選舉行為,只要在選舉過程中某個節點得到複本集節點數一半以上的選票並且沒有節點投反對票,那麼該節點就可以成為主節點。(參數注釋請看開始位置)在1001連接埠上的Mongodb執行個體掛掉之後,1002成為了新的主節點,可以實現故障自動切換。

至於第二個問題,那就是主節點負責所有的讀寫操作造成主節點壓力較大,那麼在複本集中如何解決這個問題了呢?正常情況下,我們在Java中訪問複本集是這樣的,如下所示:

public class TestMongoDBReplSet {       public static void main(String[] args)  {          try {               List<ServerAddress> addresses = new ArrayList<ServerAddress>();                ServerAddress address1 = new ServerAddress("127.0.0.1",1001);               ServerAddress address2 = new ServerAddress("127.0.0.1",1002);               ServerAddress address3 = new ServerAddress("127.0.0.1",1003);               addresses.add(address1);                addresses.add(address2);               addresses.add(address3);               MongoClient client = new MongoClient(addresses);               DB db = client.getDB( "testdb");               DBCollection coll = db.getCollection( "testdb");               // 插入               BasicDBObject object = new BasicDBObject();                object.append("userid","001");               coll.insert(object);               DBCursor dbCursor = coll.find();               while (dbCursor.hasNext()) {                   DBObject dbObject = dbCursor.next();                    System. out.println(dbObject.toString());               }           } catch (Exception e) {               e.printStackTrace();            }       }   } 

但是,上面不能做到在複本集中讀寫壓力分散,其實在代碼層面,我們可以設定再訪問複本集的時候只從副節點上讀取資料。複本集讀寫分離結構如所示:

為了在複本集上實現讀寫分離,我們需要實現以下兩步:

(1)在副本節點上設定setSlaveOk;

(2)代碼層面,在讀操作過程中設定從副本節點讀取資料,如下所示:

public class TestMongoDBReplSet {       public static void main(String[] args)  {          try {               List<ServerAddress> addresses = new ArrayList<ServerAddress>();                ServerAddress address1 = new ServerAddress("127.0.0.1",1001);               ServerAddress address2 = new ServerAddress("127.0.0.1",1002);               ServerAddress address3 = new ServerAddress("127.0.0.1",1003);               addresses.add(address1);                addresses.add(address2);               addresses.add(address3);               MongoClient client = new MongoClient(addresses);               DB db = client.getDB( "test");               DBCollection coll = db.getCollection( "test");                            BasicDBObject object = new BasicDBObject();                object.append("userid","001");               ReadPreference preference = ReadPreference.secondary();                DBObject dbObject = coll.findOne(object, null , preference);                System. out .println(dbObject);            } catch (Exception e) {               e.printStackTrace();            }       }   }

讀參數除了secondary以外,還有其他幾個參數可以使用,他們的含義分別如下所示:

primary:預設參數,只從主節點上進行讀取操作; 
primaryPreferred:大部分從主節點上讀取資料,只有主節點不可用時從secondary節點讀取資料。 
secondary:只從secondary節點上進行讀取操作,存在的問題是secondary節點的資料會比primary節點資料“舊”。 
secondaryPreferred:優先從secondary節點進行讀取操作,secondary節點不可用時從主節點讀取資料; 
nearest:不管是主節點、secondary節點,從網路延遲最低的節點上讀取資料。

window配置mongodb叢集(複本集)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.