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客戶端使用

@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


免責聲明!

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



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