推广做任务 有哪些网站,网站设计计划书,wordpress 预约时间,各大网站收录入口本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》#xff1a;python零基础入门学习 《python运维脚本》#xff1a; python运维脚本实践 《shell》#xff1a;shell学习 《terraform》持续更新中#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8… 本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》python零基础入门学习 《python运维脚本》 python运维脚本实践 《shell》shell学习 《terraform》持续更新中terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解决分享 《日志收集》ELK各种中间件 《运维日常》运维日常 《linux》运维面试100问 《DBA》db的介绍使用mysql、redis、mongodb... 一、副本集的搭建
0.介绍副本集
#官网的参考地址
https://docs.mongodb.com/manual/replication/
# Mongodb副本集介绍
Mongodb复制集由一组Mongod实例进程组成包含一个Primary节点和多个Secondary节点。
Mongodb Driver客户端的所有数据都写入PrimarySecondary从Primary同步写入的数据以保持复制集内所有成员存储相同的数据集实现数据的高可用。
# 副本集作用
数据冗余用做故障恢复使用当发生硬件故障或者其它原因造成的宕机时可以使用副本进行恢复。
读写分离读的请求分流到副本上减轻主节点的读压力。
# 副本集角色介绍
主节点Primary
接收所有的写请求然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点当Primary挂掉后其他Secondary或者Arbiter节点会重新选举出来一个主节点。
默认读请求也是发到Primary节点处理的可以通过修改客户端连接配置以支持读取Secondary节点。
副本节点Secondary
与主节点保持同样的数据集。当主节点挂掉的时候参与选主。
仲裁者Arbiter
不保有数据不参与选主只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求Arbiter几乎没什么大的硬件资源需求但重要的一点是在生产环境下它和其他数据节点不要部署在同一台机器上。
# 注意
在PSS典型架构中Replica Set节点数必须为奇数目的是选主投票的时候要出现大多数才能进行选主决策。
在PSA架构中需要偶数个数据节点加一个Arbiter构成的Replica Set PSS 典型副本集架构读写操作都由主处理从只负责同步 PSAPrimary Secondary Arbiter模式使用Arbiter搭建Replica Set 1.创建多实例目录
[rootredis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p
2.编辑多实例配置文件
[rootredis03 ~]# vim /server/mongodb/28017/conf/mongo.conf
systemLog:destination: filelogAppend: truepath: /server/mongodb/28017/logs/mongodb.log#path: /server/mongodb/28018/logs/mongodb.log#path: /server/mongodb/28019/logs/mongodb.log
storage:journal:enabled: truedbPath: /server/mongodb/28017/data#dbPath: /server/mongodb/28018/data#dbPath: /server/mongodb/28019/datadirectoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true
processManagement:fork: truepidFilePath: /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: 28019bindIp: 127.0.0.1,10.0.0.93replication:#类似于binlog指定大小oplogSizeMB: 1024#副本记得名称集群名称replSetName: dba
3.启动多实例
[rootredis03 ~]# chown -R mongo.mongo /server/mongodb/
[rootredis03 ~]# su - mongo
[mongoredis03 ~]$ mongod -f /server/mongodb/28017/conf/mongo.conf
[mongoredis03 ~]$ mongod -f /server/mongodb/28018/conf/mongo.conf
[mongoredis03 ~]$ mongod -f /server/mongodb/28019/conf/mongo.conf
#验证
[mongoredis03 ~]$ netstat -lntp
tcp 0 0 10.0.0.93:28017 0.0.0.0:* LISTEN 32893/mongod
tcp 0 0 127.0.0.1:28017 0.0.0.0:* LISTEN 32893/mongod
tcp 0 0 10.0.0.93:28018 0.0.0.0:* LISTEN 32938/mongod
tcp 0 0 127.0.0.1:28018 0.0.0.0:* LISTEN 32938/mongod
tcp 0 0 10.0.0.93:28019 0.0.0.0:* LISTEN 32981/mongod
tcp 0 0 127.0.0.1:28019 0.0.0.0:* LISTEN 32981/mongod
4.登录多实例
[mongoredis03 ~]$ mongo 10.0.0.93:28017
[mongoredis03 ~]$ mongo 10.0.0.93:28018
[mongoredis03 ~]$ mongo 10.0.0.93:28019
5.初始化副本集
#配置副本集
config {_id : dba, members : [{_id:0, host:10.0.0.93:28017},{_id:1, host:10.0.0.93:28018},{_id:2, host:10.0.0.93:28019},]
}
复制集通过 replSetInitiate 命令或 rs.initiate() 命令进行初始化。
初始化后各个成员间开始发送心跳消息并发起 Primary 选举操作获得大多数成员投票支持的节点会成为 Primary其余节点成为 Secondary。
#读取副本集
rs.initiate(config)
6.查看副本集状态
dba:PRIMARY rs.status()#健康状态 1表示正常 0表示故障health : 1,#表示状态 1是主库 2是从库 3表示恢复数据中 7表示投票者 8表示down机state : 1,#标注是主库还是从库stateStr : PRIMARY,#集群启动时间uptime : 579,#另一种格式的时间optime : {ts : Timestamp(1590593779, 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 GMT0800 (CST)
oplog last event time: Wed May 27 2020 23:52:29 GMT0800 (CST)
now: Wed May 27 2020 23:52:38 GMT0800 (CST)
#查看延时从库信息
dba:PRIMARY rs.printSlaveReplicationInfo()
source: 10.0.0.93:28018syncedTo: Wed May 27 2020 23:54:19 GMT0800 (CST)0 secs (0 hrs) behind the primary
source: 10.0.0.93:28019syncedTo: Wed May 27 2020 23:54:19 GMT0800 (CST)0 secs (0 hrs) behind the primary #打印副本集配置文件
dba:PRIMARY rs.config()
7.主库创建数据从库查看数据
#主库插入数据
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.0200800 E QUERY [thread1] Error: listDatabases failed:{operationTime : Timestamp(1590594219, 1),ok : 0,errmsg : not master and slaveOkfalse,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
#每次重新连接都要执行以上命令才能读取
#可以配置永久生效
[rootredis03 ~]# vim ~/.mongorc.js
rs.slaveOk()
二、副本集实现高可用
1.故障切换测试
#主库使用 localhost 连接执行关闭数据库的操作使用ip连接是不能执行的
[rootdb01 ~]# mongod -f /server/mongodb/28018/conf/mongo.conf --shutdown#查看其他从库中会有一台从库变成主库#故障转移实现了但是我的程序连接mongodb的配置还需要修改怎么办
2.程序怎么实现连接切换的
1.如果使用的是单节点那么程序里面直接配置写死mongodb的ip和端口即可2.如果是副本集集群的形式在程序里面写的就是一个列表列表里面写mongo_reip[10.0.0.91:28017,10.0.0.92:28018,10.0.0.93:29019]程序会去使用命令询问谁是主节点得到结果后在写入数据
3.恢复主库
#重新启动主库他会自动判断谁是主库自动成为新的从库#注意三台节点只能坏一台坏两台就有问题了
4.指定节点提升优先级
#原来的主库配置高性能好想恢复之后还让他是主库怎么办#查看优先级
dba:PRIMARY rs.conf()#权重值priority : 1,#临时修改配置文件
dba:PRIMARY configrs.conf()
#修改配置文件中 id 为0 的priority值为10
dba:PRIMARY config.members[0].priority10
#配置文件生效
dba:PRIMARY rs.reconfig(config)#新版本调整完直接切换主库旧版本需要主动降级
dba:PRIMARY rs.stepDown()#恢复权重
dba:PRIMARY configrs.conf()
dba:PRIMARY config.members[0].priority1
dba:PRIMARY rs.reconfig(config)
三、扩容与删减节点
1.配置一台新的节点
#创建目录
[rootredis03 ~]# mkdir /server/mongodb/28016/{conf,logs,pid,data} -p#配置新节点
[rootredis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28016/conf/
[rootredis03 ~]# sed -i s#28017#28016#g /server/mongodb/28016/conf/mongo.conf #启动新节点
[rootredis03 ~]# chown -R mongo.mongo /server/mongodb/
[rootredis03 ~]# su - mongo
[mongoredis03 ~]$ mongod -f /server/mongodb/28016/conf/mongo.conf
2.将新节点加入集群
#主库操作
dba:PRIMARY rs.add(10.0.0.93:28016)
{ok : 1,operationTime : Timestamp(1590597530, 1),$clusterTime : {clusterTime : Timestamp(1590597530, 1),signature : {hash : BinData(0,AAAAAAAAAAAAAAAAAAAAAAAAAAA),keyId : NumberLong(0)}}
}#查看集群状态
dba:PRIMARY rs.status()#注意四个节点也不能坏两台机器
3.删除节点
#主库操作
dba:PRIMARY rs.remove(10.0.0.93:28016)
{ok : 1,operationTime : Timestamp(1590597842, 1),$clusterTime : {clusterTime : Timestamp(1590597842, 1),signature : {hash : BinData(0,AAAAAAAAAAAAAAAAAAAAAAAAAAA),keyId : NumberLong(0)}}
}#查看集群状态
dba:PRIMARY rs.status()
4.添加仲裁节点
# 仲裁节点说明
不存储数据只进行选主。#创建目录
[rootredis03 ~]# mkdir /server/mongodb/28015/{conf,logs,pid,data} -p#配置新节点
[rootredis03 ~]# cp /server/mongodb/28017/conf/mongo.conf /server/mongodb/28015/conf/
[rootredis03 ~]# sed -i s#28017#28015#g /server/mongodb/28015/conf/mongo.conf #启动新节点
[rootredis03 ~]# chown -R mongo.mongo /server/mongodb/
[rootredis03 ~]# su - mongo
[mongoredis03 ~]$ mongod -f /server/mongodb/28015/conf/mongo.conf #主库操作加入仲裁节点
dba:PRIMARY rs.addArb((10.0.0.93:28015)#查看该库是否有数据#注意五个节点时可以坏两个节点