1. 程式人生 > >MongoDB學習(四)安全和認證、主從叢集、副本集和分片操作

MongoDB學習(四)安全和認證、主從叢集、副本集和分片操作

安全和認證

每個MongoDB例項中的資料庫都可以有許多使用者。如果開啟了安全性檢查,則只有資料庫認證使用者才能執行讀或者寫操作。在認證的上下文中,MongoDB會將普通的資料作為admin資料庫處理。admin資料庫中的使用者被視為超級使用者(即管理員)。在認證之後,管理員可以讀寫所有資料庫,執行特定的管理命令,如listDatabases和shutdown。
在開啟安全檢查之前,一定要至少有一個管理員賬號。

在admin資料庫中建立管理員賬號:
use admin;
db.addUser(“root”,”root”);

在test資料庫中建立普通賬號:
use test;
db.addUser(“zhangsan”,”123”);
db.addUser(“lisi”,”123”,true);
注意:使用者zhangsan,密碼為123,對test資料庫擁有讀寫許可權
使用者lisi,密碼為123,對test資料庫擁有隻讀許可權

重新啟動資料庫服務,並開啟安全檢查:


mongod --dbpath d:\mongo_data --auth

主從複製(主從叢集 )

主從複製是MongoDB最常用的複製方式。這種方式非常靈活,可用於備份、故障恢復、讀擴充套件等。
最基本的設定方式就是建立一個主節點和一個或者多個從節點,每個從節點要知道主節點的地址。執行mongod --master就啟動了主伺服器。執行mongod --slave --source master_address 則啟動了從伺服器,其中master_address就是上面主節點的地址。


MongoDB的複製至少需要兩個伺服器或者節點。其中一個是主節點,負責處理客戶端請求,其它的都是從節點,負責對映主節點的資料。主節點記錄在其上執行的所有操作。從節點定期輪詢主節點獲得這些操作,然後對自己的資料副本執行這些操作。由於和主節點執行了相同的操作,從節點就能保持與主節點的資料同步。主節點的操作記錄成為oplog(operation log)。oplog儲存在一個特殊的資料庫中,叫做local。oplog就在其中的oplog.$main集合裡面。oplog中的每個文件都代表主節點上執行的一個操作。需要重點強調的是oplog只記錄改變資料庫狀態的操作。比如,查詢就不再儲存在oplog中。這是因為oplog只是作為從節點與主節點保持資料同步的機制。

為了方便演示,可以在一臺計算機上來模擬主節點和從節點。在D盤建立兩個目錄master和slave,master目錄作為主節點的資料檔案的目錄,slave目錄作為從節點的資料檔案的目錄。
注意:主節點和從節點要指定不同的埠。
啟動主節點:mongod --dbpath d:\master --port 10000 --master
啟動從節點:mongod --dbpath d:\slave --port 10001 --slave --source localhost:10000

啟動成功後就可以連線主節點進行操作了,而這些操作會同步到從節點。

注意:主節點可以進行增刪改查所有操作,而從節點只能進行查詢的操作

副本集

副本集就是有自動故障恢復功能的主從叢集。

主從叢集和副本集最大的區別就是副本集沒有固定的“主節點”;整個叢集會選出一個“主節點”,當其掛掉後,又在剩下的從節點中選中其他節點為“主節點”,副本集總有一個活躍點(primary)和一個或多個備份節點(secondary)。


以三個節點為例:
節點1:
HOST:localhost:10001
Log File:D:\mongodb\logs\node1\logs.txt
Data File:D:\mongodb\dbs\node1

節點2:
HOST:localhost:10002
Log File:D:\mongodb\logs\node2\logs.txt
Data File:D:\mongodb\dbs\node2

節點3:
HOST:localhost:10003
Log File:D:\mongodb\logs\node3\logs.txt
Data File:D:\mongodb\dbs\node3

啟動節點1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath D:\mongodb\logs\node1\logs.txt --logappend --port 10001 --replSet itcast/localhost:10002  --master

啟動節點2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath D:\mongodb\logs\node2\logs.txt --logappend --port 10002 --replSet itcast/localhost:10001

啟動節點3:  
mongod --dbpath D:\mongodb\dbs\node3 --logpath D:\mongodb\logs\node3\logs.txt --logappend --port 10003 --replSet itcast/localhost:10001,localhost:10002


初始化節點(只能初始化一次):隨便登入一個節點,以10001為例

mongolocalhost:10001/admin

 db.runCommand({
 "replSetInitiate":{
  "_id":“itcast",
  "members":[
   {
     "_id":1,
    "host":"localhost:10001",
      "priority":3
   },
   {
     "_id":2,
    "host":"localhost:10002",
     "priority":2
   },
   {
     "_id":3,
    "host":"localhost:10003",
     "priority":1
   }
  ]}});

引數解釋:
--replSet  指定副本集  後面緊跟著副本集的名稱
--logappend 日誌檔案末尾新增
--port 指定埠號
db.runCommand({})  初始化副本集
初始化文件:
"_id":“itcast",  指副本集的名稱
 "members":[...]  副本集的伺服器列表  每個列表有個
               "_id": 每個伺服器的唯一id, 
              "host" 指定伺服器的主機,
              "priority"設定優先順序,預設優先順序為1,可以是1-1000的數字

查詢當前主庫,登入10002
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );

關閉10001服務Dos命令視窗,  登入10002查詢當前主庫
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );

預設情況下從庫是不能進行讀寫操作的設定從庫可讀(在從庫secondary上執行):rs.slaveOk ( );

分片

分片(sharding)是指將資料拆分,將其分散存在不同的機器上的過程。有時也用分割槽(partitioning)來表示這個概念。將資料分散到不同的機器上,不需要功能強大的大型計算機就可以儲存更多的資料,處理更多的負載。

MongoDB分片的基本思想就是將集合切分成小塊。這些塊分散到若干片裡面,每個片只負責總資料的一部分。應用程式不必知道哪片對應哪些資料,甚至不需要知道資料已經被拆分了,所以在分片之前要執行一個路由程序,該程序名為mongos。這個路由器知道所有資料的存放位置,所以應用可以連線它來正常傳送請求。對應用來說,它僅知道連線了一個普通的mongod。路由器知道資料和片的對應關係,能夠轉發請求道正確的片上。如果請求有了迴應,路由器將其收集起來回送給應用。

設定分片時,需要從集合裡面選一個鍵,用該鍵的值作為資料拆分的依據。這個鍵稱為片鍵(shard key)。

用個例子來說明這個過程:假設有個文件集合表示的是人員。如果選擇名字("name")作為片鍵,第一片可能會存放名字以A~F開頭的文件,第二片存的G~P的名字,第三片存的Q~Z的名字。隨著新增或者刪除片,MongoDB會重新平衡資料,使每片的流量都比較均衡,資料量也在合理範圍內。

mongos就是一個路由伺服器,它會根據管理員設定的“片鍵”將資料分攤到自己管理的mongod叢集,資料和片的對應關係以及相應的配置資訊儲存在“config伺服器”上。
mongod:一個普通的資料庫例項,如果不分片的話,我們會直接連上mongod。

分片步驟:

1、建立三個目錄,分別存放兩個mongod服務的資料檔案和config服務的資料檔案

2、開啟config伺服器 。mongos要把mongod之間的配置放到config伺服器裡面,所以首先開啟它,這裡就使用2222埠。 命令為:
mongod --dbpath E:\sharding\config_node --port 2222

3、開啟mongos伺服器 。這裡要注意的是我們開啟的是mongos,埠3333,同時指定下config伺服器。命令為:
mongos --port 3333 --configdb=127.0.0.1:2222

4、啟動mongod伺服器 。對分片來說,也就是要新增片了,這裡開啟兩個mongod服務,埠分別為:4444,5555。命令為:
mongod --dbpath E:\sharding\mongod_node1 --port 4444
mongod --dbpath E:\sharding\mongod_node2 --port 5555 


5、服務配置 。client直接跟mongos打交道,也就說明我們要連線mongos伺服器,然後將4444,5555的mongod交給mongos,新增分片也就是addshard()。

6、開啟資料庫分片功能,命令很簡單 enablesharding(),這裡就開啟test資料庫。 


7、指定集合中分片的片鍵,這裡就指定為person.name鍵。

8、通過mongos插入10w記錄,然後通過printShardingStatus命令檢視mongodb的資料分片情況。


這裡主要看三點資訊:

  • shards:     可以看到已經別分為兩個片了,shard0000和shard0001。
  • databases:: 這裡有個partitioned欄位表示是否分割槽,這裡可以看到test已經分割槽。
  • chunks:     集合被砍成四段。
                      


關於對MongoDB的高階操作總結就到這裡了,如果對你有幫助,記得點贊哦~歡迎大家關注我的部落格,可以進群366533258一起交流學習哦~

相關推薦

MongoDB學習安全認證主從叢集副本分片操作

安全和認證每個MongoDB例項中的資料庫都可以有許多使用者。如果開啟了安全性檢查,則只有資料庫認證使用者才能執行讀或者寫操作。在認證的上下文中,MongoDB會將普通的資料作為admin資料庫處理。admin資料庫中的使用者被視為超級使用者(即管理員)。在認證之後,管理員可

MongoDb學習--Repository

在學習這個的時候。關於Repository的對映。在備註xml的時候出現了錯誤。 錯誤有點坑。以後寫的時候注意一點,在學習的時候。用的mongo的jar包版本比較低。 然而本機操作的時候,用的是最新版。其xml的配置發生的變化。 關於配置的資訊。在配置的時候去官網查一下當前版本的使用方法。 這裡記錄一

MongoDb學習--Repository----語法關鍵字

表7.查詢方法支援的關鍵字 關鍵詞 樣品 邏輯結果 After findByBirthdateAfter(Date date) {"birthdate" : {"$gt" : d

MongoDB學習 Java操作MongoDB

一、連線資料庫連線資料庫,你需要指定資料庫名稱,如果指定的資料庫不存在,mongo會自動建立資料庫。 所需jar包: mongo-java-driver-3.2.2.jar 連線資料庫的Java程式碼如下:import com.mongodb.MongoClient; imp

MongoDB學習MongoDB 日常運維操作命令

1.MongoDB 命令幫助系統在安裝MongoDB後,啟動伺服器程序(mongod),可以通過在客戶端命令mongo實現對MongoDB的管理和監控。 1.1MongoDB的命令幫助系統> help    db.help()                    he

java學習static靜態變量 this

java學習 方便 private setname 局部變量 變量 告訴 應該 size java中的this /* this:是當前類的對象引用。簡單的記,它就代表當前類的一個對象。 註意:誰調用這個方法,在該方法內部的this就代表誰

HBase概念學習Java API之掃描過濾器

影響 產生 str 實例 分享 get 批量 java api track HBase主要的CRUD操作就不多介紹了,無非就是Put,Get。Delete三個類的運用。 本文相當於是閱讀HBase權威指南的總結。 一、掃描(Scan) 如今看一下掃

DTL語言學習{% spaceless %}{% autospace %}{% verbatim %}標籤

{% spaceless %}標籤 移除html標籤中的空白字元,包括空格,換行鍵,tab鍵等。 首先建立一個測試環境,相信看到看到這裡的都知道怎樣建立一個測試環境了。這裡就不細說了。 我們在html中寫入一下程式碼: <div> <p>

servlet學習請求轉發重定向

一、請求轉發和重定向兩者之間的區別 請求轉發:一次請求,位址列資訊不變。       重定向:兩次請求,位址列資訊會發生改變。 使用時機: 1.如果表單中有資料,而資料又比較重要,不能重複提交,建議使用重定向。 2.如果servlet接受後

MyBatis學習--解決實體屬性資料庫欄位不一致的問題

寫在前面 孤傲蒼狼的部落格:https://www.cnblogs.com/xdp-gacl/category/655890.html 程式碼中會有很多重要的註釋,請不要忽略。 前面在建立實體時,強調過一定要和資料庫列名一致。如果不一致結果是對映不到實體中的,但是資料庫和j

Vue學習——計算屬性偵聽器

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>計算屬性和偵聽器</title> <script src="./vue

python學習:python變數函式

python用下劃線作為變數字首和字尾指定特殊變數 _xxx 不能用’from module import *’匯入 __xxx__ 系統定義名字 __xxx 類中的私有變數名 核心風格:避免用下劃線作為變數名的開始。   因為下劃線對直譯器有特殊的意義,而且是內建

PKI學習之路-----------------------SSL雙向認證

專案地址:https://github.com/gongxianshengjiadexiaohuihui/PKI/tree/master/ssl 上一篇 我們講了如何用java自帶的keytool工具生成數字證書,我們需要準備兩個證書,一個是server的一個是client的 &

Flutter元件學習—— 佈局元件RowColumn

序言之前幾篇文章介紹了Flutter——Text文字元件,Flutter——Image圖片元件,Flutter——TextFiled輸入框元件,上面的這些元件可以說是一些直接能“看的到”樣式元件,接下來我會帶大家一起來學習 Flutter 中的一些“看不到”的佈局元件,老規矩,先上圖:介紹我們都知道,在And

git的使用學習配置別名讓git更加簡單

別名的配置方法 $ git config --global alias.st status $ git config --global alias.co checkout $ git config --global alias.ci commit $ git config --glo

Spring學習Jdbc連線池交個spring管理事務操作

一、連線池的配置交給Spring管理 1,新增jar包 2,spring的jdbc連線池配置 <!-- 配置連線池 --> <bean id="dataSource" class="org.spring

深度學習——目標檢測演算法YOLO的訓練檢測過程的基本思路介紹

      基礎知識掌握情況決定研究的高度,我們剛開始接觸深度學習時,一般都是看到別人的概括,這個方法很好能讓我們快速上手,但是也有一個很大的缺點, 知識理解的不透徹,導致我們對演算法優化時一頭霧水。我也是抱著知識總結的思想開始自己的深度學習知識精髓的探索,也希望能從中幫助到

資料庫學習with as 補充 nvl count 函式

  with as 的專業解釋我這就不詳細說明了,我這就梳理下我自己的實踐應用,就是根據某個條件查詢出結果集放在一個臨時表裡面,可以建立多個臨時表,然後再從這些臨時表中查詢出要的資料。   參考資料:https://www.cnblogs.com/Niko12230/p/5945133.html 

thinkphp5.0學習:入口檔案路由模式路由設定url生成

一、路由的作用 簡化URL地址,方便記憶 有利於搜尋引擎的優化 二、入口檔案 前後臺分離 在網站public目錄下(專案\public)新建admin.php 開啟admin.ph

機器學習與深度學習系列連載: 第一部分 機器學習誤差分析Bias and Variance模型調優

1.誤差分析(Bias and Variance) 當我們以非常複雜的模型去進行測試的時候,可能得到的結果並不理想 影響結果的主要有兩個因素:Bias 偏差、Variance 方差 Bias 偏差 在這裡,我們定義偏差是指與目標結果的偏移量,這個偏