通過哨兵機制實現Redis主從配置以及java調用


Redis版本:3.0.7

操作環境:Linux

一、redis 主從配置的作用是什么

  redis主從配置,配置master 只能為寫,slave只能為讀,在客戶端對poolconnect請求時候,,會將讀請求轉到slave上面,寫請求轉到master上面,同時,master和slave有同步功能,這就實現了(數據層)讀寫分離對上層(邏輯層)透明的正常邏輯。無需再通過中間件或者代碼進行讀寫分析實現。

 二、如何實現主從配置

  以一台服務器,配置兩個端口號為例子做介紹

  redis實現主從配置最關鍵的兩個兩個配置文件是redis.conf和sentinel.conf,分別配合redis-server和redis-sentinel使用;下面做詳細講解。

  主配置文件:

  redis.conf:

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM