日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

文档型数据库mongodb介绍2-副本集

發布時間:2025/4/14 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文档型数据库mongodb介绍2-副本集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一。 副本集介紹

? ? ?之前的文章介紹了 mongodb主從 mongodb提供了另外一種 基于副本集的集群 該方式 是一主一從的升級版 ?一主多從,

仍然是主節點負責寫入 從節點定時同步主節點數據 使用該種方式 從節點可以負責讀取的操作 主節點負責寫入 可以輕松實現讀寫分離

? 同時該集群方式支持自動故障轉移 ?集群中所有節點間保持心跳 發現主節點宕機后 選舉一個新的主節點


二。 副本集搭建

查看支持的三種集群參數
? mongod --help ?
? 幫助中 默認的參數 dbpath都有注釋 可以查看
集群幫助如下: ?

Master/slave options (old; use replica sets instead): 主從集群 --master master mode--slave slave mode--source arg when slave: specify master as <server:port>--only arg when slave: specify a single database to replicate--slavedelay arg specify delay (in seconds) to be used when applying master ops to slave--autoresync automatically resync if slave data is staleReplica set options: 副本集集群--replSet arg arg is <setname>[/<optionalseedhostlist>]--replIndexPrefetch arg specify index prefetching behavior (if secondary) [none|_id_only|all]--enableMajorityReadConcern enables majority readConcernSharding options: 分片集群--configsvr declare this is a config db of a cluster; default port 27019; default dir /data/configdb--shardsvr declare this is a shard db of a cluster; default port 27018環境:

副本集名稱 myrep 主從自動選舉 192.168.58.147,192.168.58.149,192.168.58.150分別在每臺機器創建數據目錄和啟動

mkdir -p /data/db mongod --port "27017" --dbpath "/data/db" --replSet "myrep" 任意一臺機器 使用mongo連接進入 設置集群配置

config = { _id:"myrep", members:[ ... {_id:0,host:"192.168.58.147:27017"}, ... {_id:1,host:"192.168.58.149:27017"}, ... {_id:2,host:"192.168.58.150:27017"}] ... }進入admin數據庫 ?初始化配置

use admin rs.initiate(config);查看狀態?查詢哪個是主節點 ?PRIMARY表示主節點 ?SECONDARY表示從節點
"members" : [{"_id" : 0,"name" : "192.168.58.147:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY","uptime" : 113,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"infoMessage" : "could not find member to sync from","electionTime" : Timestamp(1509178280, 1),"electionDate" : ISODate("2017-10-28T08:11:20Z"),"configVersion" : 1,"self" : true},{"_id" : 1,"name" : "192.168.58.149:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 50,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:11:51Z"),"lastHeartbeat" : ISODate("2017-10-28T08:11:58.642Z"),"lastHeartbeatRecv" : ISODate("2017-10-28T08:11:58.423Z"),"pingMs" : NumberLong(0),"syncingTo" : "192.168.58.150:27017","configVersion" : 1},{"_id" : 2,"name" : "192.168.58.150:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 50,"optime" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDurable" : {"ts" : Timestamp(1509178311, 1),"t" : NumberLong(1)},"optimeDate" : ISODate("2017-10-28T08:11:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:11:51Z"),"lastHeartbeat" : ISODate("2017-10-28T08:11:58.648Z"),"lastHeartbeatRecv" : ISODate("2017-10-28T08:11:58.797Z"),"pingMs" : NumberLong(0),"syncingTo" : "192.168.58.147:27017","configVersion" : 1}],"ok" : 1
主節點為147,測試數據插入
myrep:PRIMARY> use kkk switched to db kkk myrep:PRIMARY> db.mycol.insert(name:'zs',sex:'boy') 2017-10-28T01:19:25.629-0700 E QUERY [thread1] SyntaxError: missing ) after argument list @(shell):1:20 myrep:PRIMARY> db.mycol.insert({name:'zs',sex:'boy'}) WriteResult({ "nInserted" : 1 }) myrep:PRIMARY> show dbs admin 0.000GB kkk 0.000GB local 0.000GB test 0.000GB myrep:PRIMARY> cd kkk 2017-10-28T01:19:49.855-0700 E QUERY [thread1] SyntaxError: missing ; before statement @(shell):1:3 myrep:PRIMARY> use kkk switched to db kkk myrep:PRIMARY> show tables mycol myrep:PRIMARY> db.mycol.find() { "_id" : ObjectId("59f43d9808241ee611659c95"), "name" : "zs", "sex" : "boy" }149 mongo命令進入當前機器服務

myrep:SECONDARY> db.getMongo().setSlaveOk(); 設置可讀 myrep:SECONDARY> show dbs admin 0.000GB kkk 0.000GB local 0.000GB test 0.000GB 發現kkk數據庫已經被創建了 也就是正常同步數據

測試關閉147 主節點
149客戶端查看集群狀態

"members" : [{"_id" : 0,"name" : "192.168.58.147:27017","health" : 0,"state" : 8,"stateStr" : "(not reachable/healthy)", 不可達"uptime" : 0,"optime" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDurable" : {"ts" : Timestamp(0, 0),"t" : NumberLong(-1)},"optimeDate" : ISODate("1970-01-01T00:00:00Z"),"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),"lastHeartbeat" : ISODate("2017-11-01T02:42:23.164Z"),"lastHeartbeatRecv" : ISODate("2017-11-01T02:42:01.859Z"),"pingMs" : NumberLong(2),"lastHeartbeatMessage" : "Connection refused","configVersion" : -1},{"_id" : 1,"name" : "192.168.58.149:27017","health" : 1,"state" : 2,"stateStr" : "SECONDARY","uptime" : 885,"optime" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDate" : ISODate("2017-10-28T08:25:51Z"),"syncingTo" : "192.168.58.150:27017","configVersion" : 1,"self" : true},{"_id" : 2,"name" : "192.168.58.150:27017","health" : 1,"state" : 1,"stateStr" : "PRIMARY", 切換回主節點"uptime" : 838,"optime" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDurable" : {"ts" : Timestamp(1509179151, 4),"t" : NumberLong(2)},"optimeDate" : ISODate("2017-10-28T08:25:51Z"),"optimeDurableDate" : ISODate("2017-10-28T08:25:51Z"),"lastHeartbeat" : ISODate("2017-11-01T02:42:24.126Z"),"lastHeartbeatRecv" : ISODate("2017-11-01T02:42:23.174Z"),"pingMs" : NumberLong(1),"electionTime" : Timestamp(1509179151, 2),"electionDate" : ISODate("2017-10-28T08:25:51Z"),"configVersion" : 1}],"ok" : 1150自動切換為主節點了 登錄 150 后 執行刪除kkk數據庫操作
myrep:SECONDARY> use kkk switched to db kkk myrep:PRIMARY> db.dropDatabase() { "dropped" : "kkk", "ok" : 1 }149檢查

myrep:SECONDARY> show dbs admin 0.000GB local 0.000GB test 0.000GB重啟 147 ?(注意不要用 mongod啟動 帶上完整參數啟動)
mongod --port "27017" --dbpath "/data/db" --replSet "myrep" 檢查狀態發現 ?147的數據庫kkk也刪除了 檢查rs.status()發現 147 自動變成了從服務器

三。 jdbc操作

添加maven依賴

<dependency><groupId>org.mongodb</groupId><artifactId>mongo-java-driver</artifactId><version>3.2.0</version></dependency> 添加測試類 (代碼和之前主從一致 只是需要設置 讀取偏好)

package mongo;import java.util.ArrayList; import java.util.List; import java.util.Random;import org.bson.Document; import org.junit.Test;import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.ReadPreference; import com.mongodb.ServerAddress; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters;public class TestMongoMs {/*** 獲取mongodb的連接* @return*/public static MongoClient getClient(){//將副本集中所有的節點都加入List<ServerAddress> seedList=new ArrayList<ServerAddress>();seedList.add(new ServerAddress("192.168.58.150", 27017));seedList.add(new ServerAddress("192.168.58.147", 27017));seedList.add(new ServerAddress("192.168.58.149", 27017));//設置偏好為 從節點讀取數據 默認是主節點讀取MongoClientOptions mco=MongoClientOptions.builder().readPreference(ReadPreference.secondary()).build();MongoClient mc=new MongoClient(seedList,mco);return mc;}/*** 創建集合并添加文檔和document*/@Testpublic void createCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");for(int i=0;i<=100;i++){Document doc=new Document();doc.append("name", "ls"+i);doc.append("sex", i%2==0?"女":"男");doc.append("age", new Random().nextInt(100));mcd.insertOne(doc);}}/*** 查找集合下所有文檔 具體根據條件參考刪除*/@Testpublic void findCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");FindIterable<Document> ft=mcd.find();MongoCursor<Document> mr=ft.iterator();while(mr.hasNext()){Document doc=mr.next();System.out.println(doc.get("name")+"--"+doc.get("sex"));}}/*** 更新文檔* updateOne更新找到的所有結果集中的第一條* updateMany是更新所有結果集*/@Testpublic void updateCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");Document doc=new Document();doc.append("sex","男");//只是找到所有sex=女 將sex改成男 其他字段不修改mcd.updateMany(Filters.eq("sex", "女"),new Document("$set",doc));}/*** 根據條件刪除*/@Testpublic void deleteCollection(){MongoClient mc=getClient();MongoDatabase database=mc.getDatabase("mydb");MongoCollection<Document> mcd=database.getCollection("userInfo");//刪除滿足條件找到的第一條記錄mcd.deleteOne(Filters.eq("sex", "女"));//兩個條件都滿足的所有記錄都刪除mcd.deleteMany(Filters.and(Filters.eq("sex", "女"),Filters.eq("name", "ls")));} }

主要代碼在?MongoClient實例化位置 設置偏好為 讀 從從服務器?

設置從服務器可讀 ?db.getMongo().setSlaveOk()?

測試java結果

信息: Discovered replica set primary 192.168.58.147:27017 十一月 01, 2017 4:44:33 下午 com.mongodb.diagnostics.logging.JULLogger log 信息: Opened connection [connectionId{localValue:4, serverValue:14}] to 192.168.58.149:27017多次測試讀取都是從 從服務器

轉載于:https://www.cnblogs.com/liaomin416100569/p/9331174.html

總結

以上是生活随笔為你收集整理的文档型数据库mongodb介绍2-副本集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。