mongodb复制集技术
mongodb复制结构功能
- 1、failover过程
选主
切换 - 2、是否对应用透明化
vip - 3、数据补偿的问题
两阶段数据补偿
对于mysql用的MHA+vip+binlogserver
mongodb通过复制集技术就可以很好的解决以上所有问题
不需要第三方任何的辅助软件。自己原生态支持的。基于paxos和RAFT算法,带有投票功能,一种分布算法协议。
Replcation Set配置过程详解
1、规划
三个以上的mongodb节点(或多实例)
多实例:
- 1.多个端口:29017、29018、29019、29020
- 2.多套目录:
mkdir -p /mongodb/290{17..20}/{conf,data,log} - 3.多套配置文件
touch /mongodb/290{17..20}/conf/mongod.conf - 4.配置文件
配置文件内容如下
cat /mongodb/29017/conf/mongod.conf
systemLog:
destination: file
path: /mongodb/29017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/29017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 29017
replication:
oplogSizeMB: 2048
replSetName: my_repl
复制并修改配置文件
\cp /mongodb/29017/conf/mongod.conf /mongodb/290{18..20}/conf/
//修改端口
sed 's#29017#29018#g' /mongodb/29018/conf/mongod.conf -i
sed 's#29017#29019#g' /mongodb/29019/conf/mongod.conf -i
sed 's#29017#29020#g' /mongodb/29020/conf/mongod.conf -i
//修改属主和属组
chown -R mongod:mongod /mongodb
多实例部署脚本
#!/bin/bash
id mongod &>/dev/null
if [ $? == 0 ];then
:
else
groupadd -g 800 mongod&&useradd -u 801 -g mongod
fi
a=1
for i in 290{17..20};do
[ -d /application/mongodb/$i ] && : || mkdir -p /application/mongodb/$i/{conf,data,log}
cat >/application/mongodb/$i/conf /mongodb.conf <<EOF
systemLog:
destination: file
path: /application/mongodb/$i/log/m ongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /application/mongodb/$i/dat a
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: $i
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
chown -R mongod:mongod /application/mongodb/*
done
-
5.启动多个实例备用
su - mongod mongod -f /mongodb/29017/conf/mongod. conf mongod -f /mongodb/29018/conf/mongod. conf mongod -f /mongodb/29019/conf/mongod. conf mongod -f /mongodb/29020/conf/mongod. conf
多实例命令脚本
#!/bin/bash
#chkconfig: 2345 80 90
#description:mongodb
MONGODIR=/application/mongodb
MONGOD=$MONGODIR/bin/mongod
. /etc/init.d/functions
start() {
for i in 290{17..20};do
MONGOCONF=$MONGODIR/$i/conf/mongo db.conf
su - mongod -c "$MONGOD -f $MONGOCONF"
[ $? == 0 ] && action $0 /bin/true || action $0 /bin/false
done
}
stop() {
for i in 290{17..20};do
MONGOCONF=$MONGODIR/$i/conf/mongo db.conf
su - mongod -c "$MONGOD -f $MONGOCONF --shutdown"
[ $? == 0 ] && action $0 /bin/true || action $0 /bin/false
done
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo $"Usage: $0 {start|stop|restart}"
exit 1
esac
2、配置复制集:
-
1.一主两从,从库是两个普通从库
//在primary节点进行配置操作 mongo --port 29017 //设置复制集参数信息 >use admin >config = {_id: 'my_repl', members: [ {_id: 0,host:'10.0.0.220:29017'} , {_id: 1,host:'10.0.0.220:29018'} , {_id: 2,host:'10.0.0.220:29019'} ] } //初始化复制集 >rs.initiate(config)
-
2.一主两从,有一个是arbiter(投票节点,只参与投票不参与数据复制)
>config = {_id: 'my_repl', members: [ {_id: 0, host: '10.0.0.52:29017'}, {_id: 1, host: '10.0.0.52:29018'}, {_id: 2, host: '10.0.0.52:29019',"arbiterOnly":true}] } >rs.initiate(config)
-
3、复制集测试:
my_repl:PRIMARY> db.movies.insert([ ... { "title" : "Jaws", "year" :1975,"imdb_rating" : 8.1 }, ... { "title" : "Batman", "year" :1989, "imdb_rating" : 7.6 }, ... ] ); //成功结果 BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })
切换到从库19,18或20查看
mongo --port 29018
my_repl:SECONDARY> db.movies.find().pretty();
**在mongodb复制集当中,默认从库不允许读写。**
//要打开读写功能,需要如下参数
rs.slaveOk();
my_repl:SECONDARY> db.movies.find().pretty();
-
4、复制集管理操作:
-
1.查看复制集状态:
rs.status();//查看整体复制集状态 rs.isMaster();//查看当前是否是主节点
-
2.添加删除节点
rs.add("ip:port"); //新增普通从节点 rs.addArb("ip:port"); //新增仲裁节点 rs.remove("ip:port"); //删除一个节点
注:添加特殊节点时,
1.可以在搭建过程中设置特殊节点;
2.可以通过修改配置的方式将普通从节点 设置为特殊节点;
找到需要改为延迟性同步的数组号;>config = {_id: 'my_repl', members: [ {_id: 0, host: '10.0.0.220:29017'}, {_id: 1, host: '10.0.0.220:29018'}, {_id: 2, host: '10.0.0.220:29019',"arbiterOnly":true}]}
-
3.配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf() cfg.members[2].priority=0 //members[N] //[N]代表_id号码,选择操作对象 //priority设定为0,代表不被选主,但参与投票过程 cfg.members[2].slaveDelay=120 //slaveDelay=120 //延时120秒 cfg.members[2].hidden=true //hidden=true //代表设置为隐藏节点 rs.reconfig(cfg)
-
4.更新复制集的ip或端口
cfg=rs.conf() cfg.members[0].host=[newip:port] cfg.members[1].host=[newip:port] cfg.members[2].host=[newip:port] rs.reconfig(cfg)
配置投票节点
cfg=rs.conf()
cfg.members[2].arbiterOnly=true //arbiterOnly=true,代表设置为投票节点,不复制数据
rs.reconfig(cfg)-
6.配置成功后,通过以下命令查询配置后的属性
rs.conf();
-
-
5、副本集其他操作命令:
-
查看副本集的配置信息
admin> rs.config()
-
查看副本集各成员的状态
admin> rs.status()
-
副本集角色切换(不要人为顺便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300)
//锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。-
设置副本节点可读:在副本节点执行
admin> rs.slaveOk()
例:
admin> use app switched to db app app> db.createCollection('a') { "ok" : 0, "errmsg" : "not master", "code" : 10107 }
-
查看副本节点
admin> rs.printSlaveReplicationInfo() source: 192.168.1.22:27017 syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST) 0 secs (0 hrs) behind the primary
-
复制集重点掌握内容:
1、mongodb实现过程(raft)
2、搭建
3、添加删除节点
4、节点特性设置