class RedisBase: def __init__(self, node=None, port=None): self.port = port self.node = node self.db = '/var/sockets/redis/redis.sock' if node and port: self.redis = Redis(host=node, port=port, socket_connect_timeout=1.0) elif node: self.redis = Redis(host=node, socket_connect_timeout=1.0) else: self.redis = Redis(unix_socket_path=self.db, socket_connect_timeout=1.0) def get_master(self, node=None): """ return the master node of the redis cluster or query the given node :return: Name or False in case of failure """ try: if node: redis = Redis(host=node, socket_connect_timeout=1.0) else: redis = self.redis redis_info = redis.info() if redis_info.get('role') == 'master': if node: return node else: return get_hostname() elif redis_info.get('role') == 'slave': return redis_info.get('master_host') except Exception as e: logger.error("RedisBase::get_master: {}".format(str(e))) return None return False def slave_of(self, node, port): """ Make the current redis node a slave of the specified one :param node: IP address of an existing master node :param port: TCP port of the master node :return: """ return self.redis.slaveof(node, port) def config_set(self, key, value): return self.redis.config_set(key, value) def config_rewrite(self): return self.redis.config_rewrite() def sentinel_monitor(self): """ Dynamically configure sentinel to monitor the local redis node. WARNING: FOr sentinel to work properly, self.node is supposed to be an IP address) :param node: IP address of an existing node :return: False if we are not connected to sentinel """ if not self.node or not self.port or self.port != 26379: return False return self.redis.sentinel_monitor('mymaster', self.node, 6379, 1)