通过哨兵机制实现Redis主从配置以及java调用 一、redis 主从配置的作用是什么 二、如何实现主从配置 三、java中调用
Redis版本:3.0.7
操作环境:Linux
redis主从配置,配置master 只能为写,slave只能为读,在客户端对poolconnect请求时候,,会将读请求转到slave上面,写请求转到master上面,同时,master和slave有同步功能,这就实现了(数据层)读写分离对上层(逻辑层)透明的正常逻辑。无需再通过中间件或者代码进行读写分析实现。
二、如何实现主从配置
以一台服务器,配置两个端口号为例子做介绍
redis实现主从配置最关键的两个两个配置文件是redis.conf和sentinel.conf,分别配合redis-server和redis-sentinel使用;下面做详细讲解。
主配置文件:
1 #开启后台运行模式 2 daemonize yes 3 #指定进程id存放位置,也可以用默认的 4 pidfile /usr/local/webserver/redis/run/redis.pid 5 #指定端口号 6 port 6379 7 8 9 tcp-backlog 511 10 11 timeout 0 12 13 tcp-keepalive 0 14 15 loglevel notice 16 17 logfile "" 18 19 databases 16 20 21 save 900 1 22 save 300 10 23 save 60 10000 24 25 stop-writes-on-bgsave-error yes 26 27 rdbcompression yes 28 29 rdbchecksum yes 30 31 dbfilename dump.rdb 32 #指定数据存放位置,也可以用默认的 33 dir /usr/local/webserver/redis/db 34 35 slave-serve-stale-data yes 36 #从redis只能读 37 slave-read-only yes 38 39 repl-diskless-sync no 40 41 repl-diskless-sync-delay 5 42 43 repl-disable-tcp-nodelay no 44 45 slave-priority 100 46 #本redis密码 47 requirepass 123456 48 #主redis密码 49 masterauth "123456" 50 51 appendonly yes 52 53 appendfilename "appendonly.aof" 54 55 appendfsync everysec 56 57 no-appendfsync-on-rewrite no 58 59 auto-aof-rewrite-percentage 100 60 auto-aof-rewrite-min-size 64mb 61 62 aof-load-truncated yes 63 64 lua-time-limit 5000 65 66 slowlog-max-len 128 67 68 latency-monitor-threshold 0 69 70 notify-keyspace-events "" 71 72 hash-max-ziplist-entries 512 73 hash-max-ziplist-value 64 74 75 list-max-ziplist-entries 512 76 list-max-ziplist-value 64 77 78 set-max-intset-entries 512 79 80 zset-max-ziplist-entries 128 81 zset-max-ziplist-value 64 82 83 hll-sparse-max-bytes 3000 84 85 activerehashing yes 86 87 client-output-buffer-limit normal 0 0 0 88 client-output-buffer-limit slave 256mb 64mb 60 89 client-output-buffer-limit pubsub 32mb 8mb 60 90 91 hz 10 92 93 aof-rewrite-incremental-fsync yes
sentinel.conf(哨兵机制):
1 port 26379 2 dir "/usr/local/webserver/redis/db" 3 # 守护进程模式 4 daemonize yes 5 # 指明日志文件名 6 logfile "./sentinel.log" 7 #设置监控的主redis的ip以及端口号,以及投票最低数 8 sentinel monitor mymaster 127.0.0.1 6379 1 9 sentinel down-after-milliseconds mymaster 5000 10 sentinel failover-timeout mymaster 18000 11 sentinel auth-pass mymaster 123456
从配置文件:
redis.conf:
1 daemonize yes 2 3 pidfile /usr/local/webserver/redis-slave1/run/redis.pid 4 5 port 63791 6 7 8 tcp-backlog 511 9 10 timeout 0 11 12 tcp-keepalive 0 13 14 loglevel notice 15 16 logfile "" 17 18 databases 16 19 20 save 900 1 21 save 300 10 22 save 60 10000 23 24 stop-writes-on-bgsave-error yes 25 26 rdbcompression yes 27 28 rdbchecksum yes 29 30 dbfilename dump.rdb 31 32 dir /usr/local/webserver/redis-slave1/db 33 34 slave-serve-stale-data yes 35 36 slave-read-only yes 37 38 repl-diskless-sync no 39 40 repl-diskless-sync-delay 5 41 42 repl-disable-tcp-nodelay no 43 44 slave-priority 100 45 46 requirepass 123456 47 masterauth "123456" 48 49 appendonly yes 50 51 appendfilename "appendonly.aof" 52 53 appendfsync everysec 54 55 no-appendfsync-on-rewrite no 56 57 auto-aof-rewrite-percentage 100 58 auto-aof-rewrite-min-size 64mb 59 60 aof-load-truncated yes 61 62 lua-time-limit 5000 63 64 slowlog-max-len 128 65 66 latency-monitor-threshold 0 67 68 notify-keyspace-events "" 69 70 hash-max-ziplist-entries 512 71 hash-max-ziplist-value 64 72 73 list-max-ziplist-entries 512 74 list-max-ziplist-value 64 75 76 set-max-intset-entries 512 77 78 zset-max-ziplist-entries 128 79 zset-max-ziplist-value 64 80 81 hll-sparse-max-bytes 3000 82 83 activerehashing yes 84 85 client-output-buffer-limit normal 0 0 0 86 client-output-buffer-limit slave 256mb 64mb 60 87 client-output-buffer-limit pubsub 32mb 8mb 60 88 89 hz 10 90 91 aof-rewrite-incremental-fsync yes 92 93 #指定主redis以及相应的端口号 94 slaveof 127.0.0.1 6379
sentinel.conf:
1 #sentinel端口 2 port 263791 3 #工作路径,注意路径不要和主重复 4 dir "/usr/local/webserver/redis-slave1/db" 5 # 守护进程模式 6 daemonize yes 7 # 指明日志文件名 8 logfile "./sentinel.log" 9 #哨兵监控的master,主从配置一样, 10 sentinel monitor mymaster 127.0.0.1 6379 1 11 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。 12 sentinel down-after-milliseconds mymaster 5000 13 #若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。 14 sentinel failover-timeout mymaster 18000 15 #设置master和slaves验证密码 16 sentinel auth-pass mymaster 123456
同理,如果要实现多个从配置,可以按照以上从配置方式多定义几个端口号就可以了。
在进行自动故障转移的时候,选中为主redis的redis.conf文件会将原来slaveof那一行去掉,并重新在从redis配置文件中指定主redis的信息
三、java中调用
1 import java.util.HashSet; 2 import java.util.Set; 3 4 import redis.clients.jedis.Jedis; 5 import redis.clients.jedis.JedisSentinelPool; 6 7 public class RedisSentinelTest { 8 9 @SuppressWarnings("deprecation") 10 public static void main(String[] args) { 11 12 Set<String> sentinels = new HashSet<String>(); 13 String hostAndPort1 = "127.0.0.1:26379"; 14 String hostAndPort2 = "127.0.0.1:26380"; 15 sentinels.add(hostAndPort1); 16 sentinels.add(hostAndPort2); 17 18 String clusterName = "mymaster"; 19 String password = "123456"; 20 21 JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName,sentinels,password); 22 23 Jedis jedis = null; 24 try { 25 jedis = redisSentinelJedisPool.getResource(); 26 // jedis.set("key", "value"); 27 System.out.println(jedis.get("key")); 28 } catch (Exception e) { 29 e.printStackTrace(); 30 } finally { 31 redisSentinelJedisPool.returnBrokenResource(jedis); 32 } 33 34 redisSentinelJedisPool.close(); 35 } 36 37 }