• MongoDB第二话 -- MongoDB高可用集群实现


    本文主要记录MongoDB集群的搭建

    坏境准备:liunx centos7,docker-compose,镜像mongo:4.2.21。
    一主一从一仲裁,在一台机实现了

    项目Value
    0.221:27017节点1
    0.221:27018节点2
    0.221:27019仲裁节点

    1. docker-compose.yaml

    version: '3.7'
    services:
      mongo01:
        image: mongo:4.2.21
        container_name: mongo01
        ports:
        - "27017:27017"
        environment:
        - TZ=Asia/Shanghai
        volumes:
        - ./rs1:/data/db
        #--replSet newset 定义副本集名称 可在路径后面使用?replicaSet=newset
        command: mongod --dbpath /data/db --replSet newset --oplogSize 128
        networks:
        - my-net
      mongo02:
        image: mongo:4.2.21
        container_name: mongo02
        ports:
        - "27018:27017"
        environment:
        - TZ=Asia/Shanghai
        volumes:
        - ./rs2:/data/db
        command: mongod --dbpath /data/db --replSet newset  --oplogSize 128
        networks:
        - my-net
      myarbiter:
        image: mongo:4.2.21
        container_name: myarbiter
        ports:
        - "27019:27017"
        environment:
        - TZ=Asia/Shanghai
        volumes:
        - ./rs3:/data/db
        command: mongod --dbpath /data/db --replSet newset  --oplogSize 128
        networks:
        - my-net
      mongo-console:
        image: mongo-express
        container_name: mongo-console
        ports:
        - "8081:8081"
        environment:
        #控制台 需要集群生效后才能连接成功 只能连接master 可单独抽离出来
        - ME_CONFIG_MONGODB_SERVER=mongo01
    #    - ME_CONFIG_BASICAUTH_USERNAME=admin
    #    - ME_CONFIG_BASICAUTH_PASSWORD=admin
        - TZ=Asia/Shanghai
        networks:
        - my-net
    networks:
      #新增的网络 内部服务名调用
      my-net:
        external: true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    2.启动容器

    [root@m mongo-cluster]# docker ps -a
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                      NAMES
    7588aac35621        mongo:4.2.21        "docker-entrypoint.s…"   15 minutes ago      Up 8 minutes        0.0.0.0:27017->27017/tcp   mongo01
    5adca1bbfa3d        mongo:4.2.21        "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       0.0.0.0:27019->27017/tcp   myarbiter
    5384dac6d37a        mongo:4.2.21        "docker-entrypoint.s…"   15 minutes ago      Up 15 minutes       0.0.0.0:27018->27017/tcp   mongo02
    5df1b5d9af4f        mongo-express       "tini -- /docker-ent…"   15 minutes ago      Up 8 minutes        0.0.0.0:8081->8081/tcp     mongo-console
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    3.初始化集群

    #进入任意一个容器内部 执行mongo命令
    [root@m mongo-cluster]# docker exec -it mongo02 mongo
    MongoDB shell version v4.2.21
    #执行集群初始配置,如果需要程序连接,需要填宿主机IP
    >rs.initiate({_id:"newset",members:[{_id:0,host:"192.168.0.221:27017"},{_id:1,host:"192.168.0.221:27018"},{_id:2,host:"192.168.0.221:27019",arbiterOnly:true}]})
    {
    	"operationTime" : Timestamp(1656417751, 1),
    	"ok" : 0,
    	"errmsg" : "already initialized",
    	"code" : 23,
    	"codeName" : "AlreadyInitialized",
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1656417751, 1),
    		"signature" : {
    			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    			"keyId" : NumberLong(0)
    		}
    	}
    }
    newset:SECONDARY> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    _id:对应的replSet 名称
    host:如果需要程序连接,需要填宿主机IP
    arbiterOnly:true 表示该节点为仲裁节点

    4.查看集群状态

    newset:SECONDARY> rs.status()
    #找到members节点信息
    "members" : [
    		{
    			"_id" : 0,
    			"name" : "192.168.0.221:27017",
    			"health" : 1,
    			"state" : 1,
    			#集群master
    			"stateStr" : "PRIMARY",
    			"uptime" : 202,
    			"optime" : {
    				"ts" : Timestamp(1656417761, 6),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2022-06-28T12:02:41Z"),
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "could not find member to sync from",
    			"electionTime" : Timestamp(1656417761, 1),
    			"electionDate" : ISODate("2022-06-28T12:02:41Z"),
    			"configVersion" : 1,
    			"self" : true,
    			"lastHeartbeatMessage" : ""
    		},
    		{
    			"_id" : 1,
    			"name" : "192.168.0.221:27018",
    			"health" : 1,
    			"state" : 2,
    			#集群slave
    			"stateStr" : "SECONDARY",
    			"uptime" : 10,
    			"optime" : {
    				"ts" : Timestamp(1656417751, 1),
    				"t" : NumberLong(-1)
    			},
    			"optimeDurable" : {
    				"ts" : Timestamp(1656417751, 1),
    				"t" : NumberLong(-1)
    			},
    			"optimeDate" : ISODate("2022-06-28T12:02:31Z"),
    			"optimeDurableDate" : ISODate("2022-06-28T12:02:31Z"),
    			"lastHeartbeat" : ISODate("2022-06-28T12:02:41.778Z"),
    			"lastHeartbeatRecv" : ISODate("2022-06-28T12:02:41.434Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "",
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "",
    			"configVersion" : 1
    		},
    		{
    			"_id" : 2,
    			"name" : "192.168.0.221:27019",
    			"health" : 1,
    			"state" : 7,
    			#集群仲裁
    			"stateStr" : "ARBITER",
    			"uptime" : 10,
    			"lastHeartbeat" : ISODate("2022-06-28T12:02:41.778Z"),
    			"lastHeartbeatRecv" : ISODate("2022-06-28T12:02:41.704Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "",
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "",
    			"configVersion" : 1
    		}
    	],
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73

    5.模拟master节点挂掉

    停掉master节点,进入slave节点容器中查看状态

    "members" : [
    		{
    			"_id" : 0,
    			"name" : "192.168.0.221: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("2022-06-28T12:05:49.005Z"),
    			"lastHeartbeatRecv" : ISODate("2022-06-28T12:05:30.416Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "Error connecting to 192.168.0.221:27017 :: caused by :: Connection refused",
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "",
    			"configVersion" : -1
    		},
    		{
    			"_id" : 1,
    			"name" : "192.168.0.221:27018",
    			"health" : 1,
    			"state" : 1,
    			#原来的slave节点已经变更为master了
    			"stateStr" : "PRIMARY",
    			"uptime" : 390,
    			"optime" : {
    				"ts" : Timestamp(1656417940, 2),
    				"t" : NumberLong(3)
    			},
    			"optimeDate" : ISODate("2022-06-28T12:05:40Z"),
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "could not find member to sync from",
    			"electionTime" : Timestamp(1656417940, 1),
    			"electionDate" : ISODate("2022-06-28T12:05:40Z"),
    			"configVersion" : 1,
    			"self" : true,
    			"lastHeartbeatMessage" : ""
    		},
    		{
    			"_id" : 2,
    			"name" : "192.168.0.221:27019",
    			"health" : 1,
    			"state" : 7,
    			"stateStr" : "ARBITER",
    			"uptime" : 197,
    			"lastHeartbeat" : ISODate("2022-06-28T12:05:49.006Z"),
    			"lastHeartbeatRecv" : ISODate("2022-06-28T12:05:48.204Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "",
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "",
    			"configVersion" : 1
    		}
    	],
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    可以看到原来的slave节点已经变成了PRIMARY主节点

    6.mongo-express控制台

    1. 连接需要注意的点
        environment:
        #不用带端口 直接走容器名称
        - ME_CONFIG_MONGODB_SERVER=mongo01
    
    • 1
    • 2
    • 3
    1. 集群未初始化或者集群master已变更,控制台会报下面错误
    (node:6) UnhandledPromiseRejectionWarning: MongoError: not master and slaveOk=false
    
    • 1

    需要确定master节点后然后重启控制台

    7.springboot中集群配置

    spring:
      data:
        mongodb:
          #有密码连接 账号密码包含特殊字符的需要用URLEncoder编码 库名必填
          #uri: mongodb://admin:123456@192.168.0.221:27017/imgdb
          #集群方式 副本集replicaSet可带可不带
          uri: mongodb://192.168.0.221:27017,192.168.0.221:27018/imgdb?replicaSet=newset
    #      uri: mongodb://192.168.0.221:27017/imgdb
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    以上就是本章的全部内容了。

    上一篇:MongoDB第一话 – Docker安装MongoDB以及Springboot集成MongoDB
    下一篇:JVM第一话 – JVM入门详解以及运行时数据区分析

    书山有路勤为径,学海无涯苦作舟

  • 相关阅读:
    参与现场问题解决总结(Kafka、Hbase)
    前端——html面试题(一)
    CS231n课程笔记:Leture3 Loss Functions and Optimization
    Django笔记十八之save函数的继承操作和指定字段更新等实例方法
    今天运气不错
    yolo自动化项目实例解析(一)日志格式输出、并发异步多线程、websocket、循环截图、yolo推理、3d寻路
    ApiFox 基本使用教程(浅尝辄止,非广)
    基于显扬科技自主研发3D机器视觉HY-M5在物流行业包裹分拣中的应用
    Oracle SQL执行计划操作(11)——层级相关操作
    Opencv+YOLO-V3实现目标跟踪
  • 原文地址:https://blog.csdn.net/qq_35551875/article/details/125429009