MongoDB副本集详解

副本集作用

  1. 数据是同步的,若某个副本挂掉,其余的副本集可以跟上继续使用。
  2. 可以作为备份的数据库

启用多个副本

这次的所有操作都在windows上进行,linux是同样的原理。
先编写三个mongod.cfg
假设mongo安装在D:\Program Files\mongodb\server\4.2目录
mongod.cfg:

# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
  dbPath: D:\Program Files\mongodb\server\4.2\data
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path:  D:\Program Files\mongodb\server\4.2\log\mongod.log

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0

#processManagement:

#security:
  #authorization: enabled
  #keyFile:	D:\Program Files\mongodb\server\4.2\mongo_key
  
#operationProfiling:

# replSetName所属副本集的名称,副本集中的所有主机必须使用相同的集名称
replication:
  replSetName: rs0

#sharding:

## Enterprise-Only Options:

#auditLog:

#snmp:

其余两个mongod.cfg中仅修改几个地方:

dbPath: D:\Program Files\mongodb\server\4.2\data
path:  D:\Program Files\mongodb\server\4.2\log\mongod.log
port: 27017

切记:replSetName必须设置成相同的,若未设置,将不会以副本集方式启动

# replSetName所属副本集的名称,副本集中的所有主机必须使用相同的集名称
replication:
  replSetName: rs0

启动:

mongod.exe --config mongod.cfg
mongod.exe --config mongod2.cfg
mongod.exe --config mongod3.cfg

若我的ip是192.168.1.888
三个mongo是:

192.168.1.888:27017
192.168.1.888:27016
192.168.1.888:27015

进入mongo,host最好带上

mongo.exe  --host 192.168.1.888 --port 27017
config = {_id:"liangqicong",members:[{ _id:0,host:"192.168.1.188:27017" },{ _id:1,host:"192.168.1.188:27016" },{ _id:2,host:"192.168.1.188:27015" }]}
rs.initiate(config);
rs.status() #查看mongo副本集状态

讲解:rs.conf()中每项的意思

{
        "_id" : "rs0",#MongoDB副本集名称
        "version" : 135972,
        "protocolVersion" : NumberLong(1),
        "writeConcernMajorityJournalDefault" : true,
        "members" : [#副本集成员
                {
                        "_id" : 0,
                        "host" : "192.168.1.183:27017",//host,mongo实例的ip,可以为域名
                        "arbiterOnly" : false,#是否是仲裁者,不保存数据,只参与选举
                        "buildIndexes" : true,#是否在mongo上建立索引
                        "hidden" : false,#是否隐藏该实例,如果设置为true,将不能读取数据库,该成员有投票权
                        "priority" : 10,#优先级,priority和votes的具体讲解在下面,着重将这个
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),#延迟多久同步
                        "votes" : 1#投票数
                },
                {
                        "_id" : 1,
                        "host" : "192.168.1.183:27015",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 0,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 0
                },
                {
                        "_id" : 2,
                        "host" : "ngrok.viatank.com:5555",
                        "arbiterOnly" : false,
                        "buildIndexes" : true,
                        "hidden" : false,
                        "priority" : 0,
                        "tags" : {

                        },
                        "slaveDelay" : NumberLong(0),
                        "votes" : 0
                }
        ],
        "settings" : {
                "chainingAllowed" : true,
                "heartbeatIntervalMillis" : 2000,
                "heartbeatTimeoutSecs" : 10,
                "electionTimeoutMillis" : 10000,
                "catchUpTimeoutMillis" : -1,
                "catchUpTakeoverDelayMillis" : 30000,
                "getLastErrorModes" : {

                },
                "getLastErrorDefaults" : {
                        "w" : 1,
                        "wtimeout" : 0
                },
                "replicaSetId" : ObjectId("5f35ed66c17c49c0519d52c3")
        }
}

priority和votes讲解

  1. priority为成为PRIMARY(主成员)的标志,数字越大优先级越高,被选为PRIMARY的可能性越大
  2. priority若为0,那么将没有投票权,也没有成为PRIMARY的可能性
  3. votes值为0或1,表示拥有的票数
  4. 若有3个mongo中,最好把priority设置为不同的值,不然若所拥有的票数(votes)都为1的情况下,若其中一个挂掉了,那么另外两个会无法选举出PRIMARY,因为两个人所拥有的票数是一样的,并且优先级也一样
  5. 若现在只想做备份,2个mongo,mongo1做PRIMARY,mongo2专门做备份的。那么应将mongo2的priority设置0,votes设置成0,这样可以保证,及时mongo1挂了,mongo2也不会接管,mongo1再次启动,也会被选举成PRIMARY

修改rs.conf()里面的信息

cfg = rs.conf()
cfg.members[0].priority = 5
cfg.members[1].votes = 0
rs.reconfig(cfg)

切记,不要在数据库中直接修改replset,同步会有问题的

rs.slaveOk()
对于当前会话,此命令允许从非主实例(即从属或辅助实例)读取操作

题外话:有很多客户端,需要重新连接后才能看见数据,因为每一次连接是一次会话。而如果不重新连接,是无法有读取操作

文档:https://docs.mongodb.com/manual/reference/replica-configuration/index.html
https://mongodb-documentation.readthedocs.io/en/latest/

你可能感兴趣的:(#,MongoDB)