swift-container源码阅读

containerserver:
 
run_wsgi-->run_server-->loadwsgi.loadapp-->app_factory
 
wsgi会在收到http请求之后调用ContainerController.__call__
 
__call__中根据http请求头部的方法类型来决定调用相应的处理函数:PUT,POST,GET,HEAD,DELETE,REPLICA
 
需要注意的是,__call__方法在处理请求时,先会检查配置文件中的replication配置项,如果配置项没有被设置,那么该节点可以处理上面提到的所有请求,如果配置项被设置为true或者false,要么只能处理REPLICA请求,要么只能处理其他请求
 
DELETE操作,涵盖删除object和删除container,删除object是向container中新加一个带delete标记的对象,并删除之前记录的相同name的条目,同步时也是执行merge_items,同样会执行相同的操作
 
REPLICA方法调用ReplicatorRpc类的dispatch方法处理不同的副本请求
 
sync方法,同步containerdb的replicationinfo(副本的元信息,创建点,创建时间,删除时间等),不包含数据库内容
 
merge_sync方法:根据参数选择更新两个表,incoming和outgoing,更新内容是sync_point和remote_id
 
merge_items方法:数据库记录通过http请求发送,合并每条请求
 
complete_rsync方法:用rsync同步过来的新数据库文件覆盖旧文件
 
rsync_then_merge方法:将本地已有的数据库的内容合并到通过rsync通过过来的新数据库中
 
replicator:
 
run_daemon-->Replicator-->run_forever-->run_once
 
首先获取本机ip,遍历ring.devs,node的ip和本机相同的,是配置在本机的虚拟节点
 
乱序处理每个虚拟节点的containerdb文件,
 
存储结构:
 
datadir----partitions----suffix---file_db
    |             |         |--file_db
    |             |---suffix
    ----partitions----suffix
    |
    |             |---suffix
 
run_once-->_replicate_object-->
 
在_replicate_object中根据account和container信息重新计算所属part,如果不相同,应该replica到其他part,并删除本地记录,删除的时候有一个判断条件小于created_at
 
当delete_time大于put_time加上超时时间,并且container已经没有内容时,删除db文件
 
根据partition获取所有关联的node,除了自己所在的node外,其他都作为副本node,调用_repl_to_node更新副本到其他node
 
_repl_to_node过程,先执行sync请求,交换副本的状态信息,根据sync操作返回值来判断,如果replnode没有副本文件,则直接调用_rsync_db同步整个db文件
 
如果返回的值在>=200并且<=300,判断replnode返回的已经更新的最新数据库编号是否和本地记录的更新到该replnode的数据库编号是否相同,如果相同,则说明两个文件已经同步,或者判断hash值是否相同,hash值相同但是记录的id不同则修改本地记录的已经同步到该replnode的数据库id
 
如果本地记录最大id已经大于replnode记录id的两倍,则用rsync把本地文件全部同步过去,并把replnode的文件合并到新文件中,
 
如果本地记录最大id小雨replnode记录id的两倍,则发送同步点之后的内容到replnode
 
ContainerAuditor:
 
定期扫描container数据文件,如果文件格式错误,错误值加1,并保存在container.recon文件中
 
ContainerUpdater:定期汇报本机中,container的信息,包括更新时间,object_count,bytes_used等等
 
run_forever函数中fork多个子进程,每个子进程调用container_sweep-->process_container-->container_report
 
在container_report针对每个db文件启动一个协程,更新成功之后,本地数据库要记录更新的时间
 
ContainerSync:
 
 
run_forever-->container_sync (path)
 
sync_point1,该containerdb中最大记录号
sync_point2,该containerdb中已经全部同步完成的记录号
 
 
 
每个副本点的sync第一次执行时,只同步db文件中的一部分,计算方式:
 
 
 
hash值对总的node个数取模,和本node索引相同的,由本node点进行同步,修改sync_point1
 
下一次执行sync时,从sync_point2执行到sync_point1,因为已经由部分在远端执行过了,所以能够快速执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值