Exemple #1
0
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)