redis -master/slave(主/從模式)

類似MySQL的master-slave模式一樣,redis的master-slave可以提升系統的可用性,master節點寫入cache後,會自動同步到slave上。

環境:

master node: 10.6.144.155:7030

slave node: 10.6.144.156:7031

 

一、配置

僅需要在slave node上修改配置:

找到slaveof這行,參考下面的修改(填上master node的Ip和端口就完事了)

slaveof 10.6.144.155 7030

另外注意下 slave-read-only yes 這行,這表示slave只讀不寫,也是推薦設置

 

二、驗證

啓動master/slave這二臺機器上的redis,在master上加一個緩存項


然後在slave上取出該緩存項


取到了,說明master上的cache自動複製到slave節點了

三、redisson客戶端使用

複製代碼
 1     @Test
 2     public void testRedisson() {
 3         Config config = new Config();
 4 
 5         config.useMasterSlaveConnection().setMasterAddress("10.6.144.155:7030")
 6                 .addSlaveAddress("10.6.144.156:7031");
 7 
 8         Redisson redisson = Redisson.create(config);
 9 
10         String key = "test";
11         
12         RBucket<String> myObj = redisson.getBucket(key);
13         if (myObj!=null){
14             myObj.delete();
15         }
16         
17         myObj.set("hello World");
18         
19         System.out.println(myObj.get());//斷點停在這裏,然後down掉master,不影響讀取
20         
21         myObj.set("new Value");//恢復master,down掉slave,不影響寫入
22         
23         System.out.println(myObj.get());//再恢復slave,down掉master,可正常讀取
24         
25         myObj.set("can not write to master");//master已down掉,無法寫入
26         
27         System.out.println(myObj.get());//恢復master,down掉slave,無法讀取
28         
29         
30         redisson.shutdown();
31         
32         
33     }
複製代碼

注:經實際測試,redisson客戶端在set寫操作時,連接的是master node,get讀操作時連接的是slave,而且遇到操作失敗,會同步阻塞後面的處理(一直等待,直到超時)

即:set操作時,至少要有一臺可連接的master,get操作時,至少要有一臺可連接的slave

四、Jedis客戶端使用

複製代碼
 1     @Test
 2     public void testJedis() throws InterruptedException {
 3         
 4         Jedis jedisMaster = new Jedis("10.6.144.155", 7030);
 5         
 6         String key = "a";
 7         
 8         String a= jedisMaster.get(key);
 9         if (a!=null){
10             jedisMaster.del(key);
11         }
12         jedisMaster.set(key, "hi!");//向master寫入
13         jedisMaster.close();
14         
15 
16         Jedis jedisSlave = new Jedis("10.6.144.156", 7031);// 連接slave
17         
18         jedisSlave.slaveof("10.6.144.155", 7030);// 指定master        
19 
20         System.out.println(jedisSlave.get(key));
21         
22         jedisSlave.slaveofNoOne();//master如果down掛,可以用代碼將slave提升爲master(即:可寫)
23 
24         jedisSlave.set(key, "new");
25 
26         System.out.println(jedisSlave.get(key));
27 
28         jedisSlave.close();
29 
30     }
複製代碼

 

後記:個人感覺master-slave模式作用有限,因爲從二種client的測試結果看,在沒有其它監控機制的前提下,無論是master或slave掛掉,都需要手動調整配置或修改代碼,才能保證讀/寫繼續正常工作,理想情況是master掛掉,最好slave中能自動(無需人工干預)選出一臺充當master繼續服務。redis 的cluster功能,目前尚處於beta階段,估計不久的將來,等cluster功能正式發佈後,可以通過custer功能搭建redis集羣。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章