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 副本集搭建 & 副本集扩容的更多相关文章
- MongoDB Sharding(二) -- 搭建分片集群
在上一篇文章中,我们基本了解了分片的概念,本文将着手实践,进行分片集群的搭建 首先我们再来了解一下分片集群的架构,分片集群由三部分构成: mongos:查询路由,在客户端程序和分片之间提供接口.本次实 ...
- Mongodb副本集搭建经验
一.环境配置经验 1.一般安装的副本集的时候,主实例可以有数据库和用户:从实例不能.仲裁机不能有任何数据库包括用户 2.搭建副本集的时候Host使用外网IP,否则使用Mongodb VUE 1.6.9 ...
- MongoDB副本集搭建及备份恢复
一.MongoDB副本集(repl set)介绍 早起版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主: 目前已经淘汰了ma ...
- MongoDb的副本集搭建教程(个人操作笔记)
很多公司都在用MongoDb ,一直没有时间研究,最近好好的整了一下,做下笔记,直接上操作步骤,关于Mongodb的理论知识可以搜索其他资料,也可以联系我索取 mongoDB官方已经不建议使用主从模式 ...
- MongoDB集群搭建-副本集
MongoDB集群搭建-副本集 概念性的知识,可以参考本人博客地址: 一.Master-Slave方案: 主从: 二.Replica Set方案: 副本集: 步骤:(只要按步骤操作,100%成功) 1 ...
- mongodb副本集搭建过程中的问题和解决技巧
在我以往的认知中,一个系统一旦正式上线,多半不会轻易的迁移服务器,尤其是那种涉及到多个关联应用,涉及到多台硬件服务器的系统,因为这种迁移将是牵一发而动全身的. 但是,却仍然有这种情况存在,就如我这几天 ...
- mongodb安装及副本集搭建
mongodb下载地址:https://www.mongodb.com/dr/fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.7.tg ...
- MongoDB 3.4 高可用集群搭建(二)replica set 副本集
转自:http://www.lanceyan.com/tech/mongodb/mongodb_repset1.html 在上一篇文章<MongoDB 3.4 高可用集群搭建(一):主从模式&g ...
- mongodb配置副本集(多台服务器间的副本集搭建) replica[ˈrɛplɪkə]
副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了“主节点挂掉了,整个集群内会自动切换”的问题.我们来看看mongoDB副本集的架构图: 由图可以看到客户端连接到整个副本集 ...
随机推荐
- Flask+pin
Flask+SSTI的新火花 记一次buu刷题记和回顾祥云杯被虐出屎的经历.题目:[GYCTF2020]FlaskApp 一 题目初见 朴实无华的页面,一个base64的小程序页面 看到有提示. 我就 ...
- MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28
1.MySQL简介 1.数据库产品演变 第一代数据库架构: RDBMS 关系型数据库时代 : 合的时代 代表产品 :Oracle .MSSQL .MySQL.SQL server 第二代数据库架构:拆 ...
- ElasticSearch Python 基本操作
创建索引 from elasticsearch import Elasticsearch es = Elasticsearch('192.168.149.96:9200') mappings = { ...
- 在vSphere中为不同服务器配置IPMI功能
在vSphere HA中如果要配置并启用DPM功能,需要记录服务器远程管理接口的IP地址(不是ESXi的IP地址,而是另一个独立的IP地址,是与ESXi服务器同一网段的另一个IP地址)与MAC地址.远 ...
- 超详细oracle 11g安装步骤 win版本
1. 打开网址: https://edelivery.oracle.com 使用oracle 任意账号登录 账号:2696671285@qq.com 密码:Oracle123 感谢来自某位好心大佬的共 ...
- 龙芯fedora28日常生存指南
2021-01-30 v0.0.5 从0.0.1开始改了非常多,一月余时间的花费渴望为其他人提供一点帮助,能够快速上手. 这主要是这一年来我从3B1500到3A4000再到福珑2的日常使用记录,是之前 ...
- 洛谷P1858
\({\mathcal{For}}\) \({\mathcal{we}\ }\)\({\mathcal{live}\ }\)\({\mathcal{by}\ }\)\({\mathcal{faith} ...
- AcWing 216 Rainbow 的信号
题意 给定一个长度为n的序列,然后从\(1\sim N\) 这 N 个数中选取两个数\(l,r\) , 如果\(l>r\),则交换\(l,r\).把第\(l\) 个数到第\(r\)个数取出来构成 ...
- Codeforces Round #656 (Div. 3) A. Three Pairwise Maximums
题目链接:https://codeforces.com/contest/1385/problem/A 题意 给出三个正整数 $x,y,z$,找出三个正整数 $a,b,c$ 使得 $x = max(a, ...
- UVA 10480 Sabotage (最大流最小割)
题目链接:点击打开链接 题意:把一个图分成两部分,要把点1和点2分开.隔断每条边都有一个花费,求最小花费的情况下,应该切断那些边. 这题很明显是最小割,也就是最大流.把1当成源点,2当成汇点. 问题是 ...