MongoDB的資料複製分區

來源:互聯網
上載者:User

MongoDB的資料複製分區

一:MongoDB的簡介:

    MongoDB是一個高效能,開源,無模式的文檔型資料庫,是當前NoSql資料庫中比較熱門的一種。它在許多情境下可用於替代傳統的關係型資料庫或鍵/值儲存方式。而且可以很容易的和JSON類的資料結合,他不支援事務,但支援自動分區功能,這對大資料的分布式儲存有著十分重要的作用。

二:MongoDB的索引類型:

    單欄位索引:

    複合式索引(多欄位索引):對多個key做索引

    多鍵索引:對key和value中的key做索引

    空間索引:基於位置做索引

    文本索引:全文檢索搜尋

    hash索引:僅支援精確值尋找

    稀疏索引(sparse):不為每一個值做索引,一般得是順序排放才可以做稀疏索引

三:MongoDB的複製功能:

    MongoDB有兩種複製類型:Master/Slave主從和replica set複本集複製,但是由於MongoDB的特性,主從複製架構已經基本放棄,比較常見的就是複本集複製方式

    replica set的工作特性:

    1,複製集可以實現自動轉移 heartbeat逾時,自動失效轉移(通過選舉方式實現)

    2,至少有3個節點,且奇數個節點,可以使用arbiter來參與選舉

    複製集中的特殊類型的節點分類:

    0優先順序的節點:冷備節點,不會被選舉成為主節點,但可以參與選舉

    被隱藏的從節點:首先是一個0優先順序的從節點,擁有選舉權,不會被用戶端直接存取到

    延遲複製的從節點:是一個0優先順序的從節點,不能被選為主節點,且複製時間落後與主節點一個固定的時間長度。

    arbiter:仲裁者,沒有資料,不可能成為主節點。 

CentOS編譯安裝MongoDB  

CentOS 編譯安裝 MongoDB與mongoDB的php擴充  

CentOS 6 使用 yum 安裝MongoDB及伺服器端配置  

Ubuntu 13.04下安裝MongoDB2.4.3  

MongoDB入門必讀(概念與實戰並重)

Ubunu 14.04下MongoDB的安裝指南

《MongoDB 權威指南》(MongoDB: The Definitive Guide)英文文字版[PDF]

Nagios監控MongoDB分區叢集服務實戰  

實驗內容:

一,實現MongoDB資料的複製

實驗模型:

實驗環境:

node1:172.16.18.1 MongoDB  centos6.5

node2:172.16.18.2 MongoDB  centos6.5

node3:172.16.18.3 MongoDB  centos6.5

實驗內容:

首先要確定各節點的時間一致

1.1 MongoDB安裝:分別在node1,node2,node3節點安裝一下三個包

mogodb安裝需要:一下三個包

    mongodb-org-shell-2.6.4-1.x86_64.rpm

    mongodb-org-tools-2.6.4-1.x86_64.rpm

    mongodb-org-server-2.6.4-1.x86_64.rpm

編輯服務器的設定檔,/etc/mongod.conf

logpath=/var/log/mongodb/mongod.log            #日誌的路徑
logappend=true                                                #開啟日誌
fork=true                                                           
#port=27017                                                    #預設監聽的連接埠
#dbpath=/var/lib/mongo                                  #預設的資料路徑
dbpath=/mongodb/data                                    #自訂的資料路徑
pidfilepath=/var/run/mongodb/mongod.pid
#bind_ip=127.0.0.1                                          #定義綁定IP,也就是監聽那些IP可來連結的伺服器,登出是允許所有。
httpinterface=true                                              #開放web頁面,
rest=true
replSet=testset
replIndexPrefetch=_id_only

配置好後將配置分別發送到其他兩個節點,並建立資料目錄,修改許可權

mkdir /mongodb/data/ -pv  
chown -R mongod.mongod /mongodb/

全部啟動:可能啟動會比較慢,那是因為要初始化資料

1.2連結到資料庫

[root@node2 ~]# mongo   
MongoDB shell version: 2.6.4   
connecting to: test   
> rs.status()   
{   
"startupStatus" : 3,   
"info" : "run rs.initiate(...) if not yet done for the set",   
"ok" : 0,   
"errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)" 
}

 

使用rs.status()查看狀態,有3個節點,但是都沒有初始化配置。需要運行rs.initiate()

 

1.3運行rs.initiate()

> rs.initiate()
{
"info2" : "no configuration explicitly specified -- making one",
"me" : "node2.bkjia.com:27017",
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
testset:OTHER> rs.status()
{
"set" : "testset",
"date" : ISODate("2014-10-12T07:51:58Z"),
"myState" : 1,
"members" : [
  {
  "_id" : 0,
  "name" : "node2.bkjia.com:27017",
  "health" : 1,
  "state" : 1,
  "stateStr" : "PRIMARY",
  "uptime" : 920,
  "optime" : Timestamp(1413100302, 1),
  "optimeDate" : ISODate("2014-10-12T07:51:42Z"),
  "electionTime" : Timestamp(1413100302, 2),
  "electionDate" : ISODate("2014-10-12T07:51:42Z"),
  "self" : true
  }
],
"ok" : 1
}
testset:PRIMARY>

 

可以看到添加了一個節點node2,也就是自己,且是primary節點。以及所有的狀態

 

1.4添加其他兩個節點

testset:PRIMARY> rs.add("node1.bkjia.com")
{ "ok" : 1 }
testset:PRIMARY> rs.add("node3.bkjia.com")
{ "ok" : 1 }
用rs.status()查看
testset:PRIMARY> rs.status()
{
"set" : "testset",
"date" : ISODate("2014-10-12T08:03:48Z"),
"myState" : 1,
"members" : [
  {
  "_id" : 0,
  "name" : "node2.bkjia.com:27017",
  "health" : 1,
  "state" : 1,
  "stateStr" : "PRIMARY",
  "uptime" : 1630,
  "optime" : Timestamp(1413101019, 1),
  "optimeDate" : ISODate("2014-10-12T08:03:39Z"),
  "electionTime" : Timestamp(1413100302, 2),
  "electionDate" : ISODate("2014-10-12T07:51:42Z"),
  "self" : true
  },
  {
  "_id" : 1,
  "name" : "node1.bkjia.com:27017",
  "health" : 1,
  "state" : 5,
  "stateStr" : "STARTUP2",
  "uptime" : 17,
  "optime" : Timestamp(0, 0),
  "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
  "lastHeartbeat" : ISODate("2014-10-12T08:03:46Z"),
  "lastHeartbeatRecv" : ISODate("2014-10-12T08:03:47Z"),
  "pingMs" : 224
  },
  {
  "_id" : 2,
  "name" : "node3.bkjia.com:27017",
  "health" : 1,
  "state" : 6,
  "stateStr" : "UNKNOWN",
  "uptime" : 8,
  "optime" : Timestamp(0, 0),
  "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
  "lastHeartbeat" : ISODate("2014-10-12T08:03:47Z"),
  "lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
  "pingMs" : 905,
  "lastHeartbeatMessage" : "still initializing"
  }
],
"ok" : 1
}

有沒有發現新加的這兩個節點狀態不對?沒有關係,可能是還沒有同步過來,稍等在重新整理試試

"name" : "node1.bkjia.com:27017",

"stateStr" : "SECONDARY",

"name" : "node3.bkjia.com:27017",

"stateStr" : "SECONDARY",

再重新整理時添加的兩個節點都成為了secondary。

1.5我們在主節點來建立一些資料

testset:PRIMARY> use test
switched to db test
testset:PRIMARY> for (i=1;i<=1000;i++) db.students.insert({name:"student"+i,age:(i%100)})
WriteResult({ "nInserted" : 1 })
串連到從節點來看一下
[root@node1 ~]# mongo   
MongoDB shell version: 2.6.4   
connecting to: test   
Welcome to the MongoDB shell.   
For interactive help, type "help".   
For more comprehensive documentation, see   
http://docs.mongodb.org/   
Questions? Try the support group   
http://groups.google.com/group/mongodb-user   
testset:SECONDARY> use test   
switched to db test   
testset:SECONDARY> show collections   
2014-10-11T14:52:57.103+0800 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:131   
#提示需要不是主節點,沒有slaveOK不讓查看,那麼便在當前節點指定slaveOK,便可以了
testset:SECONDARY> rs.slaveOk()
testset:SECONDARY> show collections
students
system.indexes
可以使用rs.isMaster()查詢主節點是誰
testset:SECONDARY> rs.isMaster()
{
"setName" : "testset",
"setVersion" : 3,
"ismaster" : false,
"secondary" : true,
"hosts" : [
  "node1.bkjia.com:27017",
  "node3.bkjia.com:27017",
  "node2.bkjia.com:27017"
],
"primary" : "node2.bkjia.com:27017",        #主節點是誰
"me" : "node1.bkjia.com:27017",              #自己是誰
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2014-10-11T07:00:03.533Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}

1.6如果主節點離線,從節點會自動選出主節點

testset:PRIMARY> rs.stepDown()
2014-10-12T17:00:12.869+0800 DBClientCursor::init call() failed
2014-10-12T17:00:12.896+0800 Error: error doing query: failed at src/mongo/shell/query.js:81
2014-10-12T17:00:12.914+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2014-10-12T17:00:12.945+0800 reconnect 127.0.0.1:27017 (127.0.0.1) ok
testset:SECONDARY>

可以看到主節點的primary變成了secondary

其他兩個節點中的一個變為主節點,這就是自動轉移

複本集的重新選舉的條件有:心態資訊,優先順序,optime,網路連接等

1.7還可以修改優先順序來實現主從切換

testset:PRIMARY> rs.conf()            #查看配置
{
"_id" : "testset",
"version" : 3,
"members" : [
  {
  "_id" : 0,
  "host" : "node2.bkjia.com:27017"
  },
  {
  "_id" : 1,
  "host" : "node1.bkjia.com:27017"
  },
  {
  "_id" : 2,
  "host" : "node3.bkjia.com:27017"
  }
]
}
testset:PRIMARY> cfg=rs.conf()            #將配置資訊儲存在變數中
{
"_id" : "testset",
"version" : 3,
"members" : [
  {
  "_id" : 0,
  "host" : "node2.bkjia.com:27017"
  },
  {
  "_id" : 1,
  "host" : "node1.bkjia.com:27017"
  },
  {
  "_id" : 2,
  "host" : "node3.bkjia.com:27017"
  }
]
}
testset:PRIMARY> cfg.members[1].priority=2            #修改id=1的主機優先順序為2
2
testset:PRIMARY> rs.reconfig(cfg)                              #應用cfg檔案
2014-10-12T05:15:59.916-0400 DBClientCursor::init call() failed
2014-10-12T05:15:59.988-0400 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2014-10-12T05:16:00.015-0400 reconnect 127.0.0.1:27017 (127.0.0.1) ok
reconnected to server after rs command (which is normal)
testset:SECONDARY>                                                    #主動變為從節點
而id=1的是node1.bkjia.com主機,自己變為primary主機
testset:SECONDARY>
testset:PRIMARY>

1.8,如何要設定仲裁節點

rs.addArb(hostportstr)表示將一個節點加進來時就是仲裁節點。

我們移除當前的node3節點

testset:PRIMARY> rs.remove("node3.bkjia.com")

刪除/mongodb/data下的資料,重新初始化,

testset:PRIMARY> rs.addArb("node3.bkjia.com")

更多詳情見請繼續閱讀下一頁的精彩內容:

  • 1
  • 2
  • 下一頁

相關文章

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.