class RedisCluster(object): def __init__(self, redis_nodes): self.cluster = StrictRedisCluster(startup_nodes=redis_nodes) # 无差别的方法 def set(self, name, value, ex=None, px=None, nx=False, xx=False): return self.cluster.set(name, value, ex, px, nx, xx) # 无差别的方法 def get(self, name): return self.cluster.get(name) # 扇形发送的命令 def cluster_info(self): return self.cluster.cluster_info() # 重写StrictRedis的方法 def mset(self, *args, **kwargs): return self.cluster.mset(args, kwargs) # 重写StrictRedis的方法 def mget(self, keys, *args): return self.cluster.mget(keys, args)
class RedisCluster(object): def __init__(self, redis_nodes): self.cluster = StrictRedisCluster(startup_nodes=redis_nodes) # 无差别的方法 def set(self, name, value, ex=None, px=None, nx=False, xx=False): return self.cluster.set(name, value, ex, px, nx, xx) # 无差别的方法 def get(self, name): return self.cluster.get(name) # 扇形发送的命令 def cluster_info(self): return self.cluster.cluster_info() # 重写StrictRedis的方法 def mset(self, *args, **kwargs): return self.cluster.mset(args, kwargs) # 重写StrictRedis的方法 def mget(self, keys, *args): return self.cluster.mget(keys, args)
def migrate(srchost, dsthost, srccluster, dstcluster, db, flush): if srchost == dsthost: print 'Source and destination must be different.' return if srccluster: source_nodes = literal_eval(srchost) source = StrictRedisCluster(startup_nodes=source_nodes, decode_responses=True) logging.debug('source cluster info: %s', source.cluster_info()) else: source = redis.Redis(srchost, db=db) if dstcluster: dest_nodes = literal_eval(dsthost) dest = StrictRedisCluster(startup_nodes=dest_nodes, decode_responses=True) logging.debug('dest cluster info: %s', dest.cluster_info()) else: dest = redis.Redis(dsthost, db=db) if flush: dest.flushdb() if srccluster: representatives = { v['cluster_my_epoch']: k for k, v in source.cluster_info().items() } size = source.dbsize() size = sum(size[reprensentative] for reprensentative in representatives.values()) else: size = source.dbsize() if size == 0: print 'No keys found.' return progress_widgets = [ '%d keys: ' % size, Percentage(), ' ', Bar(), ' ', ETA() ] pbar = ProgressBar(widgets=progress_widgets, maxval=size).start() COUNT = 2000 # scan size cnt = 0 non_existing = 0 already_existing = 0 cursor = 0 if srccluster: counter = 0 keys = [] # iterate all the keys for key in source.scan_iter(count=COUNT): counter += 1 keys.append(key) if counter % COUNT == 0: already_existing, non_existing = handle_keys( source, dest, keys, already_existing, non_existing) cnt += len(keys) pbar.update(min(size, cnt)) keys = [] # handle the remaining if len(keys) > 0: already_existing, non_existing = handle_keys( source, dest, keys, already_existing, non_existing) cnt += len(keys) pbar.update(min(size, cnt)) else: while True: cursor, keys = source.scan(cursor, count=COUNT) already_existing, non_existing = handle_keys( source, dest, keys, already_existing, non_existing) if cursor == 0: break cnt += len(keys) pbar.update(min(size, cnt)) pbar.finish() print 'Keys disappeared on source during scan:', non_existing print 'Keys already existing on destination:', already_existing
}] ''' redis cluster info for keys ''' monitor_cluster_key = [ 'cluster_state', 'cluster_slots_assigned', 'cluster_known_nodes', 'cluster_slots_fail', 'cluster_stats_messages_received', 'cluster_size', 'cluster_current_epoch', 'cluster_stats_messages_sent', 'cluster_slots_pfail', 'cluster_my_epoch', 'cluster_slots_ok' ] ''' redis-py-cluster ''' rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True) redis_cluster_info = rc.cluster_info() redis_nodes_info = rc.info() redis_nodes_config = rc.config_get() ''' redis ip and port ''' monitor_redis_node = "192.168.12.171:6379" monitor_key = "used_memory" DBsize = ["dbsize", "keys", "cluster_size"] if monitor_key in redis_nodes_config[monitor_redis_node]: print redis_nodes_config[monitor_key] elif monitor_key in monitor_cluster_key: print str(redis_cluster_info[monitor_redis_node][monitor_key]) elif monitor_key in DBsize: