阅读量:0
本站以分享各种运维经验和运维所需要的技能为主
《python零基础入门》:python零基础入门学习
《python运维脚本》: python运维脚本实践
《shell》:shell学习
《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战
《k8》暂未更新
《docker学习》暂未更新
《ceph学习》ceph日常问题解决分享
《日志收集》ELK+各种中间件
《运维日常》运维日常
《linux》运维面试100问
一、副本集的搭建
0.介绍副本集
#官网的参考地址 https://docs.mongodb.com/manual/replication/ # Mongodb副本集介绍: Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。 Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,实现数据的高可用。 # 副本集作用: 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。 读写分离,读的请求分流到副本上,减轻主节点的读压力。 # 副本集角色介绍: 主节点(Primary) 接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。 默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。 副本节点(Secondary) 与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。 仲裁者(Arbiter) 不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。 # 注意: 在PSS典型架构中(Replica Set)节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策。 在PSA架构中,需要偶数个数据节点,加一个Arbiter构成的Replica Set
PSS 典型副本集架构(读写操作都由主处理,从只负责同步)
PSA(Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set)
1.创建多实例目录
[root@redis03 ~]# mkdir /server/mongodb/2801{7,8,9}/{conf,logs,pid,data} -p
2.编辑多实例配置文件
[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,10.0.0.93 replication: #类似于binlog,指定大小 oplogSizeMB: 1024 #副本记得名称,集群名称 replSetName: dba
3.启动多实例
[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 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.登录多实例
[mongo@redis03 ~]$ mongo 10.0.0.93:28017 [mongo@redis03 ~]$ mongo 10.0.0.93:28018 [mongo@redis03 ~]$ 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 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.93:28018 syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (CST) 0 secs (0 hrs) behind the primary source: 10.0.0.93:28019 syncedTo: Wed May 27 2020 23:54:19 GMT+0800 (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.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()
二、副本集实现高可用
1.故障切换测试
#主库使用 localhost 连接,执行关闭数据库的操作(使用ip连接是不能执行的) [root@db01 ~]# 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> 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)
三、扩容与删减节点
1.配置一台新的节点
#创建目录 [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
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.添加仲裁节点
# 仲裁节点说明: 不存储数据,只进行选主。 #创建目录 [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.93:28015") #查看该库是否有数据 #注意,五个节点时,可以坏两个节点