mongodb高可用RS的实现

介绍

mongodb RS 可以实现无损复制,一条命令就可以构建一个集群,非常简单,它的多个节点数据的一致性,主从之间无延迟,实时同步,是一种分布式的架构。

基本原理

1主2从总共3个mongo节点,内部是自带监控投票机制,主库发生宕机的话,从库竞争结果主库,因为数据是时时同步的,不存在数据补偿,像MAK这种 mongo集群有两种方案:
第一种:1主2从,主分别像两个从复制
第二种:1主1从1个arbiter(仲裁节点)
第二种主库只向一个从库复制数据,仲裁节点无数据,只负责投票,可以减轻主库压力,另外同时仲裁节点机器的配置一般就可以。、

节点类型

PRIMARY 主节点 SECONDARY 从节点 ARBITER 仲裁节点 HIDDEN 隐藏节点 Delayed 延时节点

部署

这里采用的是多个实例来实现,配置文件是生产上的配置,直接改下端口就可以用。
1、端口设定
30001,30002,30003,30004
2、目录创建

mkdir -p /opt/modules/mongodb/30001/{conf,data,log}
mkdir -p /opt/modules/mongodb/30002/{conf,data,log}
mkdir -p /opt/modules/mongodb/30003/{conf,data,log}
mkdir -p /opt/modules/mongodb/30004/{conf,data,log}

3、配置文件设定

# 写入配置文件
cat > /opt/modules/mongodb/30001/conf/mongod.conf << EOF
systemLog:
    destination: file
    path: /opt/modules/mongodb/30001/log/mongodb.log
    logAppend: true
storage:
    journal:
        enabled: true
    dbPath: "/opt/modules/mongodb/30001/data"
    directoryPerDB: true
    wiredTiger:
        engineConfig:
            cacheSizeGB: 1
            directoryForIndexes: true
        collectionConfig:
            blockCompressor: zlib
        indexConfig:
            prefixCompression: true
processManagement:
    fork: true
net:
    port: 30001
    bindIp: 192.168.3.66,127.0.0.1 
replication:
    oplogSizeMB: 2048
    replSetName: my_repl
EOF 

# 复制到多个文件夹
\cp /opt/modules/mongodb/30001/conf/mongod.conf /opt/modules/mongodb/30002/conf/
\cp /opt/modules/mongodb/30001/conf/mongod.conf /opt/modules/mongodb/30003/conf/  
\cp /opt/modules/mongodb/30001/conf/mongod.conf /opt/modules/mongodb/30004/conf/ 

# 替换端口
sed -i 's#30001#30002#g' /opt/modules/mongodb/30002/conf/mongod.conf
sed -i 's#30001#30003#g' /opt/modules/mongodb/30003/conf/mongod.conf
sed -i 's#30001#30004#g' /opt/modules/mongodb/30004/conf/mongod.conf    

3、启动多实例

mongod -f /opt/modules/mongodb/30001/conf/mongod.conf
mongod -f /opt/modules/mongodb/30002/conf/mongod.conf
mongod -f /opt/modules/mongodb/30003/conf/mongod.conf
mongod -f /opt/modules/mongodb/30004/conf/mongod.conf

复制集配置:

配置3台节点

# 进入admin库
mongo --port 30001 admin
# 设置变量
config = {_id: 'my_repl', members:[
            {_id: 0, host: "192.168.3.66:30001"},
            {_id: 1, host: "192.168.3.66:30002"},
            {_id: 2, host: "192.168.3.66:30003"},]
        }
# 初始化
rs.initiate(config)
# 创建成功后会改变前面的 '>' 变为
my_repl:PRIMARY>
# 查看状态
rs.status()   

添加仲裁节点

第一种是在构建复制集的时候,指定arbiter仲裁节点的方式,只需要在构建时指定节点后加入即可。 "arbiterOnly":true
{_id: 2, host: "192.168.3.66:30003","arbiterOnly":true}

第二种是在已有的复制集新增一个仲裁节点

# 添加节点示例
# 1.连接到主节点
mongo --port 30001 admin
# 2.添加仲裁节点
my_repl:PRIMARY> rs.addArb("192.168.3.66:30004")
# 3.查看节点状态
my_repl:PRIMARY> rs.isMaster()
{
	"hosts" : [
		"192.168.3.66:30001",
		"192.168.3.66:30002",
		"192.168.3.66:30003"
	],
	"arbiters" : [
		"192.168.3.66:30004"
	],

特殊节点Hidden,Delay

主要用于意外情况的数据恢复。 Hidden 隐藏节点: 不提供服务,不参与选主 Delay 延时节点,数据落后主库一段时间,因为数据延时,所以也不提供服务和选主,一般会讲Hidden和Delay一起配置使用。

配置方式

有一点需要注意,memmbers[2],2代表的是第三个节点,因为我这里总共有4个节点,下标是从0开始的。

# priority   -- 0不参与选主
# hidden     -- 隐藏,不参与对外提供服务
# slaveDelay -- 延时,单位秒
cfg=rs.conf()
cfg.members[2].priority=0   
cfg.members[2].hidden=true  
cfg.members[2].slaveDelay=120   
rs.reconfig(cfg)

取消配置再把数值改回即可。

复制集管理相关命令

rs.status() //查看复制集状态
rs.isMaster() //查看当前是否是主节点
rs.conf()       //查看复制集配置信息

rs.remove("ip:port")    //删除一个几点
rs.add("ip:port")       //新增从节点
rs.addArb("ip:port")    //新增仲裁节点
rs.slaveOK()            //打开从库读功能

# 查看主从延时状态
rs.printSlaveReplicationIno()


注意

从节点默认是不可读写的,可以通过rs.slaveOK()打开从库的读功能。