類似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);// 串連slave17 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叢集。