mongodb的分片主要是指將集合拆分成小塊並分別存在不同伺服器上的過程。mongodb支援自動分片,可擺脫手動分片管理上的困難。
在以下情況下需要運用分片:
1.伺服器的磁碟不夠用。
2.單個mongod不能滿足寫資料的效能需求。
3.需要將大資料放入記憶體中提高效能。
下圖為我們要實現的分片結構:
從圖中我們看到原本一台mongod節點被分成了a和b兩個分片,由路由d讀取配置伺服器c的分片策略,然後決定資料儲存在哪個分片上,而路由隱藏了決策的細節,使用者直接訪問路由就可以享受分片帶來的優點,而不必關心路由讀取分片的細節。
配置步驟:
1.建立配置伺服器c
建立配置檔案如下,埠為10000,並啟動mongod -f config.cnf
dbpath=d:\mongodb\test\sharded\c\data2.建立路由伺服器dbind_ip=127.0.0.1port=10000
路由器的配置檔案如下:
bind_ip=127.0.0.1port=20000configdb=127.0.0.1:10000其中configdb=127.0.0.1:10000配置的是路由監聽的配置伺服器的位址
路由器用mongos啟動
mongos -f config.cnf注意:配置伺服器要先啟動,因為路由伺服器需要監聽配置伺服器。
3.新建分片伺服器a和b
a的配置,然後啟動a
dbpath=d:\mongodb\test\sharded\a\data
bind_ip=127.0.0.1
port=8001
b的配置,然後啟動b
dbpath=d:\mongodb\test\sharded\b\data
bind_ip=127.0.0.1
port=8002
4.建立集群中分片伺服器與路由器的連線
這個操作需要在路由器中配置,開啟路由器的shell,執行資料庫命令
可以看到執行新增分片的操作要在admin庫中進行
5.為業務資料庫新增分片功能
為person新增分片功能,在路由中執行db.runcommand()
6.為集合進行分片
片鍵:集合中的乙個鍵作為分拆的依據。
為person庫的集合info進行分片,key欄位設定了片鍵
執行下列命令db.runcommand(})
7.新增一定的大資料量,測試分片的功能
用指令碼插入80萬條資料
for(i=1;i<=800001;i++))
}在分別在分片伺服器a和b上查詢資料量,如圖:看到這800001條資料已經分別存放在2個分片中了
正式環境配置
成功地構建分片需要如下條件:
1.多個配置伺服器
2.多個mongos伺服器
3.每個片都是副本集
1.多個配置伺服器
建立配置伺服器如上,現在啟動mongos的時候應將其連線到這3個配置伺服器。假如3個配置檔案的埠號是20001~20003
mongos --configdb localhost:20001,localhost:20002,localhost:20003
配置伺服器使用的是兩步提交機制,不是普通的mongodb的非同步複製,來維護集群配置的不同副本。這樣能保證集群狀態的一致性。這意味著某台配置伺服器down了後,集群配置資訊將是唯讀的。但是客戶端還是能夠讀寫的,只有所有配置伺服器備份了以後才能重新均衡資料。
2.多個mongos
mongos的數量不受限制,建議針對乙個應用伺服器只執行乙個mongos程序。這樣每個應用伺服器就可以與mongos進行本地會話。
3.每個片都是副本集
生產環境中,每個片都應是副本集。這樣單個伺服器壞了,就不會導致整個片失效。用addshard命令就可以講副本集作為片新增,新增時只要指定副本集的名字和種子就好了。
實現即達到資料的分片儲存也實現備份和故障自動修復功能,可以副本集和分片混合使用,構建如下圖的架構,(為了舉例簡單僅給sharda做了副本集配置)
1.修改a的配置如下:
dbpath=d:\mongodb\test\sharded\a\data
bind_ip=127.0.0.1
port=8001
replset=replicademo/127.0.0.1:8003
新新增a1和a2兩台節點與a組成副本集
a1的配置:
dbpath=d:\mongodb\test\sharded\a1\dataa2的配置:bind_ip=127.0.0.1port=8004replset=replicademo/127.0.0.1:8003
dbpath=d:\mongodb\test\sharded\a2\data在a的shell中執行副本集的舒適化bind_ip=127.0.0.1port=8003replset=replicademo/127.0.0.1:8001
db.runcommand(,,]這樣a,a1,a2的副本集就建立完成,查詢配置看到a為活躍節點,如下圖:}})
回到路由器上設定分片配置
mongos> db.runcommand()
這樣mongos
會知道它所連線的是replicademo副本集,在活躍節點down掉之後就會去尋找新的活躍結點。
執行db.printshardingstatus(),會看到副本集的節點都已經自動的配置進來了,如下圖:
管理分片
分片的資訊主要存放在config資料庫上,這樣就能被任何連線到mongos的程序訪問到了。
配置集合
下面的**都假設已經在shell中連線了mongos,並且已經執行了use config。
1.片可以在shards集合中查到所有的片 >db.shards.find();
2.資料庫
databases集合含有已經在片上的資料庫列表和一些相關資訊。
>db.databases.find() 鍵的解釋如下
"_id" : 表示資料名
"partitioned" : 是否啟用分片功能
"primary" :這個值與"_id"對應,表示這個資料的大本營在**。也就是開始建立資料庫檔案的位置
3.塊塊資訊儲存在chunks集合中,你可以看到資料到底是怎麼切分到集群的。
>db.chunks.find()
分片命令
1.獲得概要
>db.printshardingstatus() 給出前面說的那些集合的概要
2.刪除片
用removeshard就能從集群中刪除片,removeshard會把給定片上的所有塊都挪到其他片上。
>db.runcommand()
配置伺服器集群時間同步
集群中所有主機必須保持時間同步,如果時間相差較大會引起各種問題,例如主機執行狀態不良等。具體思路如下 master節點作為ntp伺服器與外界對時中心同步時間,隨後對所有datanode節點提供時間同步服務。所有datanode節點以master節點為基礎同步時間。所有節點安裝相關元件 yum ins...
集群伺服器
集群,英文名稱為cluster,通俗地說,集群是這樣一種技術 它將多個系統連線到一起,使多台伺服器能夠像一台機器那樣工作或者看起來好像一台機器。採用集群系統通常是為了提高系統的穩定性和網路中心的資料處理能力及服務能力。舉個例子來說,我們架設了一台www伺服器,上面構建了乙個電子商務 然而隨著時間的推...
dns伺服器配置 專案三 DNS伺服器配置
一 專案任務描述 有一所院校,組建了校園內部的區域網並架社內部的web伺服器和ftp伺服器,現需要安裝並配置一台dns伺服器為校園網內部的使用者提供dns服務,使使用者能夠使用網域名稱訪問內部的web 和ftp伺服器以及網際網路上的各個 二 專案任務劃分 子任務1 dns的安裝 子任務2 dns正向...