MongoDB/主从/副本集

2016-09-10  本文已影响1599人  米刀灵

主从复制:
主节点写入数据,从通过读取主的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。oplog是一个特殊的固定大小的collection,固定大小意味着,新的操作记录的写入会导致最老的操作记录的删除,以保证oplog的大小。这个值如果不去设置,会自动根据硬盘大小的5%来设定。
Local库容量设置。我们知道Local库主要存放oplog,oplog用于数据的同步和复制,oplog同样要消耗内存的,因此选择一个合适的oplog值很重要。
如果是高插入高更新,并带有延时从库的副本集需要一个较大的oplog值(比如50G);如果没有延时从库,并且数据更新速度不频繁,则可以适当调小oplog值(比如5G)。总之,oplog值大小的设置取决于具体业务应用场景。
master启动配置文件:

port=27018 #指定端口
fork=true #后台运行
dbpath=/home/map/mongodb/data #规定数据库的位置
logpath=/home/map/mongodb/logs/mongodb.log #规定数据库的日志文件
master=true #设置主
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
nohttpinterface=true #禁止http访问

slave启动配置文件:

port=27018 #指定端口
fork=true #后台运行
dbpath=/home/map/mongodb/mongo #规定数据库的位置
logpath=/home/map/mongodb/mlog/mongodb.log #规定数据库的日志文件
slave=true #声明从
source=192.168.0.4:27018 #规定从属于哪个ip  注意:ip是主服务器的  最好用内网ip
# bind_ip=127.0.0.1,192.168.0.4 #允许的地址 为了安全
nohttpinterface=true #禁止http访问

测试:

测试 主执行
use word
db.wsd.save({name:”aaa”})
db.wsd.find()

在从服务器执行
show dbs;
local  0.078GB
word   0.078GB  #如果出现主的数据  说明同步成功
use word
db.wsd.find()  #查到数据说明同步成功
{ “_id” : ObjectId(“55cc43470278a3d7b1c6f2c0″), “name” : “aaa” }

主从复制的其他设置项:

动态的添加或删除从节点:
我们在我们上面的从节点的local数据库中,存在一个集合sources。这个集合就保存了我这个服务器的主服务器。


挂接主服务:
db.sources.insert({“host”:”127.0.0.1:8888”})
删除已经挂接的主节点:
db.sources.remove({“host”:”127.0.0.1:8888”})

副本集:

配置文件:

port=27018 #指定端口
fork=true #后台运行
dbpath=/home/map/mongodb/data #规定数据库的位置
logpath=/home/map/mongodb/logs/mongodb.log #规定数据库的日志文件
replSet=replSetName #设置副本集的名字,同一个副本集成员都用一样的名字

登录验证:
当你的MongoDB启用了身份验证时,在多节点环境(副本、分片)下,mongoDB强制副本成员必要提供节点间验证的凭证才能相互通信。
在初始化节点

openssl rand -base64 21 > /usr/local/mongodb/keyfile
chmod 600 /usr/local/mongodb/keyfile

把keyfile文件复制到所有节点的/usr/local/mongodb/keyfile目录下,修改文件权限为600
在上面的配置文件里添加

auth=true
keyFile=/usr/local/mongodb/keyfile

初始化:

config={"_id":"replSetName",
     "members":[
         {"_id":0,"host":"ip1:port1","priority":1},  
         {"_id":1,"host":"ip2:port2","priority":1},  
         {"_id":2,"host":"ip3:port3","priority":1},  
     ]
}
rs.initiate(config);//初始化副本集就完成了
//"_id": 副本集的名称
//"members": 副本集的服务器列表
//"_id": 服务器的唯一ID
//"host": 服务器主机
//"priority": 是优先级,默认为1,优先级0为被动节点,不能成为活跃节点。//优先级不位0则按照有大到小选出活跃节点。
//"arbiterOnly": true/false 仲裁节点,只参与投票,不接收数据,也不能成为活跃节点。
//buildIndexes: 是否可以建立索引
//slaveDelay:延迟多长时间开始复制最新数据

增删节点:
在活跃的主机上

rs.status()
//查看副本集状态
rs.add("ip:port")
//删除副本
rs.remove("ip:port")
//查看配置
rs.config()
#重新加载配置文件,强制了副本集进行一次选举,优先级高的成为Primary。
cfg=rs.conf()
cfg.members[1].priority=2
rs.reconfig(cfg)

读写分离:
读写分离是通过修改程序的driver的,应用程序驱动通过read reference来设定如何对副本集进行读取操作,默认的,客户端驱动所有的读操作都是直接访问Primary节点。


参考 :
http://www.cnblogs.com/qiyebao/p/5157615.html
http://www.cnblogs.com/zhoujinyi/p/3554010.html
http://www.jianshu.com/p/5b97ec07a279

上一篇 下一篇

猜你喜欢

热点阅读