diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/redis/RedisInitializer.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/redis/RedisInitializer.java deleted file mode 100644 index bda7e226c..000000000 --- a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/redis/RedisInitializer.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.ai.cloud.skywalking.reciever.alarm.redis; - -import com.ai.cloud.skywalking.reciever.conf.Config; -import org.apache.commons.pool2.impl.GenericObjectPoolConfig; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; - -public class RedisInitializer { - - private static Logger logger = LogManager.getLogger(RedisInitializer.class); - private static JedisPool jedisPool; - private static final int REDIS_MAX_IDLE = 10; - private static final int REDIS_MIN_IDLE = 1; - private static final int REDIS_MAX_TOTAL = 20; - - static { - GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); - genericObjectPoolConfig.setTestOnBorrow(true); - genericObjectPoolConfig.setMaxIdle(REDIS_MAX_IDLE); - genericObjectPoolConfig.setMinIdle(REDIS_MIN_IDLE); - genericObjectPoolConfig.setMaxTotal(REDIS_MAX_TOTAL); - - String redisServerConfig = Config.Alarm.REDIS_SERVER_CONFIG; - if (redisServerConfig == null || redisServerConfig.length() <= 0) { - logger.error("Redis server config is null."); - } - - String[] config = redisServerConfig.split(":"); - if (config.length != 2) { - logger.error("Redis server config is illegal"); - } - - jedisPool = - new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1])); - - // Test connect redis. - RedisInitializer.redis(new Executor() { - @Override - public String exec(Jedis jedis) { - return jedis.get("ok"); - } - }); - - } - - public static T redis(Executor executor) { - Jedis jedis = null; - try { - jedis = jedisPool.getResource(); - return executor.exec(jedis); - } catch (Exception e) { - logger.error("Failed to connect redis", e); - //TODO 启动备用Redis - } finally { - if (jedis != null) { - jedis.close(); - } - } - - return null; - } - - - public interface Executor { - R exec(Jedis jedis); - } -} diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java index 27141583c..a43c917ab 100644 --- a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java +++ b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/conf/Config.java @@ -89,5 +89,13 @@ public class Config { public static int ALARM_EXPIRE_SECONDS = 1000 * 60 * 90; public static String REDIS_SERVER_CONFIG = "127.0.0.1:6379"; + + public static String BAK_REDIS_SERVER_CONFIG = "127.0.0.1:6379"; + + public static int REDIS_MAX_IDLE = 10; + + public static int REDIS_MIN_IDLE = 1; + + public static int REDIS_MAX_TOTAL = 20; } } \ No newline at end of file diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperator.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperator.java similarity index 92% rename from skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperator.java rename to skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperator.java index 40848e74d..6b3af13b4 100644 --- a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperator.java +++ b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperator.java @@ -1,6 +1,6 @@ -package com.ai.cloud.skywalking.reciever.alarm; +package com.ai.cloud.skywalking.reciever.storage.chain.alarm; -import com.ai.cloud.skywalking.reciever.alarm.redis.RedisInitializer; +import com.ai.cloud.skywalking.reciever.storage.chain.alarm.redis.RedisInitializer; import redis.clients.jedis.Jedis; import java.util.Collection; diff --git a/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/redis/RedisInitializer.java b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/redis/RedisInitializer.java new file mode 100644 index 000000000..b552c948e --- /dev/null +++ b/skywalking-server/src/main/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/redis/RedisInitializer.java @@ -0,0 +1,110 @@ +package com.ai.cloud.skywalking.reciever.storage.chain.alarm.redis; + +import com.ai.cloud.skywalking.reciever.conf.Config; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +public class RedisInitializer { + + private static Logger logger = LogManager.getLogger(RedisInitializer.class); + private static JedisPool jedisPool; + private static Object lock = new Object(); + + static { + GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig(); + String redisServerConfig = Config.Alarm.REDIS_SERVER_CONFIG; + if (redisServerConfig == null || redisServerConfig.length() <= 0) { + logger.error("Redis server config is null."); + } + + String[] config = redisServerConfig.split(":"); + if (config.length != 2) { + logger.error("Redis server config is illegal"); + } + + jedisPool = + new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1])); + + // Test connect redis. + RedisInitializer.redis(new Executor() { + @Override + public String exec(Jedis jedis) { + return jedis.get("ok"); + } + }); + + } + + public static T redis(Executor executor) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.connect(); + return executor.exec(jedis); + } catch (Exception e) { + jedisPool = null; + logger.error("Failed to connect redis", e); + // 启动备用Redis + if (jedisPool == null) { + synchronized (lock) { + if (jedisPool == null) { + // 生成备份Redis的Redis Client Pool + GenericObjectPoolConfig genericObjectPoolConfig = buildGenericObjectPoolConfig(); + String bakRedisServerConfig = Config.Alarm.BAK_REDIS_SERVER_CONFIG; + if (bakRedisServerConfig == null || bakRedisServerConfig.length() <= 0) { + logger.error("Bak Redis server config is null."); + } + + String[] config = bakRedisServerConfig.split(":"); + if (config.length != 2) { + logger.error("Bak Redis server config is illegal"); + } + + jedisPool = + new JedisPool(genericObjectPoolConfig, config[0], Integer.valueOf(config[1])); + try { + jedis = jedisPool.getResource(); + jedis.connect(); + jedis.get("ok"); + } catch (Exception ex) { + logger.error("Failed to connect bak redis server.", ex); + // 备份Redis的都失败了,没有想好怎么提示 + //System.exit(-1); + } finally { + if (jedis != null) { + jedis.close(); + } + } + } + } + // 重新再获取Redis Client返回执行 + jedis = jedisPool.getResource(); + jedis.connect(); + return executor.exec(jedis); + } + } finally { + if (jedis != null) { + jedis.close(); + } + } + + return null; + } + + private static GenericObjectPoolConfig buildGenericObjectPoolConfig() { + GenericObjectPoolConfig genericObjectPoolConfig = new GenericObjectPoolConfig(); + genericObjectPoolConfig.setTestOnBorrow(true); + genericObjectPoolConfig.setMaxIdle(Config.Alarm.REDIS_MAX_IDLE); + genericObjectPoolConfig.setMinIdle(Config.Alarm.REDIS_MIN_IDLE); + genericObjectPoolConfig.setMaxTotal(Config.Alarm.REDIS_MAX_TOTAL); + return genericObjectPoolConfig; + } + + + public interface Executor { + R exec(Jedis jedis); + } +} diff --git a/skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperatorTest.java b/skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperatorTest.java similarity index 92% rename from skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperatorTest.java rename to skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperatorTest.java index 32328362c..e22505313 100644 --- a/skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/alarm/AlarmOperatorTest.java +++ b/skywalking-server/src/test/java/com/ai/cloud/skywalking/reciever/storage/chain/alarm/AlarmOperatorTest.java @@ -1,4 +1,4 @@ -package com.ai.cloud.skywalking.reciever.alarm; +package com.ai.cloud.skywalking.reciever.storage.chain.alarm; import com.ai.cloud.skywalking.reciever.conf.Config; import com.ai.cloud.skywalking.reciever.conf.ConfigInitializer;