MongoDB 副本集搭建 & 副本集扩容

副本集的搭建

创建多实例目录

[root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p

编辑多实例配置文件

[root@redis03 ~]# vim /server/mongodb/28017/conf/mongo.conf
systemLog:
  destination: file
  logAppend: true
  path: /server/mongodb/28017/logs/mongodb.log
  #path: /server/mongodb/28018/logs/mongodb.log
  #path: /server/mongodb/28019/logs/mongodb.log

storage:
  journal:
    enabled: true
  dbPath: /server/mongodb/28017/data
  #dbPath: /server/mongodb/28018/data
  #dbPath: /server/mongodb/28019/data
  directoryPerDB: true
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true

processManagement:
  fork: true
  pidFilePath: /server/mongodb/28017/pid/mongod.pid
  #pidFilePath: /server/mongodb/28018/pid/mongod.pid
  #pidFilePath: /server/mongodb/28019/pid/mongod.pid

net:
  port: 28017
  #port: 28018
  #port: 28019
  bindIp: 127.0.0.1,172.16.1.121
  
replication:
  #类似于binlog,指定大小
  oplogSizeMB: 1024
  #副本记得名称,集群名称
  replSetName: dba

启动多实例

[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo

[mongo@redis03 ~]$ mongod -f /server/mongodb/28017/conf/mongo.conf
[mongo@redis03 ~]$ mongod -f /server/mongodb/28018/conf/mongo.conf
[mongo@redis03 ~]$ mongod -f /server/mongodb/28019/conf/mongo.conf

#验证
[mongo@redis03 ~]$ netstat -lntp
tcp        0      0 172.16.1.121:27017         0.0.0.0:*               LISTEN      20881/mongod        
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      20881/mongod         
tcp        0      0 172.16.1.121:28017         0.0.0.0:*               LISTEN      328121/mongod        
tcp        0      0 127.0.0.1:28017         0.0.0.0:*               LISTEN      328121/mongod        
tcp        0      0 172.16.1.121:28018         0.0.0.0:*               LISTEN      321218/mongod        
tcp        0      0 127.0.0.1:28018         0.0.0.0:*               LISTEN      321218/mongod        
tcp        0      0 172.16.1.121:28019         0.0.0.0:*               LISTEN      32981/mongod        
tcp        0      0 127.0.0.1:28019         0.0.0.0:*               LISTEN      32981/mongod

登录多实例

[mongo@redis03 ~]$ mongo  172.16.1.121:28017
[mongo@redis03 ~]$ mongo  172.16.1.121:28018
[mongo@redis03 ~]$ mongo  172.16.1.121:28019

初始化副本集

#配置副本集
config = {
  _id : "dba", 
  members : [
    {_id:0, host:"172.16.1.121:28017"},
    {_id:1, host:"172.16.1.121:28018"},
    {_id:2, host:"172.16.1.121:28019"},
  ]
}

#读取副本集
rs.initiate(config) 

查看副本集状态

dba:PRIMARY> rs.status()
            # 健康状态 1表示正常 0表示故障
            "health" : 1,
            # 表示状态 1是主库 2是从库 3表示恢复数据中 7表示投票者 8表示down机
            "state" : 1,
            # 标注是主库还是从库
            "stateStr" : "PRIMARY",
            # 集群启动时间
            "uptime" : 579,
            # 另一种格式的时间
            "optime" : {
                "ts" : Timestamp(15905121779, 1),
                "t" : NumberLong(1)
            },
            # 上一次心跳传过来数据的时间
            "optimeDate" : ISODate("2020-05-27T15:36:19Z"),
            # 检测上一次心跳时间
            "lastHeartbeat" : ISODate("2020-05-27T15:36:25.815Z"),
            
#查看集群与主节点
dba:PRIMARY> rs.isMaster()

#oplog信息
dba:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1024MB
log length start to end: 1543secs (0.43hrs)
oplog first event time:  Wed May 27 2020 23:26:46 GMT+0800 (CST)
oplog last event time:   Wed May 27 2020 23:52:29 GMT+0800 (CST)
now:                     Wed May 27 2020 23:52:38 GMT+0800 (CST)

#查看延时从库信息
dba:PRIMARY> rs.printSlaveReplicationInfo()
source: 10.0.0.121:28018
    syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
source: 10.0.0.121:28019
    syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary 
    
#打印副本集配置文件
dba:PRIMARY> rs.config()

主库创建数据,从库查看数据

# 主库插入数据
db.table.insertMany([{"name":"gcc","age":10},{"name":"zzy","age":9},{"name":"hxh","age":11}])
# 主库查看数据
dba:PRIMARY> show tables
table
dba:PRIMARY> db.table.find()

# 从库查看数据
dba:SECONDARY> show databases
2020-05-27T23:43:40.020+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "operationTime" : Timestamp(1590594219, 1),
    "ok" : 0,
    "errmsg" : "not master and slaveOk=false",
    "code" : 13435,
    "codeName" : "NotMasterNoSlaveOk",
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590594219, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
} 
# 连查看库都会被拒绝,因为从库不提供读写

# 执行命令(从库都要执行)
dba:SECONDARY> rs.slaveOk()
dba:SECONDARY> show databases
admin    0.000GB
cluster  0.000GB
config   0.000GB
local    0.000GB

# 每次重新连接都要执行以上命令才能读取
# 可以配置永久生效
[root@redis03 ~]# vim ~/.mongorc.js
rs.slaveOk()

副本集实现高可用

故障切换测试

# 主库使用 localhost 连接,执行关闭数据库的操作(使用 ip 连接是不能执行的)
[mongo@redis03 ~]$ mongo localhost:28017
dba:PRIMARY> use admin
switched to db admin
dba:PRIMARY> db.shutdownServer()

# 查看其他从库中会有一台从库,变成主库

# 故障转移实现了,但是我的程序连接 mongodb 的配置还需要修改怎么办??

程序怎么实现连接切换的

1.如果使用的是单节点,那么程序里面直接配置写死mongodb的 ip 和端口即可

2.如果是副本集集群的形式,在程序里面写的就是一个列表,列表里面写
    mongo_reip = [172.16.1.121:28017,172.16.1.121:28018,172.16.1.121:28019]
    程序会去使用命令询问谁是主节点,得到结果后在写入数据

恢复主库

#重新启动主库,他会自动判断谁是主库,自动成为新的从库

注意:三台节点,只能坏一台,坏两台就有问题了

指定节点提升优先级

# 原来的主库配置高,性能好,想恢复之后还让他是主库怎么办

# 查看优先级
dba:PRIMARY> rs.conf()
            # 权重值
            "priority" : 1,
            
# 临时修改配置文件
dba:PRIMARY> config=rs.conf()
# 修改配置文件中 id 为 0 的priority值为 10
dba:PRIMARY> config.members[0].priority=10
# 配置文件生效
dba:PRIMARY> rs.reconfig(config)

# 新版本调整完直接切换主库,旧版本需要主动降级
dba:PRIMARY> rs.stepDown()

# 恢复权重
dba:PRIMARY> config=rs.conf()
dba:PRIMARY> config.members[0].priority=1
dba:PRIMARY> rs.reconfig(config)

扩容与删减节点

配置一台新的节点

# 创建目录
[root@redis03 ~]# mkdir /server/mongodb/28016/{conf,logs,pid,data} -p

# 配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28016/conf/
[root@redis03 ~]# sed -i ‘s#28017#28016#g‘ /server/mongodb/28016/conf/mongo.conf 

# 启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28016/conf/mongo.conf 

将新节点加入集群

#主库操作
dba:PRIMARY> rs.add("172.16.1.121:28016")
{
    "ok" : 1,
    "operationTime" : Timestamp(1590597530, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590597530, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

# 查看集群状态
dba:PRIMARY> rs.status()

# 注意:四个节点也不能坏两台机器

删除节点

# 主库操作
dba:PRIMARY> rs.remove("172.16.1.121:28016")
{
    "ok" : 1,
    "operationTime" : Timestamp(1590597842, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1590597842, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

# 查看集群状态
dba:PRIMARY> rs.status()

添加仲裁节点

# 创建目录
[root@redis03 ~]# mkdir /server/mongodb/28015/{conf,logs,pid,data} -p

# 配置新节点
[root@redis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28015/conf/
[root@redis03 ~]# sed -i ‘s#28017#28015#g‘ /server/mongodb/28015/conf/mongo.conf 

# 启动新节点
[root@redis03 ~]# chown -R mongo.mongo /server/mongodb/
[root@redis03 ~]# su - mongo
[mongo@redis03 ~]$ mongod -f /server/mongodb/28015/conf/mongo.conf 

# 主库操作加入仲裁节点
dba:PRIMARY> rs.addArb(("10.0.0.121:28015")

# 查看该库是否有数据

# 注意,五个节点时,可以坏两个节点

MongoDB 副本集搭建 & 副本集扩容

上一篇:MySQL int类型长度的意义是什么


下一篇:mysql基础语句