分享

Swift源码分析----swift-container-replicator

tntzbzc 发表于 2014-11-20 15:34:46 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 0 11765
问题导读

1._replicate_object:复制指定分区数据到指定节点(用以实现数据副本之间的同步)有哪些步骤?
2.for node in self.ring.devs:从环上获取所有设备,遍历并执行哪些操作?






概述部分:
实现复制指定分区(容器)数据到指定节点(用以实现数据副本之间的同步);
这里定义的once=True,说明系统默认调用守护进程类Daemon中的run_once方法;
从而最终实现调用Replicator类中的run_once方法;
注:容器之间同步数据主要就是对形如object_file = /srv/node/node['device']/containers/partition/suffix/hsh****.db的数据库文件执行复制操作;
源码解析部分:
下面是这部分代码的主要执行流程,代码中较重要的部分已经进行了相关的注释;
  1. from swift.container.replicator import ContainerReplicator
  2. from swift.common.utils import parse_options
  3. from swift.common.daemon import run_daemon
  4. if __name__ == '__main__':
  5.     conf_file, options = parse_options(once=True)
  6.     run_daemon(ContainerReplicator, conf_file, **options)
复制代码

  1. from swift.container.backend import ContainerBroker, DATADIR
  2. from swift.common import db_replicator
  3. class ContainerReplicator(db_replicator.Replicator):
  4.     server_type = 'container'
  5.     brokerclass = ContainerBroker
  6.     datadir = DATADIR
  7.     default_port = 6001
  8.     def report_up_to_date(self, full_info):
  9.         for key in ('put_timestamp', 'delete_timestamp', 'object_count',
  10.                     'bytes_used'):
  11.             if full_info['reported_' + key] != full_info[key]:
  12.                 return False
  13.         return True
复制代码
  1. class Replicator(Daemon)----def run_once(self, *args, **kwargs):
  2.     """
  3.     实现复制指定分区数据到指定节点(用以实现数据副本之间的同步);
  4.     数据类型可能是account或container或object;
  5.     """
  6.         
  7.     # 初始化若干参数的操作;
  8.     # self.stats = {'attempted': 0, 'success': 0, 'failure': 0, 'ts_repl': 0,
  9.     #              'no_change': 0, 'hashmatch': 0, 'rsync': 0, 'diff': 0,
  10.     #              'remove': 0, 'empty': 0, 'remote_merge': 0,
  11.     #              'start': time.time(), 'diff_capped': 0}
  12.     self._zero_stats()
  13.     dirs = []
  14.     ips = whataremyips()
  15.     if not ips:
  16.         self.logger.error(_('ERROR Failed to get my own IPs?'))
  17.         return
  18.         
  19.     # 获取环上的设备信息;
  20.     for node in self.ring.devs:
  21.         if (node and node['replication_ip'] in ips and node['replication_port'] == self.port):
  22.             if self.mount_check and not ismount(os.path.join(self.root, node['device'])):
  23.                 self.logger.warn(_('Skipping %(device)s as it is not mounted') % node)
  24.                     continue
  25.                
  26.             # 删除若干过期文件;
  27.             unlink_older_than(
  28.                 os.path.join(self.root, node['device'], 'tmp'),
  29.                 time.time() - self.reclaim_age)
  30.                
  31.             datadir = os.path.join(self.root, node['device'], self.datadir)
  32.             if os.path.isdir(datadir):
  33.                 dirs.append((datadir, node['id']))
  34.         
  35.     self.logger.info(_('Beginning replication run'))
  36.     for part, object_file, node_id in roundrobin_datadirs(dirs):
  37.             
  38.          # _replicate_object:复制指定分区数据到指定节点(用以实现数据副本之间的同步),具体步骤如下;
  39.          #     获取指定分区所在的所有节点nodes(一个分区可能对应多个节点,因为可能有多个副本);
  40.          #     判断node_id是否在nodes的范围之内(这是合理的);
  41.          #     循环实现数据到各个目标节点上(的分区)的复制操作;
  42.          #     通过比较同步点和哈希值来判断复制后的两个版本是否是同步的,即复制操作是否成功;
  43.         self.cpool.spawn_n(self._replicate_object, part, object_file, node_id)
  44.     self.cpool.waitall()
  45.     self.logger.info(_('Replication run OVER'))
  46.     self._report_stats()
复制代码


1.for node in self.ring.devs:从环上获取所有设备,遍历并执行以下操作:
通过IP地址判断并获取属于本机的且已经挂载的设备,并存储设备对应的datadir = /srv/node/node['device']/containers和node['id']作为元素储存在字典dirs中;
注:这里实际上就是获取属于本机的设备,且明确文件路径/srv/node/node['device']/containers(对应于容器);
2.循环遍历node['device']/containers下面的每一个文件object_file(文件路径形如object_file = /srv/node/node['device']/containers/partition/suffix/hsh****.db,为容器中具体分区下的以.db为后缀的文件),调用方法_replicate_object实现复制本地指定分区数据到指定节点(用以实现数据副本之间的同步);
注:其他部分的内容实现与swift-account-replicator的实现是一致的,所以这里不再进行赘述;





博客地址:http://blog.csdn.net/gaoxingnengjisuan
邮箱地址:dong.liu@siat.ac.cn





没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条