mongodb主从/副本集

主从复制:
主节点写入数据,从通过读取主的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” }

主从复制的其他设置项:

  • only 从节点指定复制某个数据库,默认是复制全部数据库
  • slavedelay 从节点设置主数据库同步数据的延迟(单位是秒)
  • fastsync 从节点以主数据库的节点快照为节点启动从数据库
  • autoresync 从节点如果不同步则从新同步数据库(即选择当通过热添加了一台从服务器之后,从服务器选择是否更新主服务器之间的数据)
  • oplogSize 主节点设置oplog的大小(主节点操作记录存储到local的oplog中)

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

 
 

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

 

副本集:

  • 通常在部署 MongoDB 时, 哪怕目前只用到一个实例, 但为了方便扩展也可以将其部署为一个只有一个成员的副本集. 这样扩展规模时就不需要停机创建副本集而直接添加成员即可。
  • 副本集没有特定的主数据库。如果哪个Primary数据库宕机了,集群中就会推选出一个从属库作为主库。原来的Primary库恢复后成为从属库。
  • 在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。所以最小的副本集也应该具备一个primary节点和两个secondary节点。两个节点的副本集不具备真正的故障转移能力。
  • 副本集要求参与选举投票(vote)的节点数为奇数,当我们只有两个(或偶数)的节点参与仲裁,这时需引入仲裁者(arbiter)。因为偶数情况下如果打成平局,那么每个成员都需要再等待30秒才能开始下一次选举。
  • 最大50节点,但是只能有7个投票节点,其他是non-voting节点。
  • 当集群中有1个primary节点,1个secondary节点和1个arbit节点,如果primary节点挂了,secondary节点也会自动成为primary节点。利用仲裁节点可以实现最少的机器开销达到两个节点热备的效果。
  • 挑有数据的机器进行初始化,如果一个副本集有大于一台机器有数据则不能创建副本集。
  • 默认情况下,Secondary是不提供服务的,即不能读和写。在特殊情况下需要读的话则需要:rs.slaveOk() ,只对当前连接有效。

配置文件:

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节点。

  • primary
    主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
  • primaryPreferred
    首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
  • secondary
    从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
  • secondaryPreferred
    首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
  • nearest
    最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。




链接:https://www.jianshu.com/p/36e331f5fd7c

posted @ 2020-04-26 15:52  罐头1992  阅读(195)  评论(0编辑  收藏  举报