美文网首页
MongoDB分片集群搭建

MongoDB分片集群搭建

作者: 科威舟VS求利 | 来源:发表于2020-11-29 15:28 被阅读0次

    本文主要介绍了mongoDB分片集群概念,以及分片集群搭建过程,方便下次参考。

    概念

    分片(sharding)是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。换句话说:分片就是将数据拆分,将其分散存在不同的机器上的过程,将数据分散到不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更多的负载。

    分片集群包含的组件

    MongoDB分片集群包含以下组件:

    • 分片(存储):每个分片包含分片数据的子集,每个分片都可以部署为副本集
    • mongos(路由):mongos充当查询路由器,在客户端应用程序和分片集群之前提供接口
    • config servers(“调度”的配置):配置服务器存储集群的元数据和配置设置。从mongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)

    下图描述了分片集群中组件的交互:


    mongoDB分片集群

    分片集群架构

    本文搭建的副本集集群是两个分片节点副本集(3+3)+一个配置节点副本集(3)+两个路由节点(2),共11个服务节点,具体如下图所示:


    mongoDB分片集群架构

    分片集群搭建

    第一套副本集

    本次搭建一主一副本一仲裁,相关的配置文件、数据、日志都放在sharded_cluster相应的子目录下面,具体步骤如下:

    新建副本集数据和日志的目录

    myshardrs01

    mkdir -p /mongodb/sharded_cluster/myshardrs01_27018/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27018/data/db \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27118/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27118/data/db \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27218/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27218/data/db
    

    新建或修改配置文件

    myshardrs01_27018

    vim /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs01_27018/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27018/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27018
    replication:
      #副本集的名称
      replSetName: myshardrs01
    sharding:
      #分片角色
      clusterRole: shardsvr
    

    设置sharding.clusterRole需要mongod实例运行复制。 要将实例部署为副本集成员,请使用
    replSetName设置并指定副本集的名称。

    myshardrs01_27118

    vim /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs01_27118/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs01_27118/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27118/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27118
    replication:
      #副本集的名称
      replSetName: myshardrs01
    sharding:
      #分片角色
      clusterRole: shardsvr
    

    myshardrs01_27218

    vim /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs01_27218/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs01_27218/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs01_27218/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27218
    replication:
      #副本集的名称
      replSetName: myshardrs01
    sharding:
      #分片角色
      clusterRole: shardsvr
    

    依次启动三个mongod服务

    root@keweizhou-virtual-machine:~# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_270
     18/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 5773
    child process started successfully, parent exiting
    root@keweizhou-virtual-machine:~# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_271
     18/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 5810
    child process started successfully, parent exiting
    root@keweizhou-virtual-machine:~# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_272
     18/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 5849
    child process started successfully, parent exiting
    

    查看服务是否启动

    root@keweizhou-virtual-machine:~# ps -ef | grep mongo
    root       5773      1  2 00:37 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
    root       5810      1  2 00:37 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf
    root       5849      1  2 00:38 ?        00:00:03 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
    root       5903   5729  0 00:40 pts/19   00:00:00 grep --color=auto mongo
    

    初始化副本集

    初始化副本集和创建主节点

    使用客户端命令连接主节点,这里最好连接主节点

    /usr/local/mongodb/bin/mongo --host 192.168.30.129 --port 27018
    

    执行初始化副本集命令:

    > rs.initiate()
    {
            "info2" : "no configuration specified. Using a default configuration for the set",
            "me" : "192.168.30.129:27018",
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607273363, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607273363, 1)
    }
    

    查看副本集情况:

    myshardrs01:PRIMARY> rs.status()
    {
            "set" : "myshardrs01",
            "date" : ISODate("2020-12-06T16:51:22.235Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 1,
            "writeMajorityCount" : 1,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1607273474, 1),
                            "t" : NumberLong(1)
                    },
                    "lastCommittedWallTime" : ISODate("2020-12-06T16:51:14.010Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1607273474, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityWallTime" : ISODate("2020-12-06T16:51:14.010Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1607273474, 1),
                            "t" : NumberLong(1)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1607273474, 1),
                            "t" : NumberLong(1)
                    },
                    "lastAppliedWallTime" : ISODate("2020-12-06T16:51:14.010Z"),
                    "lastDurableWallTime" : ISODate("2020-12-06T16:51:14.010Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1607273413, 1),
            "lastStableCheckpointTimestamp" : Timestamp(1607273413, 1),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2020-12-06T16:49:23.955Z"),
                    "electionTerm" : NumberLong(1),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1607273363, 1),
                            "t" : NumberLong(-1)
                    },
                    "numVotesNeeded" : 1,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "newTermStartDate" : ISODate("2020-12-06T16:49:23.989Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2020-12-06T16:49:24.076Z")
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.30.129:27018",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 846,
                            "optime" : {
                                    "ts" : Timestamp(1607273474, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T16:51:14Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1607273363, 2),
                            "electionDate" : ISODate("2020-12-06T16:49:23Z"),
                            "configVersion" : 1,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    }
            ],
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607273474, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607273474, 1)
    }
    

    主节点配置查看

    myshardrs01:PRIMARY> rs.conf()
    {
            "_id" : "myshardrs01",
            "version" : 1,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27018",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd0b93ae50cdd5f8dd65a8")
            }
    }
    

    添加副本节点

    myshardrs01:PRIMARY> rs.add("192.168.30.129:27118")
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607273787, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607273787, 1)
    }
    

    添加仲裁节点

    myshardrs01:PRIMARY> rs.addArb("192.168.30.129:27218")
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607273887, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607273887, 1)
    }
    

    查看副本集的配置情况

    myshardrs01:PRIMARY> rs.conf()
    {
            "_id" : "myshardrs01",
            "version" : 3,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27018",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 1,
                            "host" : "192.168.30.129:27118",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 2,
                            "host" : "192.168.30.129:27218",
                            "arbiterOnly" : true,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 0,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd0b93ae50cdd5f8dd65a8")
            }
    }
    

    第二套副本集

    同样搭建一主一副本一仲裁,相关的配置文件、数据、日志都放在sharded_cluster相应的子目录下面,
    具体步骤如下:

    新建副本集数据和日志的目录

    myshardrs02

    mkdir -p /mongodb/sharded_cluster/myshardrs01_27318/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27318/data/db \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27418/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27418/data/db \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27518/log \ &
    mkdir -p /mongodb/sharded_cluster/myshardrs01_27518/data/db
    

    新建或修改配置文件

    myshardrs01_27318

    vim /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs02_27318/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs02_27318/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27318/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27318
    replication:
      #副本集的名称
      replSetName: myshardrs02
    sharding:
      #分片角色
      clusterRole: shardsv2
    

    设置sharding.clusterRole需要mongod实例运行复制。 要将实例部署为副本集成员,请使用
    replSetName设置并指定副本集的名称

    myshardrs01_27418

    vim /mongodb/sharded_cluster/myshardrs02_27418/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs02_27418/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs02_27418/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27418/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27418
    replication:
      #副本集的名称
      replSetName: myshardrs02
    sharding:
      #分片角色
      clusterRole: shardsv2
    

    myshardrs01_27518

    vim /mongodb/sharded_cluster/myshardrs02_27518/mongod.conf
    
    systemLog:
      #MongoDB发送所有日志输出的目标指定为文件
      destination: file
      #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
      path: "/mongodb/sharded_cluster/myshardrs02_27518/log/mongod.log"
      #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
      logAppend: true
    storage:
      #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod
      dbPath: "/mongodb/sharded_cluster/myshardrs02_27518/data/db"
      journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复
        enabled: true
    processManagement:
      #启用在后台运行mongos或mongod进程的守护进程模式
      fork: true
      #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
      pidFilePath: "/mongodb/sharded_cluster/myshardrs02_27518/log/mongod.pid"
    net:
      #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
      #bindIpAll: true
      #服务实例绑定的IP
      bindIp: localhost,192.168.30.129
      #bindIp
      #绑定的端口
      port: 27518
    replication:
      #副本集的名称
      replSetName: myshardrs02
    sharding:
      #分片角色
      clusterRole: shardsv2
    

    启动第二套副本集:一主一副本一仲裁

    依次启动三个mongod服务:

    root@keweizhou-virtual-machine:/# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 8814
    child process started successfully, parent exiting
    root@keweizhou-virtual-machine:/# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27418/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 8853
    child process started successfully, parent exiting
    root@keweizhou-virtual-machine:/# /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27518/mongod.conf
    about to fork child process, waiting until server is ready for connections.
    forked process: 8891
    child process started successfully, parent exiting
    

    查看服务是否启动:

    root@keweizhou-virtual-machine:/# ps -ef | grep mongod
    root       5773      1  1 00:37 ?        00:02:41 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
    root       5810      1  1 00:37 ?        00:02:36 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf
    root       5849      1  1 00:38 ?        00:01:58 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
    root       8814      1  3 03:09 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf
    root       8853      1  3 03:10 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27418/mongod.conf
    root       8891      1  3 03:10 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27518/mongod.conf
    root       8933   8753  0 03:12 pts/11   00:00:00 grep --color=auto mongod
    

    初始化副本集

    初始化副本集和创建主节点

    • 使用客户端命令连接主节点
    /usr/local/mongodb/bin/mongo --host localhost --port 27318
    
    • 执行初始化副本集命令,查看副本集情况:
     > rs.initiate()
    {
            "info2" : "no configuration specified. Using a default configuration for the set",
            "me" : "192.168.30.129:27318",
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607283102, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607283102, 1)
    }
    myshardrs02:SECONDARY> rs.status()
    {
            "set" : "myshardrs02",
            "date" : ISODate("2020-12-06T19:32:26.089Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 1,
            "writeMajorityCount" : 1,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1607283142, 1),
                            "t" : NumberLong(1)
                    },
                    "lastCommittedWallTime" : ISODate("2020-12-06T19:32:22.128Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1607283142, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityWallTime" : ISODate("2020-12-06T19:32:22.128Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1607283142, 1),
                            "t" : NumberLong(1)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1607283142, 1),
                            "t" : NumberLong(1)
                    },
                    "lastAppliedWallTime" : ISODate("2020-12-06T19:32:22.128Z"),
                    "lastDurableWallTime" : ISODate("2020-12-06T19:32:22.128Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1607283102, 4),
            "lastStableCheckpointTimestamp" : Timestamp(1607283102, 4),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2020-12-06T19:31:42.101Z"),
                    "electionTerm" : NumberLong(1),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1607283102, 1),
                            "t" : NumberLong(-1)
                    },
                    "numVotesNeeded" : 1,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "newTermStartDate" : ISODate("2020-12-06T19:31:42.124Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2020-12-06T19:31:42.127Z")
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.30.129:27318",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1366,
                            "optime" : {
                                    "ts" : Timestamp(1607283142, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T19:32:22Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1607283102, 2),
                            "electionDate" : ISODate("2020-12-06T19:31:42Z"),
                            "configVersion" : 1,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    }
            ],
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607283142, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607283142, 1)
    }
    
    • 主节点配置查看
    myshardrs02:PRIMARY> rs.conf()
    {
            "_id" : "myshardrs02",
            "version" : 1,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27318",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd319d2790e96839e1982f")
            }
    }
    
    • 添加副本节点
    myshardrs02:PRIMARY> rs.add("192.168.30.129:27418")
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607283321, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607283321, 1)
    }
    
    • 添加仲裁节点
    myshardrs02:PRIMARY> rs.addArb("192.168.30.129:27518")
    {
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607283403, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607283403, 1)
    }
    
    • 查看副本集的配置情况
    myshardrs02:PRIMARY> rs.conf()
    {
            "_id" : "myshardrs02",
            "version" : 3,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27318",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 1,
                            "host" : "192.168.30.129:27418",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 2,
                            "host" : "192.168.30.129:27518",
                            "arbiterOnly" : true,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 0,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd319d2790e96839e1982f")
            }
    }
    myshardrs02:PRIMARY> rs.status()
    {
            "set" : "myshardrs02",
            "date" : ISODate("2020-12-06T19:38:11.227Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 2,
            "writeMajorityCount" : 2,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1607283482, 1),
                            "t" : NumberLong(1)
                    },
                    "lastCommittedWallTime" : ISODate("2020-12-06T19:38:02.401Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1607283482, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityWallTime" : ISODate("2020-12-06T19:38:02.401Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1607283482, 1),
                            "t" : NumberLong(1)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1607283482, 1),
                            "t" : NumberLong(1)
                    },
                    "lastAppliedWallTime" : ISODate("2020-12-06T19:38:02.401Z"),
                    "lastDurableWallTime" : ISODate("2020-12-06T19:38:02.401Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1607283452, 1),
            "lastStableCheckpointTimestamp" : Timestamp(1607283452, 1),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2020-12-06T19:31:42.101Z"),
                    "electionTerm" : NumberLong(1),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1607283102, 1),
                            "t" : NumberLong(-1)
                    },
                    "numVotesNeeded" : 1,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "newTermStartDate" : ISODate("2020-12-06T19:31:42.124Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2020-12-06T19:31:42.127Z")
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.30.129:27318",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1711,
                            "optime" : {
                                    "ts" : Timestamp(1607283482, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T19:38:02Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1607283102, 2),
                            "electionDate" : ISODate("2020-12-06T19:31:42Z"),
                            "configVersion" : 3,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    },
                    {
                            "_id" : 1,
                            "name" : "192.168.30.129:27418",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 169,
                            "optime" : {
                                    "ts" : Timestamp(1607283482, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(1607283482, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T19:38:02Z"),
                            "optimeDurableDate" : ISODate("2020-12-06T19:38:02Z"),
                            "lastHeartbeat" : ISODate("2020-12-06T19:38:09.974Z"),
                            "lastHeartbeatRecv" : ISODate("2020-12-06T19:38:11.133Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncingTo" : "192.168.30.129:27318",
                            "syncSourceHost" : "192.168.30.129:27318",
                            "syncSourceId" : 0,
                            "infoMessage" : "",
                            "configVersion" : 3
                    },
                    {
                            "_id" : 2,
                            "name" : "192.168.30.129:27518",
                            "health" : 1,
                            "state" : 7,
                            "stateStr" : "ARBITER",
                            "uptime" : 87,
                            "lastHeartbeat" : ISODate("2020-12-06T19:38:09.980Z"),
                            "lastHeartbeatRecv" : ISODate("2020-12-06T19:38:10.134Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "configVersion" : 3
                    }
            ],
            "ok" : 1,
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607283482, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607283482, 1)
    }
    

    配置节点副本集的创建

    准备存放数据data文件和日志的目录

    mkdir -p /mongodb/sharded_cluster/myconfigrs_27019/log \ 
    mkdir -p /mongodb/sharded_cluster/myconfigrs_27019/data/db \ 
    
    mkdir -p /mongodb/sharded_cluster/myconfigrs_27119/log \ 
    mkdir -p /mongodb/sharded_cluster/myconfigrs_27119/data/db \
     
    mkdir -p /mongodb/sharded_cluster/myconfigrs_27219/log \ 
    mkdir -p /mongodb/sharded_cluster/myconfigrs_27219/data/db
    

    新建或修改配置文件:
    myconfigrs_27019:

    vim /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf
    
    systemLog:
        #MongoDB发送所有日志输出的目标指定为文件
         destination: file
        #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
        path: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.log"
        #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有 
       日志文件的末尾。
        logAppend: true
    storage:
        #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
        dbPath: "/mongodb/sharded_cluster/myconfigrs_27019/data/db"
        journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
        enabled: true
    processManagement:
        #启用在后台运行mongos或mongod进程的守护进程模式。
        fork: true
        #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或 
       mongod将写入其PID
        pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.pid"
    net:
        #服务实例绑定所有IP
        #bindIpAll: true
       #服务实例绑定的IP
        bindIp: localhost,192.168. 30.129
        #绑定的端口
        port: 27019
    replication:
        replSetName: myconfigrs
    sharding:
        clusterRole: configsvr
    

    新建或修改配置文件:
    myconfigrs_27119

    vim /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
    
    systemLog:
        #MongoDB发送所有日志输出的目标指定为文件
         destination: file
        #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
        path: "/mongodb/sharded_cluster/myconfigrs_27119/log/mongod.log"
        #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有 
       日志文件的末尾。
        logAppend: true
    storage:
        #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
        dbPath: "/mongodb/sharded_cluster/myconfigrs_27119/data/db"
        journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
        enabled: true
    processManagement:
        #启用在后台运行mongos或mongod进程的守护进程模式。
        fork: true
        #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或 
       mongod将写入其PID
        pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27119/log/mongod.pid"
    net:
        #服务实例绑定所有IP
        #bindIpAll: true
       #服务实例绑定的IP
        bindIp: localhost,192.168. 30.129
        #绑定的端口
        port: 27119
    replication:
        replSetName: myconfigrs
    sharding:
        clusterRole: configsvr
    

    新建或修改配置文件:
    myconfigrs_27219

    vim /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
    
    systemLog:
        #MongoDB发送所有日志输出的目标指定为文件
         destination: file
        #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
        path: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.log"
        #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有 
       日志文件的末尾。
        logAppend: true
    storage:
        #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。
        dbPath: "/mongodb/sharded_cluster/myconfigrs_27019/data/db"
        journal:
        #启用或禁用持久性日志以确保数据文件保持有效和可恢复。
        enabled: true
    processManagement:
        #启用在后台运行mongos或mongod进程的守护进程模式。
        fork: true
        #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或 
       mongod将写入其PID
        pidFilePath: "/mongodb/sharded_cluster/myconfigrs_27019/log/mongod.pid"
    net:
        #服务实例绑定所有IP
        #bindIpAll: true
       #服务实例绑定的IP
        bindIp: localhost,192.168. 30.129
        #绑定的端口
        port: 27019
    replication:
        replSetName: myconfigrs
    sharding:
        clusterRole: configsvr
    

    依次启动配置的mongod副本集:一主两副本

    /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf
    /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27119/mongod.conf
    /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
    

    查看服务是否启动:

    root@keweizhou-virtual-machine:~# ps -ef | grep mongo
    root       5773      1  1 00:37 ?        00:03:33 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
    root       5810      1  1 00:37 ?        00:03:34 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27118/mongod.conf
    root       5849      1  1 00:38 ?        00:02:39 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs01_27218/mongod.conf
    root       8814      1  1 03:09 ?        00:01:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27318/mongod.conf
    root       8853      1  1 03:10 ?        00:00:56 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27418/mongod.conf
    root       8891      1  1 03:10 ?        00:00:45 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myshardrs02_27518/mongod.conf
    root      10111  10014  0 04:07 pts/20   00:00:00 vim /mongodb/sharded_cluster/myshardrs01_27018/mongod.conf
    root      10156      1  2 04:11 ?        00:00:07 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27019/mongod.conf
    root      10216      1  2 04:14 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27119/mongod.conf
    root      10264      1  3 04:15 ?        00:00:04 /usr/local/mongodb/bin/mongod -f /mongodb/sharded_cluster/myconfigrs_27219/mongod.conf
    root      10317   9513  0 04:16 pts/19   00:00:00 grep --color=auto mongo
    

    初始化副本集和创建主节点

    • 使用客户端命令连接主节点
    /usr/local/mongodb/bin/mongo --host localhost --port 27019
    
    • 执行初始化副本集命令:
     rs.initiate()
    {
            "info2" : "no configuration specified. Using a default configuration for the set",
            "me" : "192.168.30.129:27019",
            "ok" : 1,
            "$gleStats" : {
                    "lastOpTime" : Timestamp(1607286823, 1),
                    "electionId" : ObjectId("7fffffff0000000000000001")
            },
            "lastCommittedOpTime" : Timestamp(0, 0),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607286823, 2),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607286823, 1)
    }
    
    • 查看副本集情况
    myconfigrs:PRIMARY> rs.status()
    {
            "set" : "myconfigrs",
            "date" : ISODate("2020-12-06T20:34:05.938Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "configsvr" : true,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 1,
            "writeMajorityCount" : 1,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1607286841, 1),
                            "t" : NumberLong(1)
                    },
                    "lastCommittedWallTime" : ISODate("2020-12-06T20:34:01.804Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1607286841, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityWallTime" : ISODate("2020-12-06T20:34:01.804Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1607286841, 1),
                            "t" : NumberLong(1)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1607286841, 1),
                            "t" : NumberLong(1)
                    },
                    "lastAppliedWallTime" : ISODate("2020-12-06T20:34:01.804Z"),
                    "lastDurableWallTime" : ISODate("2020-12-06T20:34:01.804Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1607286823, 32),
            "lastStableCheckpointTimestamp" : Timestamp(1607286823, 32),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2020-12-06T20:33:43.769Z"),
                    "electionTerm" : NumberLong(1),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1607286823, 1),
                            "t" : NumberLong(-1)
                    },
                    "numVotesNeeded" : 1,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "newTermStartDate" : ISODate("2020-12-06T20:33:43.781Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2020-12-06T20:33:43.892Z")
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.30.129:27019",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1330,
                            "optime" : {
                                    "ts" : Timestamp(1607286841, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T20:34:01Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1607286823, 2),
                            "electionDate" : ISODate("2020-12-06T20:33:43Z"),
                            "configVersion" : 1,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    }
            ],
            "ok" : 1,
            "$gleStats" : {
                    "lastOpTime" : Timestamp(1607286823, 1),
                    "electionId" : ObjectId("7fffffff0000000000000001")
            },
            "lastCommittedOpTime" : Timestamp(1607286841, 1),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607286841, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607286841, 1)
    }
    
    • 主节点配置查看
    myconfigrs:PRIMARY> rs.config()
    {
            "_id" : "myconfigrs",
            "version" : 1,
            "configsvr" : true,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27019",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd40279fe937f6ca2c75a2")
            }
    }
    
    • 添加两个副本节点
    rs.add("192.168.30.129:27119")
    rs.add("192.168.30.129:27219")
    
    • 查看副本集的配置配置情况
    myconfigrs:PRIMARY> rs.conf()
    {
            "_id" : "myconfigrs",
            "version" : 3,
            "configsvr" : true,
            "protocolVersion" : NumberLong(1),
            "writeConcernMajorityJournalDefault" : true,
            "members" : [
                    {
                            "_id" : 0,
                            "host" : "192.168.30.129:27019",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 1,
                            "host" : "192.168.30.129:27119",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    },
                    {
                            "_id" : 2,
                            "host" : "192.168.30.129:27219",
                            "arbiterOnly" : false,
                            "buildIndexes" : true,
                            "hidden" : false,
                            "priority" : 1,
                            "tags" : {
    
                            },
                            "slaveDelay" : NumberLong(0),
                            "votes" : 1
                    }
            ],
            "settings" : {
                    "chainingAllowed" : true,
                    "heartbeatIntervalMillis" : 2000,
                    "heartbeatTimeoutSecs" : 10,
                    "electionTimeoutMillis" : 10000,
                    "catchUpTimeoutMillis" : -1,
                    "catchUpTakeoverDelayMillis" : 30000,
                    "getLastErrorModes" : {
    
                    },
                    "getLastErrorDefaults" : {
                            "w" : 1,
                            "wtimeout" : 0
                    },
                    "replicaSetId" : ObjectId("5fcd40279fe937f6ca2c75a2")
            }
    }
    myconfigrs:PRIMARY> rs.status()
    {
            "set" : "myconfigrs",
            "date" : ISODate("2020-12-06T20:43:19.377Z"),
            "myState" : 1,
            "term" : NumberLong(1),
            "syncingTo" : "",
            "syncSourceHost" : "",
            "syncSourceId" : -1,
            "configsvr" : true,
            "heartbeatIntervalMillis" : NumberLong(2000),
            "majorityVoteCount" : 2,
            "writeMajorityCount" : 2,
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1607287393, 1),
                            "t" : NumberLong(1)
                    },
                    "lastCommittedWallTime" : ISODate("2020-12-06T20:43:13.944Z"),
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1607287393, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityWallTime" : ISODate("2020-12-06T20:43:13.944Z"),
                    "appliedOpTime" : {
                            "ts" : Timestamp(1607287393, 1),
                            "t" : NumberLong(1)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1607287393, 1),
                            "t" : NumberLong(1)
                    },
                    "lastAppliedWallTime" : ISODate("2020-12-06T20:43:13.944Z"),
                    "lastDurableWallTime" : ISODate("2020-12-06T20:43:13.944Z")
            },
            "lastStableRecoveryTimestamp" : Timestamp(1607287363, 1),
            "lastStableCheckpointTimestamp" : Timestamp(1607287363, 1),
            "electionCandidateMetrics" : {
                    "lastElectionReason" : "electionTimeout",
                    "lastElectionDate" : ISODate("2020-12-06T20:33:43.769Z"),
                    "electionTerm" : NumberLong(1),
                    "lastCommittedOpTimeAtElection" : {
                            "ts" : Timestamp(0, 0),
                            "t" : NumberLong(-1)
                    },
                    "lastSeenOpTimeAtElection" : {
                            "ts" : Timestamp(1607286823, 1),
                            "t" : NumberLong(-1)
                    },
                    "numVotesNeeded" : 1,
                    "priorityAtElection" : 1,
                    "electionTimeoutMillis" : NumberLong(10000),
                    "newTermStartDate" : ISODate("2020-12-06T20:33:43.781Z"),
                    "wMajorityWriteAvailabilityDate" : ISODate("2020-12-06T20:33:43.892Z")
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.30.129:27019",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 1884,
                            "optime" : {
                                    "ts" : Timestamp(1607287393, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T20:43:13Z"),
                            "syncingTo" : "",
                            "syncSourceHost" : "",
                            "syncSourceId" : -1,
                            "infoMessage" : "",
                            "electionTime" : Timestamp(1607286823, 2),
                            "electionDate" : ISODate("2020-12-06T20:33:43Z"),
                            "configVersion" : 3,
                            "self" : true,
                            "lastHeartbeatMessage" : ""
                    },
                    {
                            "_id" : 1,
                            "name" : "192.168.30.129:27119",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 152,
                            "optime" : {
                                    "ts" : Timestamp(1607287393, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(1607287393, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T20:43:13Z"),
                            "optimeDurableDate" : ISODate("2020-12-06T20:43:13Z"),
                            "lastHeartbeat" : ISODate("2020-12-06T20:43:18.273Z"),
                            "lastHeartbeatRecv" : ISODate("2020-12-06T20:43:19.304Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncingTo" : "192.168.30.129:27219",
                            "syncSourceHost" : "192.168.30.129:27219",
                            "syncSourceId" : 2,
                            "infoMessage" : "",
                            "configVersion" : 3
                    },
                    {
                            "_id" : 2,
                            "name" : "192.168.30.129:27219",
                            "health" : 1,
                            "state" : 2,
                            "stateStr" : "SECONDARY",
                            "uptime" : 135,
                            "optime" : {
                                    "ts" : Timestamp(1607287393, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(1607287393, 1),
                                    "t" : NumberLong(1)
                            },
                            "optimeDate" : ISODate("2020-12-06T20:43:13Z"),
                            "optimeDurableDate" : ISODate("2020-12-06T20:43:13Z"),
                            "lastHeartbeat" : ISODate("2020-12-06T20:43:18.273Z"),
                            "lastHeartbeatRecv" : ISODate("2020-12-06T20:43:18.504Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "",
                            "syncingTo" : "192.168.30.129:27019",
                            "syncSourceHost" : "192.168.30.129:27019",
                            "syncSourceId" : 0,
                            "infoMessage" : "",
                            "configVersion" : 3
                    }
            ],
            "ok" : 1,
            "$gleStats" : {
                    "lastOpTime" : {
                            "ts" : Timestamp(1607287264, 1),
                            "t" : NumberLong(1)
                    },
                    "electionId" : ObjectId("7fffffff0000000000000001")
            },
            "lastCommittedOpTime" : Timestamp(1607287393, 1),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607287393, 1),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            },
            "operationTime" : Timestamp(1607287393, 1)
    }
    

    路由节点的创建和操作

    第一个路由节点的创建和连接

    • 准备存放数据和日志的目录,mymongos_27017节点:
    mkdir -p /mongodb/sharded_cluster/mymongos_27017/log
    
    • 新建或修改配置文件:
    vim /mongodb/sharded_cluster/mymongos_27017/mongos.conf
    
    systemLog:
        #MongoDB发送所有日志输出的目标指定为文件
        destination: file
        #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径
        path: "/mongodb/sharded_cluster/mymongos_27017/log/mongod.log"
        #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。
        logAppend: true
    processManagement:
        #启用在后台运行mongos或mongod进程的守护进程模式。
        fork: true
        #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID
        pidFilePath: /mongodb/sharded_cluster/mymongos_27017/log/mongod.pid"
    net:
        #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip
        #bindIpAll: true
        #服务实例绑定的IP
        bindIp: localhost,192.168.30.129
        #bindIp
        #绑定的端口
        port: 27017
    sharding:
        #指定配置节点副本集
        configDB: myconfigrs/192.168.30.129:27019,192.168.30.129:27119,192.168.30.129:27219
    
    • 启动mongos:
    /usr/local/mongodb/bin/mongos -f /mongodb/sharded_cluster/mymongos_27017/mongos.conf
    
    • 客户端登录mongos
    /usr/local/mongodb/bin/mongo --host localhost --port 27017
    

    此时写入数据会报Database db could not be created :: caused by :: No shards found,错误,原因是通过路由节点操作,现在只是连接了配置节点,还没有连接分片数据节点,因此无法写入业务数据。如下:

    mongos> use db
    switched to db db
    mongos> db.test.insert({a:"aaa"})
    WriteCommandError({
            "ok" : 0,
            "errmsg" : "unable to initialize targeter for write op for collection db.test :: caused by :: Database db could not be created :: caused by :: No shards found",
            "code" : 70,
            "codeName" : "ShardNotFound",
            "operationTime" : Timestamp(1607294201, 2),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607294201, 2),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    })
    

    在路由节点上进行分片操作

    使用sh.addShard("IP:Port")命令添加分片

    将第一套副本集添加进来:

    mongos> sh.addShard("myshardrs01/192.168.30.129:27018,192.168.30.129:27118,192.168.30.129:27218")
    {
            "shardAdded" : "myshardrs01",
            "ok" : 1,
            "operationTime" : Timestamp(1607294744, 6),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607294744, 6),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    }
    
    • 查看分片状态情况:
    mongos> sh.status()
    --- Sharding Status ---
      sharding version: {
            "_id" : 1,
            "minCompatibleVersion" : 5,
            "currentVersion" : 6,
            "clusterId" : ObjectId("5fcd40279fe937f6ca2c75b1")
      }
      shards:
            {  "_id" : "myshardrs01",  "host" : "myshardrs01/192.168.30.129:27018,192.168.30.129:27118",  "state" : 1 }
      active mongoses:
            "4.2.8" : 1
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours:
                    No recent migrations
      databases:
            {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
    
    

    将第二套分片副本集添加进来

    
    mongos> sh.addShard("myshardrs02/192.168.30.129:27318,192.168.30.129:27418,192.168.30.129:27518")
    {
            "shardAdded" : "myshardrs02",
            "ok" : 1,
            "operationTime" : Timestamp(1607302989, 5),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607302989, 5),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    }
    
    • 查看分片状态:
    mongos> sh.status()
    --- Sharding Status ---
      sharding version: {
            "_id" : 1,
            "minCompatibleVersion" : 5,
            "currentVersion" : 6,
            "clusterId" : ObjectId("5fcd40279fe937f6ca2c75b1")
      }
      shards:
            {  "_id" : "myshardrs01",  "host" : "myshardrs01/192.168.30.129:27018,192.168.30.129:27118",  "state" : 1 }
            {  "_id" : "myshardrs02",  "host" : "myshardrs02/192.168.30.129:27318,192.168.30.129:27418",  "state" : 1 }
      active mongoses:
            "4.2.8" : 1
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours:
                    16 : Success
      databases:
            {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                    config.system.sessions
                            shard key: { "_id" : 1 }
                            unique: false
                            balancing: true
                            chunks:
                                    myshardrs01     1008
                                    myshardrs02     16
                            too many chunks to print, use verbose if you want to force print
    

    如图所示即添加成功了,如果添加分片失败,需要手动移除分片,检查添加分片的信息正确性后,再次添加分片,移除分片的命令为:

    user admin
    db.runCommand({removeShard:"myshardrs02"})
    

    如果只剩下最后一个shard,是无法删除的,移除时会自动转移分片数据,需要一个时间的过程,完成后再次执行删除分片命令才能真正删除

    • 开启分片功能查看分片状态
      sh.enableSharding("库名")、sh.shardCollection("库名.集合名",{"key":1})
      在mongos上的articledb数据库配置sharding:
      开启分片功能
    mongos> sh.enableSharding("articledb")
    {
            "ok" : 1,
            "operationTime" : Timestamp(1607309697, 7),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1607309697, 7),
                    "signature" : {
                            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                            "keyId" : NumberLong(0)
                    }
            }
    }
    

    查看分片状态:

    mongos> sh.status()
    --- Sharding Status ---
      sharding version: {
            "_id" : 1,
            "minCompatibleVersion" : 5,
            "currentVersion" : 6,
            "clusterId" : ObjectId("5fcd40279fe937f6ca2c75b1")
      }
      shards:
            {  "_id" : "myshardrs01",  "host" : "myshardrs01/192.168.30.129:27018,192.168.30.129:27118",  "state" : 1 }
            {  "_id" : "myshardrs02",  "host" : "myshardrs02/192.168.30.129:27318,192.168.30.129:27418",  "state" : 1 }
      active mongoses:
            "4.2.8" : 1
      autosplit:
            Currently enabled: yes
      balancer:
            Currently enabled:  yes
            Currently running:  no
            Failed balancer rounds in last 5 attempts:  0
            Migration Results for the last 24 hours:
                    512 : Success
      databases:
            {  "_id" : "articledb",  "primary" : "myshardrs02",  "partitioned" : true,  "version" : {  "uuid" : UUID("dd46e3d4-33d8-4702-b6a7-50b1c758f6f9"),  "lastMod" : 1 } }
            {  "_id" : "config",  "primary" : "config",  "partitioned" : true }
                    config.system.sessions
                            shard key: { "_id" : 1 }
                            unique: false
                            balancing: true
                            chunks:
                                    myshardrs01     512
                                    myshardrs02     512
                            too many chunks to print, use verbose if you want to force print
    
    • 集合分片
      对于集合分片,使用 sh.shardCollection() 方法指定集合和分片键
      语法:
    sh.shardCollection(namespace, key, unique)
    

    mongoDB的分片策略

    1. 哈希策略
      基于哈希的分片,mongoDB会计算一个字段的哈希值,并用这个哈希值来创建数据块
      2.范围策略
      基于范围的分片,mongoDB会按照片键的范围把数据分成不同的部分

    相关文章

      网友评论

          本文标题:MongoDB分片集群搭建

          本文链接:https://www.haomeiwen.com/subject/xgrkwktx.html