通過docker-compose搭建mongo的replica set高可用


通過docker-compose搭建mongo的replica set高可用

前言

搭建一個mongo的集群,同時原來單機mongo的數據需要遷移到集群中。

處理思路:單機mongo的數據通過mongodump備份,然后集群搭建起來了,在mongorestore導入到集群中,實現數據的遷移。

備份數據

備份(mongodump)與恢復(mongorestore)

備份數據到本地

mongodump -h 192.168.56.201:37018 -u handle -p jimeng2017 -o /home/liz/Desktop/mongo-bei

數據恢復

新的集群安裝完成之后,恢復數據到Primary節點,集群會自動同步到副本集中

mongorestore -h 192.168.56.201:37017 -u handle -p jimeng2017  /home/liz/Desktop/mongo-bei

注意:更換自己服務器上面的ip和mongo對應的賬號密碼

集群搭建

生成keyFile

  • MongoDB使用keyfile認證,副本集中的每個mongod實例使用keyfile內容作為認證其他成員的共享密碼。mongod實例只有擁有正確的keyfile才可以加入副本集。
  • keyFile的內容必須是6到1024個字符的長度,且副本集所有成員的keyFile內容必須相同。
  • 有一點要注意是的:在UNIX系統中,keyFile必須沒有組權限或完全權限(也就是權限要設置成X00的形式)。Windows系統中,keyFile權限沒有被檢查。
  • 可以使用任意方法生成keyFile。例如,如下操作使用openssl生成復雜的隨機的1024個字符串。然后使用chmod修改文件權限,只給文件擁有者提供讀權限。
# 400權限是要保證安全性,否則mongod啟動會報錯
openssl rand -base64 756 > mongodb.key
chmod 400 mongodb.key

每一個副本集成員都要使用相同的keyFile文件

創建yml文件

配置文件:

version: '3.3'

services:
  mongodb1:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo1:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb1
    ports:
      - 37017:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb2:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo2:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb2
    ports:
      - 37018:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb3:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo3:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb3
    ports:
      - 37019:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

文件詳解
chown 999:999 /data/mongodb.key 999用戶是容器中的mongod用戶,通過chown修改文件用戶權限
mongod --replSet mongos --keyFile /data/mongodb.key 啟動命令,--replSet mongos 以副本集形式啟動並將副本集名字命名為 mongos ,--keyFile /data/mongodb.key 設置keyFile,用於副本集通信,文件通過 volumes 映射到容器內

然后啟動

docker-compose -f  docker-compose-set.yml up -d

初始化副本集

然后進去到第一個容器里面,初始化副本集

docker exec -it mongodb1 /bin/bash

登錄

mongo -u 賬號 -p 密碼

登錄成功可以查看狀態

> rs.status()
{
	"ok" : 0,
	"errmsg" : "no replset config has been received",
	"code" : 94,
	"codeName" : "NotYetInitialized"
}

配置副本集

> rs.initiate({
... ...     _id: "mongos",
... ...     members: [
... ...         { _id : 0, host : "192.168.56.201:37017" },
... ...         { _id : 1, host : "192.168.56.201:37018" },
... ...         { _id : 2, host : "192.168.56.201:37019" }
... ...     ]
... ... });
{ "ok" : 1 }

上面提示ok就是表示成功了,這時候會選舉出Primary節點。重新通過rs.status()查看狀態就能看到了。

rs.status()
{
	"set" : "mongos",
	"date" : ISODate("2020-07-04T13:02:44.676Z"),
	"myState" : 1,
	"term" : NumberLong(1),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 2,
	"writeMajorityCount" : 2,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1593867760, 1),
			"t" : NumberLong(1)
		},
		"lastCommittedWallTime" : ISODate("2020-07-04T13:02:40.809Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1593867760, 1),
			"t" : NumberLong(1)
		},
		"readConcernMajorityWallTime" : ISODate("2020-07-04T13:02:40.809Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1593867760, 1),
			"t" : NumberLong(1)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1593867760, 1),
			"t" : NumberLong(1)
		},
		"lastAppliedWallTime" : ISODate("2020-07-04T13:02:40.809Z"),
		"lastDurableWallTime" : ISODate("2020-07-04T13:02:40.809Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1593867720, 5),
	"lastStableCheckpointTimestamp" : Timestamp(1593867720, 5),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-07-04T13:02:00.300Z"),
		"termAtElection" : NumberLong(1),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1593867709, 1),
			"t" : NumberLong(-1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(-29631936),
		"newTermStartDate" : ISODate("2020-07-04T13:02:00.787Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-07-04T13:02:01.528Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.56.201:37017",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 155,
			"optime" : {
				"ts" : Timestamp(1593867760, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-07-04T13:02:40Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "could not find member to sync from",
			"electionTime" : Timestamp(1593867720, 1),
			"electionDate" : ISODate("2020-07-04T13:02:00Z"),
			"configVersion" : 1,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 1,
			"name" : "192.168.56.201:37018",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 54,
			"optime" : {
				"ts" : Timestamp(1593867760, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593867760, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-07-04T13:02:40Z"),
			"optimeDurableDate" : ISODate("2020-07-04T13:02:40Z"),
			"lastHeartbeat" : ISODate("2020-07-04T13:02:44.402Z"),
			"lastHeartbeatRecv" : ISODate("2020-07-04T13:02:43.511Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "192.168.56.201:37017",
			"syncSourceHost" : "192.168.56.201:37017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 1
		},
		{
			"_id" : 2,
			"name" : "192.168.56.201:37019",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 54,
			"optime" : {
				"ts" : Timestamp(1593867760, 1),
				"t" : NumberLong(1)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593867760, 1),
				"t" : NumberLong(1)
			},
			"optimeDate" : ISODate("2020-07-04T13:02:40Z"),
			"optimeDurableDate" : ISODate("2020-07-04T13:02:40Z"),
			"lastHeartbeat" : ISODate("2020-07-04T13:02:44.402Z"),
			"lastHeartbeatRecv" : ISODate("2020-07-04T13:02:43.533Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "192.168.56.201:37017",
			"syncSourceHost" : "192.168.56.201:37017",
			"syncSourceId" : 0,
			"infoMessage" : "",
			"configVersion" : 1
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1593867760, 1),
		"signature" : {
			"hash" : BinData(0,"Zr91geLBqJM7xN3vVVMWnJYAexk="),
			"keyId" : NumberLong("6845609731550085123")
		}
	},
	"operationTime" : Timestamp(1593867760, 1)
}

通過rs.status()的輸出我們就能分出那個是PRIMARY節點了。

增加副本集

之前已經初始化了三個mongo,我們在原來的基礎上再增加一個副本集。

首先編寫docker-compose-set.yml增加mongodb4

mongodb4:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo4:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb4
    ports:
      - 37020:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

啟動

docker-compose -f  docker-compose-set.yml up -d

然后進入到PRIMARY,執行

> rs.add("192.168.56.201:37020")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1593868399, 1),
		"signature" : {
			"hash" : BinData(0,"BZJ2tCwFE1NvE22/LwGzFTWy+1M="),
			"keyId" : NumberLong("6845609731550085123")
		}
	},
	"operationTime" : Timestamp(1593868399, 1)
}

再次查看

> rs.status()
{
	"set" : "mongos",
	"date" : ISODate("2020-07-04T13:13:27.944Z"),
	"myState" : 1,
	"term" : NumberLong(3),
	"syncingTo" : "",
	"syncSourceHost" : "",
	"syncSourceId" : -1,
	"heartbeatIntervalMillis" : NumberLong(2000),
	"majorityVoteCount" : 3,
	"writeMajorityCount" : 3,
	"optimes" : {
		"lastCommittedOpTime" : {
			"ts" : Timestamp(1593868399, 1),
			"t" : NumberLong(3)
		},
		"lastCommittedWallTime" : ISODate("2020-07-04T13:13:19.243Z"),
		"readConcernMajorityOpTime" : {
			"ts" : Timestamp(1593868399, 1),
			"t" : NumberLong(3)
		},
		"readConcernMajorityWallTime" : ISODate("2020-07-04T13:13:19.243Z"),
		"appliedOpTime" : {
			"ts" : Timestamp(1593868399, 1),
			"t" : NumberLong(3)
		},
		"durableOpTime" : {
			"ts" : Timestamp(1593868399, 1),
			"t" : NumberLong(3)
		},
		"lastAppliedWallTime" : ISODate("2020-07-04T13:13:19.243Z"),
		"lastDurableWallTime" : ISODate("2020-07-04T13:13:19.243Z")
	},
	"lastStableRecoveryTimestamp" : Timestamp(1593868366, 1),
	"lastStableCheckpointTimestamp" : Timestamp(1593868366, 1),
	"electionCandidateMetrics" : {
		"lastElectionReason" : "electionTimeout",
		"lastElectionDate" : ISODate("2020-07-04T13:06:06.408Z"),
		"termAtElection" : NumberLong(3),
		"lastCommittedOpTimeAtElection" : {
			"ts" : Timestamp(0, 0),
			"t" : NumberLong(-1)
		},
		"lastSeenOpTimeAtElection" : {
			"ts" : Timestamp(1593867860, 1),
			"t" : NumberLong(1)
		},
		"numVotesNeeded" : 2,
		"priorityAtElection" : 1,
		"electionTimeoutMillis" : NumberLong(10000),
		"numCatchUpOps" : NumberLong(37018),
		"newTermStartDate" : ISODate("2020-07-04T13:06:06.753Z"),
		"wMajorityWriteAvailabilityDate" : ISODate("2020-07-04T13:06:07.255Z")
	},
	"members" : [
		{
			"_id" : 0,
			"name" : "192.168.56.201:37017",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 452,
			"optime" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-07-04T13:13:19Z"),
			"optimeDurableDate" : ISODate("2020-07-04T13:13:19Z"),
			"lastHeartbeat" : ISODate("2020-07-04T13:13:27.642Z"),
			"lastHeartbeatRecv" : ISODate("2020-07-04T13:13:27.493Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 2
		},
		{
			"_id" : 1,
			"name" : "192.168.56.201:37018",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 452,
			"optime" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-07-04T13:13:19Z"),
			"optimeDurableDate" : ISODate("2020-07-04T13:13:19Z"),
			"lastHeartbeat" : ISODate("2020-07-04T13:13:27.622Z"),
			"lastHeartbeatRecv" : ISODate("2020-07-04T13:13:27.493Z"),
			"pingMs" : NumberLong(13),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 2
		},
		{
			"_id" : 2,
			"name" : "192.168.56.201:37019",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY",
			"uptime" : 454,
			"optime" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-07-04T13:13:19Z"),
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"electionTime" : Timestamp(1593867966, 1),
			"electionDate" : ISODate("2020-07-04T13:06:06Z"),
			"configVersion" : 2,
			"self" : true,
			"lastHeartbeatMessage" : ""
		},
		{
			"_id" : 3,
			"name" : "192.168.56.201:37020",
			"ip" : "192.168.56.201",
			"health" : 1,
			"state" : 2,
			"stateStr" : "SECONDARY",
			"uptime" : 8,
			"optime" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDurable" : {
				"ts" : Timestamp(1593868399, 1),
				"t" : NumberLong(3)
			},
			"optimeDate" : ISODate("2020-07-04T13:13:19Z"),
			"optimeDurableDate" : ISODate("2020-07-04T13:13:19Z"),
			"lastHeartbeat" : ISODate("2020-07-04T13:13:27.418Z"),
			"lastHeartbeatRecv" : ISODate("2020-07-04T13:13:27.823Z"),
			"pingMs" : NumberLong(0),
			"lastHeartbeatMessage" : "",
			"syncingTo" : "",
			"syncSourceHost" : "",
			"syncSourceId" : -1,
			"infoMessage" : "",
			"configVersion" : 2
		}
	],
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1593868399, 1),
		"signature" : {
			"hash" : BinData(0,"BZJ2tCwFE1NvE22/LwGzFTWy+1M="),
			"keyId" : NumberLong("6845609731550085123")
		}
	},
	"operationTime" : Timestamp(1593868399, 1)
}

可以看到最新的節點已經加進去了

將節點初始化也放到yml中

如果熟練了,我們可以將副本集的初始化也放到yml中完成

version: '3.3'

services:
  mongodb1:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo1:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb1
    ports:
      - 37017:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb2:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo2:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb2
    ports:
      - 37018:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb3:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo3:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb3
    ports:
      - 37019:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb4:
    image: mongo:4.2.1
    volumes:
      - /data/mongo/data/mongo4:/data/db
      - ./mongodb.key:/data/mongodb.key
    user: root
    environment:
      - MONGO_INITDB_ROOT_USERNAME=handle
      - MONGO_INITDB_ROOT_PASSWORD=jimeng2017
      - MONGO_INITDB_DATABASE=handle
    container_name: mongodb4
    ports:
      - 37020:27017
    command: mongod --replSet mongos --keyFile /data/mongodb.key
    restart: always
    entrypoint:
      - bash
      - -c
      - |
        chmod 400 /data/mongodb.key
        chown 999:999 /data/mongodb.key
        exec docker-entrypoint.sh $$@

  mongodb-init:
    image: mongo:4.2.1
    depends_on:
      - mongodb1
      - mongodb2
      - mongodb3
      - mongodb4
    restart: on-failure:5
    command:
      - mongo
      - mongodb://handle:jimeng2017@192.168.56.201:37017/admin
      - --eval
      - 'rs.initiate({ _id: "mongos", members: [{_id:1,host:"192.168.56.201:37017"},{_id:2,host:"192.168.56.201:37018"},{_id:3,host:"192.168.56.201:37019"},{_id:4,host:"192.168.56.201:37020"}]})'

這樣通過docker-compose up -d就能完成鏡像的構建和副本集的初始化

了解下Replica set

Replica set,由一組Mongod實例(進程)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有數據都寫入Primary,Secondary從Primary同步寫入的數據,通過這樣的方式來保持復制集內所有成員存儲相同的數據集,提供數據的高可用。

優點:

  • 確保數據安全
  • 高(24 * 7)數據可用性
  • 災難恢復
  • 無需停機維護(例如備份,索引重建,壓縮)
  • 讀取縮放(要讀取的額外副本)
  • 副本集對應用程序是透明的

復制在MongoDB中的工作方式

  • MongoDB通過使用副本集來實現復制。 副本集是一組托管相同數據集的mongod實例。 在副本中,一個節點是接收所有寫操作的主節點。 所有其他實例,例如第二實例,都將應用來自第一實例的操作,以便它們具有相同的數據集。 副本集只能有一個主節點。
  • 副本集是一組兩個或更多節點(通常至少需要3個節點)。
  • 在副本集中,一個節點是主要節點,其余節點是次要節點。
  • 所有數據從主節點復制到輔助節點。
  • 在自動故障轉移或維護時,將為主節點建立選舉,並選舉一個新的主節點。
  • 恢復失敗的節點后,它再次加入副本集並用作輔助節點。

下面就是工作的流程圖

測試連接

使用go測試下是否能正常連接和讀寫數據。

show dbs;:查看數據庫

> show dbs
admin         0.000GB
bs-cx         0.000GB
config        0.000GB
handle        0.001GB
handle-core4  0.019GB
local         0.020GB
stud          0.000GB

use stud;:切換到指定數據庫,如果不存在該數據庫就創建。

> use stud
switched to db stud

db;:顯示當前所在數據庫。

> db
stud

db.dropDatabase():刪除當前數據庫

> db.dropDatabase();
{ "ok" : 1 }

測試寫入數據,使用的包https://github.com/mongodb/mongo-go-driver

package main

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
)

type Student struct {
	Name string
	Age  int
}

func main() {
	uri := "mongodb://handle:jimeng2017@192.168.56.201:37017,192.168.56.201:37018,192.168.56.201:37019,192.168.56.201:37020/admin?replicaSet=mongos"
	// 設置客戶端連接配置
	clientOptions := options.Client().ApplyURI(uri)

	// 連接到MongoDB
	client, err := mongo.Connect(context.TODO(), clientOptions)
	if err != nil {
		log.Fatal(err)
	}

	// 檢查連接
	err = client.Ping(context.TODO(), nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Connected to MongoDB!")
	collection := client.Database("stud").Collection("student")

	s1 := Student{"小紅", 12}
	insertResult, err := collection.InsertOne(context.TODO(), s1)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Inserted a single document: ", insertResult.InsertedID)

	var result Student
	filter := bson.D{{"name", "小紅"}}

	err = collection.FindOne(context.TODO(), filter).Decode(&result)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Printf("Found a single document: %+v\n", result)

	// 斷開連接
	err = client.Disconnect(context.TODO())
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Connection to MongoDB closed.")
}

打印下輸出

Connected to MongoDB!
Inserted a single document:  ObjectID("5f00b6092aef651857151754")
Found a single document: {Name:小紅 Age:12}
Connection to MongoDB closed.

成功連接上了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM