':param objs: the objects
:return: a tuple with two dicts,
the first is the mapping from the node address to the belonged objects,
the second is the mapping from the backup node address and the objects'

def distribute(self, objs):

    node_objs = defaultdict(list)
    backup_node_objs = defaultdict((lambda : defaultdict(list)))
    if (isinstance(objs, basestring) or (not iterable(objs))):
        objs = [objs]
    for obj in objs:
        str_ = labelize(obj)
        it = self.hash_ring.iterate_nodes(str_)
        put_node = next(it)
        node_objs[put_node].append(obj)
        for _ in xrange(self.copies):
            backup_node = next(it)
            if (backup_node is None):
                continue
            backup_node_objs[backup_node][put_node].append(obj)
    return (node_objs, backup_node_objs)
