From e8983283da4198d84d91be53b13bcb2e50515726 Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Mon, 16 Nov 2015 16:52:50 +0100 Subject: [PATCH] Redis connection get from sentinel master --- .../extension/sql/0.0.1/11_redis_helper.sql | 50 ++++++++++++------- .../cartodb_geocoder/redis_helper.py | 20 ++++---- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/server/extension/sql/0.0.1/11_redis_helper.sql b/server/extension/sql/0.0.1/11_redis_helper.sql index 7c7791b..e6dda61 100644 --- a/server/extension/sql/0.0.1/11_redis_helper.sql +++ b/server/extension/sql/0.0.1/11_redis_helper.sql @@ -1,23 +1,12 @@ --- Get the connection to redis from cache or create a new one -CREATE OR REPLACE FUNCTION cdb_geocoder_server._connect_to_redis(user_id name) -RETURNS boolean AS $$ - if user_id in GD and 'redis_connection' in GD[user_id]: - return False - else: - from cartodb_geocoder import redis_helper - config_params = plpy.execute("select c.host, c.port, c.timeout, c.db from cdb_geocoder_server._get_redis_conf() c;")[0] - redis_connection = redis_helper.RedisHelper(config_params['host'], config_params['port'], config_params['db']).redis_connection() - GD[user_id] = {'redis_connection': redis_connection} - return True -$$ LANGUAGE plpythonu; - CREATE TYPE cdb_geocoder_server._redis_conf_params AS ( - host text, - port int, - timeout float, - db text + sentinel_host text, + sentinel_port int, + sentinel_master_id text, + redis_db text, + timeout float ); +-- Get the Redis configuration from the _conf table -- CREATE OR REPLACE FUNCTION cdb_geocoder_server._get_redis_conf() RETURNS cdb_geocoder_server._redis_conf_params AS $$ conf = plpy.execute("SELECT cdb_geocoder_server._config_get('redis_conf') conf")[0]['conf'] @@ -26,5 +15,30 @@ RETURNS cdb_geocoder_server._redis_conf_params AS $$ else: import json params = json.loads(conf) - return { "host": params['host'], "port": params['port'], 'timeout': params['timeout'], 'db': params['db'] } + return { + "sentinel_host": params['sentinel_host'], + "sentinel_port": params['sentinel_port'], + "sentinel_master_id": params['sentinel_master_id'], + "timeout": params['timeout'], + "redis_db": params['redis_db'] + } +$$ LANGUAGE plpythonu; + +-- Get the connection to redis from cache or create a new one +CREATE OR REPLACE FUNCTION cdb_geocoder_server._connect_to_redis(user_id name) +RETURNS boolean AS $$ + if user_id in GD and 'redis_connection' in GD[user_id]: + return False + else: + from cartodb_geocoder import redis_helper + config_params = plpy.execute("""select c.sentinel_host, c.sentinel_port, + c.sentinel_master_id, c.timeout, c.redis_db + from cdb_geocoder_server._get_redis_conf() c;""")[0] + redis_connection = redis_helper.RedisHelper(config_params['sentinel_host'], + config_params['sentinel_port'], + config_params['sentinel_master_id'], + timeout=config_params['timeout'], + redis_db=config_params['redis_db']).redis_connection() + GD[user_id] = {'redis_connection': redis_connection} + return True $$ LANGUAGE plpythonu; \ No newline at end of file diff --git a/server/lib/python/cartodb_geocoder/cartodb_geocoder/redis_helper.py b/server/lib/python/cartodb_geocoder/cartodb_geocoder/redis_helper.py index 013ac9d..27d4800 100644 --- a/server/lib/python/cartodb_geocoder/cartodb_geocoder/redis_helper.py +++ b/server/lib/python/cartodb_geocoder/cartodb_geocoder/redis_helper.py @@ -1,20 +1,20 @@ -import redis +from redis.sentinel import Sentinel class RedisHelper: REDIS_DEFAULT_USER_DB = 5 - REDIS_DEFAULT_HOST = 'localhost' - REDIS_DEFAULT_PORT = 6379 + REDIS_TIMEOUT = 2 #seconds - def __init__(self, host, port=REDIS_DEFAULT_PORT, db=REDIS_DEFAULT_USER_DB): - self.host = host - self.port = port - self.db = db + def __init__(self, sentinel_host, sentinel_port, sentinel_master_id, redis_db=REDIS_DEFAULT_USER_DB, **kwargs): + self.sentinel_host = sentinel_host + self.sentinel_port = sentinel_port + self.sentinel_master_id = sentinel_master_id + self.timeout = kwargs['timeout'] if 'timeout' in kwargs else REDIS_DEFAULT_TIMEOUT + self.redis_db = redis_db def redis_connection(self): return self.__create_redis_connection() def __create_redis_connection(self): - #TODO Change to use Sentinel - pool = redis.ConnectionPool(host=self.host, port=self.port, db=self.db) - return redis.Redis(connection_pool=pool) \ No newline at end of file + sentinel = Sentinel([(self.sentinel_host, 26379)], socket_timeout=self.timeout) + return sentinel.master_for(self.sentinel_master_id, socket_timeout=self.timeout, db=self.redis_db) \ No newline at end of file