1. 程式人生 > >老生常談 MongoDB---分片簡析

老生常談 MongoDB---分片簡析

6.片鍵對操作的影響 終端使用者應該無法區分是否分片,但是要了解選擇不同片鍵情況下的查詢有何不同. 假設還是那個表示人員的集合,按照"name"分片,有3個片,其名字首字母的範圍是A-Z.下面以不同的方式查詢: db.people.find({"name":"Refactor"}) mongos會將這個查詢直接傳送給Q-Z片,獲得響應後,直接轉發給客戶端 db.people.find({"name":{"$lt":"L"}}) mongos會將其先發送給A-F和G-P片,然後將結果轉發給客戶端. db.people.find().sort({"email":1}) mongos會在所有片上查詢,返回結果時還會做歸併排序,確保結果順序正確. mongos用遊標從各個伺服器上獲取資料,所以不必等到全部資料都拿到才向客戶端傳送批量結果.
db.people.find({"email":"[email protected]"}) mongos並不追蹤"email"鍵,所以也不知道應該將查詢發給那個片.所以他就向所有片順序傳送查詢. 如果是插入文件,mongos會依據"name"鍵的值,將其傳送到相應的片上. 7.建立分片 建立分片有兩步:啟動實際的伺服器,然後決定怎麼切分資料. 分片一般會有3個組成部分: a.片 片就是儲存子集合資料的容器,片可是單個的mongod伺服器(開發和測試用),也可以是副本集(生產用).所以一片 有多臺伺服器,也只能有一個主伺服器,其他的伺服器儲存相同的資料. b.mongos
mongos就是MongoDB配的路由器程序.它路由所有的請求,然後將結果聚合.它本身並不儲存資料或者配置資訊 但會快取配置伺服器的資訊. c.配置伺服器 配置伺服器儲存了叢集的配置資訊:資料和片的對應關係.mongos不永久存房資料,所以需要個地方存放分片的配置. 它會從配置伺服器獲取同步資料. 8.啟動伺服器 首先要啟動配置伺服器和mongos.配置伺服器需要先啟動.因為mongos會用到其上的配置資訊. 配置伺服器的啟動就像普通的mongod一樣 mongod --dbpath "F:\mongo\dbs\config" --port 20000  --logpath "F:\mongo\logs\config\MongoDB.txt" --rest
配置伺服器不需要很多的空間和資源(200M實際資料大約佔用1kB的配置空間) 建立mongos程序,一共應用程式連線.這種路由伺服器連線資料目錄都不需要,但一定要指明配置伺服器的位置: mongos --port 30000 --configdb 127.0.0.1:20000  --logpath "F:\mongo\logs\mongos\MongoDB.txt" 分片管理通常是通過mongos完成的 新增片 片就是普通的mongod例項(或副本集) mongod --dbpath "F:\mongo\dbs\shard" --port 10000  --logpath "F:\mongo\logs\shard\MongoDB.txt" --rest mongod --dbpath "F:\mongo\dbs\shard1"  --port 10001 --logpath "F:\mongo\logs\shard1\MongoDB.txt" --rest 連線剛才啟動的mongos,為叢集新增一個片.啟動shell,連線mongos: 確定連線的是mongos而不是mongod,通過addshard命令新增片: >mongo 127.0.0.1:30000 mongos> db.runCommand( ... { ... "addshard":"127.0.0.1:10000", ... "allowLocal":true ... } ... )
  Sat Jul 21 10:46:38 uncaught exception: error { "$err" : "can't find a shard to put new db on", "code" : 10185 } mongos>use admin switched to db admin mongos> db.runCommand( ... { ... "addshard":"127.0.0.1:10000", ... "allowLocal":1 ... } ... ) { "shardAdded" : "shard0000", "ok" : 1 } mongos> db.runCommand(  ... { ... "addshard":"127.0.0.1:10001", ... "allowLocal":1 ... } ... ) { "shardAdded" : "shard0001", "ok" : 1 } 當在本機執行片的時候,得設定allowLocal鍵為1.MongoDB儘量避免由於錯誤的配置,將叢集配置到本地,所以得讓它知道這僅僅是開發,而且我們很清楚自己在做什麼.如果是生產環境中,則要將其部署在不同的機器上. 想新增片的時候,就執行addshard.MongoDB會負責將片整合到叢集. 切分資料 MongoDB不會將儲存的每一條資料都直接釋出,得先在資料庫和集合的級別將分片功能開啟. 如果是連線配置伺服器, E:\mongo\bin>mongo 127.0.0.1:20000 MongoDB shell version: 2.0.6 connecting to: 127.0.0.1:20000/test > use admin switched to db admin > db.runCommand({"enablesharding":"test"}) { "errmsg" : "no such cmd: enablesharding", "bad cmd" : { "enablesharding" : "test" }, "ok" : 0 } 應該是連線 路由伺服器: db.runCommand({"enablesharding":"test"})//將test資料庫啟用分片功能. 對資料庫分片後,其內部的集合便會儲存到不同的片上,同時也是對這些集合分片的前置條件. 在資料庫級別啟用了分片以後,就可以使用shardcollection命令堆積和進行分片: db.runCommand({"shardcollection":"test.refactor","key":{"name":1}})//對test資料庫的refactor集合進行分片,片鍵是name 如果現在對refactor集合新增資料,就會依據"name"的值自動分散到各個片上. 9.生產配置 進入生產環境後,需要更健壯的分片方案,成功的構建分片需要如下條件: 多個配置伺服器 多個mongos伺服器 每個片都是副本集 正確的設定w 健壯的配置 設定多個配置伺服器是很簡單的. 設定多個配置伺服器和設定一個配置伺服器一樣 mongod --dbpath "F:\mongo\dbs\config" --port 20000  --logpath "F:\mongo\logs\config\MongoDB.txt" --rest mongod --dbpath "F:\mongo\dbs\config1" --port 20001  --logpath "F:\mongo\logs\config1\MongoDB.txt" --rest mongod --dbpath "F:\mongo\dbs\config2" --port 20002  --logpath "F:\mongo\logs\config2\MongoDB.txt" --rest 啟動mongos的時候應將其連線到3個配置伺服器上: mongos --port 30000 --configdb 127.0.0.1:20000,127.0.0.1:20001,127.0.0.1:20002  --logpath "F:\mongo\logs\mongos\MongoDB.txt"   配置伺服器使用的是兩步提交機制,而不是普通的MongoDB的非同步複製,來維護叢集配置的不同副本.這樣能保證叢集的狀態的一致性.這意味著,某臺配置伺服器宕機後,叢集的配置資訊是隻讀的.客戶端還是能夠讀寫,但是隻有所有配置伺服器備份了以後才能重新均衡資料. 多個mongos   mongos的數量不受限制,建議針對一個應用伺服器只執行一個mongos程序.這樣每個應用伺服器就可以與mongos進行本地回話,如果伺服器不工作了,就不會有應用試圖與不存的mongos通話了 健壯的片 生產環境中,每個片都應是副本集,這樣單個伺服器壞了,就不會導致整個片失效.用addshard命令就可以將副本集作為片新增, 新增時,只要指定副本集的名稱和種子就行了. 如要新增副本集refactor,其中包含一個伺服器127.0.0.1:10000(還有別的伺服器),就可以用下列命令將其新增到叢集中:  www.2cto.com   db.runCommand({"addshard":"refactor/127.0.0.1:10000"}) 如果127.0.0.1:10000伺服器掛了,mongos會知道它所連線的是一個副本集,並會使用新的主節點. 10.管理分片 分片資訊主要存放在config資料庫上,這樣就能被任何連線到mongos的程序訪問到了. 配置集合 在shell中連線了mongos,並使用了use config資料庫 a.片 可以在shareds集合中查到所有的片 db.shards.find() b.資料庫 databases集合含有已經包含在片上的資料庫列表和一些相關資訊 db.databases.find() 返回的文件解釋: "_id"  表示資料庫名 "partitioned" 表示是否啟用了分片功能 "primary"這個值與"_id"相對應,表名這個資料的"大本營"在哪裡.   不論分片與否,資料庫總會有個大本營.要是分片的話,建立資料庫時會隨機選擇一個片.也就是說,大本營是開始建立資料庫文件的位置.雖然分片時資料庫也會用到很多別的伺服器,但會從這個片開始. c.塊  塊資訊儲存在chunks集合中.這可以看到資料到底是怎麼切分到叢集中的 db.chunks.find() 分片命令 獲得概要 db.printShardingStatus() 刪除片 用removeshard就能從叢集中刪除片.removeshard會把給定片上的所有塊的資料都挪到其他片上 db.runCommand({"removeshard":"127.0.0.1:10001"}) 在挪動過程中,removeshard會顯示程序

相關推薦

老生常談 MongoDB---分片

6.片鍵對操作的影響 終端使用者應該無法區分是否分片,但是要了解選擇不同片鍵情況下的查詢有何不同. 假設還是那個表示人員的集合,按照"name"分片,有3個片,其名字首字母的範圍是A-Z.下面以不同的方式查詢: db.people.find({"name":"Refactor"}) mongos會將這

MongoDB CRUD操作

使用者使用MongoDB開發應用程式使用的是邏輯結構:    ● MongoDB的文件,相當於關係資料庫中的一行記錄  ● 多個文件組成一個集合,相當於關係資料庫中的表  ● 多個集合邏輯上組織在一起就是資料庫   www.2cto.com   1、啟動MongoDB

PHP開發環境

安裝 桌面 nbsp pmp 總結 ubunt bsp 虛擬機 xshell 單工作機情況 windows + wamp windows + XShell類終端工具 + linux虛擬機 Ubuntu桌面版 自帶終端 Mac OS + mamp Mac OS 自帶終端 M

URL鏈接中的utm_source,utm_medium

mono running -i 支持 用戶 ica ase 分析 ng- 工作中須要分析一些鏈接,統計分析一些信息。比方例如以下的鏈接: http://lightapplication.xxxx.com/?utm_source=ucweb&utm_medium=

【轉】使用YCSB測試mongodb分片集群性能

中產 adc set 日誌 階段 很快 配置服務 常見 chm 1. 測試工具 本次測試選取YCSB(Yahoo! Cloud System Benchmark)作為測試客戶端工具。YCSB是Yahoo開源的一個nosql測試工具,用來測試比較各種nosql的性能

結合實戰Controller 配置

sa1. xwork.xml 主文件 xwork.xml 是 WebWork 自身的配置文件,實際開發中它是配置文件的主幹骨架。 xwork 定義了一個 default 包,通過 include 包含 xwork 子文件。如下所示:<!DOCTYPE xwork PUBLIC "-//OpenS

備份的幾種方式

備份 lan-free server-free 異地備份 備份方案1、本地備份方式(1)普通網絡備份方式 1、備份節點發起備份通過重復刪除技術將數據備份到備份存儲上。 2、備份策略完整備份/周,增量備份/

【HTTP】另類的POST頭數據 RFC1867協議格式

client oct discuz ... Enctype -s 協議 肩膀 .html http://blog.csdn.net/ai2000ai/article/details/52161979 昨天在實戰表單模擬提交的時候,有發現在提交某個表單的時候,頁面(discu

.NET設計模式

責任鏈 參數 聚合 備忘 工廠方法 繼承復用 解釋器模式 基礎上 衍生 首先,是設計模式的分類,我們知道,常用的設計模式共23種。但總體來說,設計模式氛圍三大類: 創建型模式,共五種:工廠方法模式、抽象工廠模式、單列模式、建造者模式、原型模式。 結構型模式,共七種:適配器模

協議欺騙攻擊技術常見種類及防範

轉換 改變 實現 定向 要求 內網 容易 通過 加密 IP欺騙攻擊 IP欺騙技術就是通過偽造某臺主機的IP地址騙取特權從而進行攻擊的技術。許多應用程序認為如果數據包能夠使其自身沿著路由到達目的地,而且應答包也可以回到源地,那麽源IP地址一定是有效的,而這正是使源IP地址欺騙

三層架構—

表示 現在 show lpar object 數據庫連接 打開 str 好的 三層學習完了,第一次驗收的時候,自己理解的也不是非常到位,後來又又一次敲了一遍登陸樣例,查閱了一些資料 進行第二次驗收才感覺清晰了很多。之前畫時序圖時我就想過時序圖基本上也是非常

DataFrame.groupby()

產生 提示 索引 alt code log cnblogs 返回 sun groupby分組函數:   返回值:返回重構格式的DataFrame,特別註意,groupby裏面的字段內的數據重構後都會變成索引   groupby(),一般和sun()一起使用,如下例: fr

第五節:JQuery框架源碼(1)

err cal content browser active lac rda setting right (轉自老惠的博客) JQuery是一個應用廣泛、非常優秀的JavaScript框架,其代碼簡潔而優雅,有很多值得我們學習的地方。這裏僅僅對其代碼結構做一個簡單的分析

Maven核心

作用範圍 聚合 cin sof oca int 了解 系列 格式 本文以類圖的方式,介紹maven核心的12個概念以及相互之間的關系。 Table of Contents 1 maven管理的目標:工程(Project) 1.1 工程依賴關系 1.2 工程聚合關系

TCP的三次握手與四次分手

丟包 現在 流量 tcp連接 首部 都是 字節序 鏈接 暫時 具體的關於TCP是什麽,我不打算詳細的說了;當你看到這篇文章時,我想你也知道TCP的概念了,想要更深入的了解TCP的工作,我們就繼續。它只是一個超級麻煩的協議,而它又是互聯網的基礎,也是每個程序員必備的基本功。首

Nagios監控mongodb分片集群服務實戰

check 演示 database 路由 easy interval oca mis har 1,監控插件下載Mongodb插件下載地址為:git clone git://github.com/mzupan/nagios-plugin-mongodb.git,剛開始本人

mongodb分片集搭建

不能 -c tex 這就是 mkdir -p 團隊 exe dds png 拓撲圖如下: 從圖中可以看到有四個組件:mongos、config server、shard、replica set。mongos,數據庫集群請求的入口,所有的請求都通過mongos進行協調,不需

Mongodb 分片

開放 collect 一起 src 強制 工具 字符 com 生產 原文地址:伍儀洲的博客 介紹 分片是指將數據拆分,並分散放在多個服務器中組成一個集群,這可以將N臺服務器的性能集中到一起來處理數據,這將很大程度的提高數據處理的速度。 在Mongodb的分片中必須具備三個角

ehcache3-源碼

func lap timeunit aps min ifreq ron 隨機數 unit ehcache3的evict策略是怎樣的呢?從put操作可以一窺,這裏以單層heap cache為例。 ehcache3的evict策略不可設置,只能通過eviction-adviso

Mybatis的

java中的mybatisMybatis【概念】Mybatis是支持自定義的SQL查詢、存儲過程和高級映射的優秀持久層框架,Mybatis幾乎消除了所有的JDBC代碼和參數的手工設置以及結果集的檢索。Mybatis使用簡單的xml或註解用於配置和原始映射,將接口和普通的POJO(普通java對象)映射成數據庫