類似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客戶端使用
@Test public void testRedisson() { Config config = new Config(); config.useMasterSlaveConnection().setMasterAddress("10.6.144.155:7030") .addSlaveAddress("10.6.144.156:7031"); Redisson redisson = Redisson.create(config); String key = "test"; RBucket<String> myObj = redisson.getBucket(key); if (myObj!=null){ myObj.delete(); } myObj.set("hello World"); System.out.println(myObj.get());//斷點停在這里,然后down掉master,不影響讀取 myObj.set("new Value");//恢復master,down掉slave,不影響寫入 System.out.println(myObj.get());//再恢復slave,down掉master,可正常讀取 myObj.set("can not write to master");//master已down掉,無法寫入 System.out.println(myObj.get());//恢復master,down掉slave,無法讀取 redisson.shutdown(); }
注:經實際測試,redisson客戶端在set寫操作時,連接的是master node,get讀操作時連接的是slave,而且遇到操作失敗,會同步阻塞后面的處理(一直等待,直到超時)
即:set操作時,至少要有一台可連接的master,get操作時,至少要有一台可連接的slave
@Test public void testJedis() throws InterruptedException { Jedis jedisMaster = new Jedis("10.6.144.155", 7030); String key = "a"; String a= jedisMaster.get(key); if (a!=null){ jedisMaster.del(key); } jedisMaster.set(key, "hi!");//向master寫入 jedisMaster.close(); Jedis jedisSlave = new Jedis("10.6.144.156", 7031);// 連接slave jedisSlave.slaveof("10.6.144.155", 7030);// 指定master System.out.println(jedisSlave.get(key)); jedisSlave.slaveofNoOne();//master如果down掛,可以用代碼將slave提升為master(即:可寫) jedisSlave.set(key, "new"); System.out.println(jedisSlave.get(key)); jedisSlave.close(); }
后記:個人感覺master-slave模式作用有限,因為從二種client的測試結果看,在沒有其它監控機制的前提下,無論是master或slave掛掉,都需要手動調整配置或修改代碼,才能保證讀/寫繼續正常工作,理想情況是master掛掉,最好slave中能自動(無需人工干預)選出一台充當master繼續服務。redis 的cluster功能,目前尚處於beta階段,估計不久的將來,等cluster功能正式發布后,可以通過custer功能搭建redis集群。
轉自:http://www.cnblogs.com/yjmyzz/p/4106142.html