MongoDB副本集replica set部署

Replication Set概述

  • MongoDB中的副本集是一组维护相同数据集合的 mongod进程,副本集提供了冗余和高可用性。
  • 通过维护冗余的数据副本,能够实现数据的备份,读写分离和自动故障转移。

image

1.环境准备

三个以上的mongodb节点(或多实例)

1.1 多实例环境准备

以mongodb3.6.21为例

1.2 多个端口:

28017、28018、28019、28020

1.3 多套目录:

mkdir -p /data/mongodb/{28017,28018,28019,28020}/{data,conf,log}

1.4 多套配置文件:

/mongodb/{28017,28018,28019,28020}/conf/mongod.conf

1.5 配置文件内容:

cat > /data/mongodb/28017/conf/mongod.conf <<EOF
systemLog:
  destination: file
  path: /data/mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /data/mongodb/28017/data
  directoryPerDB: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 0.0.0.0
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: easydb
EOF

1.6 修改相应配置文件值

\cp  /data/mongodb/28017/conf/mongod.conf  /data/mongodb/28018/conf/
\cp  /data/mongodb/28017/conf/mongod.conf  /data/mongodb/28019/conf/
\cp  /data/mongodb/28017/conf/mongod.conf  /data/mongodb/28020/conf/


sed  -i 's#28017#28018#g' /data/mongodb/28018/conf/mongod.conf
sed  -i 's#28017#28019#g' /data/mongodb/28019/conf/mongod.conf
sed  -i 's#28017#28020#g' /data/mongodb/28020/conf/mongod.conf

1.7 修改目录属主

chown -R mongo. /data/mongodb

1.8 启动多个实例

mongod -f /data/mongodb/28017/conf/mongod.conf
mongod -f /data/mongodb/28018/conf/mongod.conf
mongod -f /data/mongodb/28019/conf/mongod.conf
mongod -f /data/mongodb/28020/conf/mongod.conf

1.9 查看端口状态

[root@sandbox ~]# netstat -lnp|grep 280
tcp        0      0 0.0.0.0:28017           0.0.0.0:*               LISTEN      1609/mongod         
tcp        0      0 0.0.0.0:28018           0.0.0.0:*               LISTEN      1642/mongod         
tcp        0      0 0.0.0.0:28019           0.0.0.0:*               LISTEN      1671/mongod         
tcp        0      0 0.0.0.0:28020           0.0.0.0:*               LISTEN      1700/mongod         
unix  2      [ ACC ]     STREAM     LISTENING     22882    1642/mongod          /tmp/mongodb-28018.sock
unix  2      [ ACC ]     STREAM     LISTENING     22887    1671/mongod          /tmp/mongodb-28019.sock
unix  2      [ ACC ]     STREAM     LISTENING     24735    1609/mongod          /tmp/mongodb-28017.sock
unix  2      [ ACC ]     STREAM     LISTENING     22894    1700/mongod          /tmp/mongodb-28020.sock

2.MongoDB副本集构建

2.1 副本集成员

MongoDB副本集主要有三种成员:
Primary:主节点
Secondaries:从节点
Arbiter:仲裁节点,可选。

2.2 PSS副本集架构

PSS架构:

“一主多从”架构,如果主节点不可用,则符合条件的次要节点将进行选举以自行选举新的主要节点。
image

# 登陆一台mongo实例
mongo --port 28017 admin

# 将副本集中信息定义成一个变量
# 'easydb'和配置文件中'replSetName'定义要一致
config = {_id: 'easydb', members: [
                          {_id: 0, host: '192.168.80.61:28017'},
                          {_id: 1, host: '192.168.80.61:28018'},
                          {_id: 2, host: '192.168.80.61:28019'}]
          }    

# 进行初始化操作		  
rs.initiate(config) 
示例:
> config = {_id: 'easydb', members: [
...                           {_id: 0, host: '192.168.80.61:28017'},
...                           {_id: 1, host: '192.168.80.61:28018'},
...                           {_id: 2, host: '192.168.80.61:28019'}]
...           }  
{
	"_id" : "easydb",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.80.61:28017"
		},
		{
			"_id" : 1,
			"host" : "192.168.80.61:28018"
		},
		{
			"_id" : 2,
			"host" : "192.168.80.61:28019"
		}
	]
}
> 
> rs.initiate(config)
{
	"ok" : 1,
	"operationTime" : Timestamp(1610101818, 1),
	"$clusterTime" : {
		"clusterTime" : Timestamp(1610101818, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	}
}
easydb:SECONDARY> 
easydb:SECONDARY> 
easydb:SECONDARY> 
easydb:PRIMARY> 
easydb:PRIMARY> 
easydb:PRIMARY> 

查询复制集状态

rs.status();

2.3 PSA副本集架构

PSA架构:

在某些情况下(例如只有一个主服务器和一个辅助服务器,一个仲裁器),一个mongodb实例作为仲裁器添加到副本集,仲裁节点参加选举,但是不保存数据。
image

mongo -port 28017 admin

config = {_id: 'easydb', members: [
                          {_id: 0, host: '192.168.80.61:28017'},
                          {_id: 1, host: '192.168.80.61:28018'},
                          {_id: 2, host: '192.168.80.61:28019',"arbiterOnly":true}]
          }   

rs.initiate(config) 

3.复本集管理操作

3.1 副本集相关命令

rs.help()                   #查看副本集相关帮助
rs.initiate()               #使用默认配置初始化副本集
rs.initiate(cfg)            #使用配置文件cfg初始化副本集
rs.reconfig(cfg)            #修改副本集配置信息
rs.status()                 #查看副本集状态
rs.conf()                   #查看副本集配置
rs.add(hostportstr)         #添加新的节点 
rs.addArb(hostportstr)      #添加仲裁节点
rs.remove(hostportstr)      #删除节点
rs.secondaryOk()                #允许副本节点只读,默认副本节点不允许读写
rs.isMaster()               #查看哪个节点为主节点
rs.printReplicationInfo()   #查看oplog大小以及oplog可用时间,可以判断系统繁忙程度
rs.printSlaveReplicationInfo()              #查看复制集成员以及延迟
rs.stepDown([stepdownSecs, catchUpSecs])    #手动主从切换
rs.freeze(secs)             #冻结当前节点在指定的时间内(秒)不能选举为主
rs.syncFrom(hostportstr)    #管理员临时覆盖当前成员的默认同步目标。以[hostname]:[port]的形式指定要复制的成员的名称。

3.2 添加删除节点

rs.remove("ip:port");   #删除一个节点
rs.add("ip:port");      #新增从节点
rs.addArb("ip:port");   #新增仲裁节点
示例

添加 arbiter节点

1. 连接到主节点
[root@sandbox ~]# mongo --port 28017 admin
2. 添加仲裁节点
easydb:PRIMARY> rs.addArb("192.168.80.61:28020")
3. 查看节点状态
easydb:PRIMARY> rs.isMaster()
{
	"hosts" : [
		"192.168.80.61:28017",
		"192.168.80.61:28018",
		"192.168.80.61:28019"
	],
	"arbiters" : [
		"192.168.80.61:28020"
	],

删除一个节点

easydb:PRIMARY> rs.remove("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()

新增一个节点

easydb:PRIMARY> rs.add("192.168.80.61:28019")
easydb:PRIMARY> rs.isMaster()

4.特殊从节点

介绍:

  • arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
  • hidden节点:隐藏节点,不参与选主,也不对外提供服务。
  • delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)

4.1 配置延时节点

一般情况下会将delay+hidden一起配置使用
image

cfg=rs.conf() 
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=3600
rs.reconfig(cfg)    


取消以上配置
cfg=rs.conf() 
cfg.members[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)    

配置成功后,通过以下命令查询配置后的属性
rs.conf(); 

		{
			"_id" : 4,
			"host" : "192.168.80.61:28019",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : true,
			"priority" : 0,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(3600),
			"votes" : 1
		}

注意:members[3],中括号里面的3是副本集索引的节点,从0开始往下计数,如果做过删除节点操作,就和conf里面对应的"_id"号不一致

因为有悔,所以披星戴月;因为有梦,所以奋不顾身! 个人博客首发:easydb.net 微信公众号:easydb 关注我,不走丢!

image

posted @ 2021-01-08 20:37  easydba  阅读(353)  评论(0编辑  收藏  举报