1. 程式人生 > >Redis資料庫之主從複製和叢集部署

Redis資料庫之主從複製和叢集部署

主從複製:

目前只能在一臺機子上演示主從複製

第一步 需要啟動兩臺Redis, 複製兩份相同的redis.conf

第二步 分別將兩個redis.conf檔案的port設定為6380和6381

第三步 將6381那臺的slaveof屬性 設定為 127.0.0.1 6380

第四步 啟動兩臺redis

第五步 在主機Redis上建立一個key, 可以通過命令檢視從機Redis上也有相同的key, 說明自動實現主從複製

叢集部署:

第一步: 安裝ruby環境

yum install ruby

yum install rubygems

再安裝ruby和redis的介面程式

需要將redis-3.0.0.gem檔案拷貝至相應的目錄下

gem install /../../redis-3.0.0.gem  目錄地址自定義

第二步: 建立叢集

① 在自定義的路徑下建立6個資料夾用於表示不同的主機

② 將redis的原始碼中的redis.conf拷貝至每個主機資料夾下

③ 將redis的原始碼中的src目錄下的redis-trib.rb檔案拷貝至跟6個資料夾同級的目錄中

④ 修改6個資料夾下的redis.conf的配置:

port 埠號  ===========>指定具體的埠號(當前設定為7001-7006), 不能重複也不能被其他程式佔用

bind [ip] =======>綁定當前主機的ip(我這裡配置為當前主機的ip 192.168.19.130)

cluster-enabled yes ==========>開啟叢集

cluster-config-file nodes-[port].conf  ============>生成節點檔案(相對應的port改為7001-7006)

第三步: 啟動每個節點的redis服務

① 啟動6個redis服務

② 呼叫叢集檔案, 建立叢集, 命令如下:

執行redis-trib.rb,此指令碼是ruby指令碼,它依賴ruby環境。

./redis-trib.rb create --replicas 1 192.168.19.130:7001 192.168.19.130:7002 192.168.19.130:7003 192.168.19.130:7004 192.168.19.130:7005  192.168.19.130:7006

說明:

其中192.168.19.130是當前機子的ip地址, 由於6臺redis服務都在同一臺機子上, 所以6個ip地址一樣

redis叢集至少需要3個主節點,每個主節點有一個從節點總共6個節點

replicas指定為1表示每個主節點有一個從節點, 可以看成有3臺機子, 每臺機子都有主從(master/slave)複製

如果執行時報如下錯誤:

[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

解決方法是刪除生成的配置檔案nodes.conf,如果不行則說明現在建立的結點包括了舊叢集的結點資訊,需要刪除redis的持久化檔案後再重啟redis,比如:appendonly.aof、dump.rdb

出現下圖代表成功:

③ 檢視叢集部署:

1) 先用客戶端登入其中一臺服務, 登入命令: ./bin/redis-cli -h 192.168.19.130 -p 7001

2) 檢視叢集狀態命令: cluster info

3) 再鍵入cluster nodes命令檢視叢集部署, 如下圖:

第四步: 用Java程式碼連線Redis的叢集

測試程式碼:

/**
     * 測試連線叢集服務
     */
    @Test
    public void testCluster() {
        JedisPoolConfig config = new JedisPoolConfig();
        // 最大連線數
        config.setMaxTotal(30);
        // 最大連線空閒數
        config.setMaxIdle(2);
        //叢集結點
        Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7001));
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7002));
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7003));
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7004));
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7005));
        jedisClusterNode.add(new HostAndPort("192.168.19.130", 7006));
        JedisCluster jc = new JedisCluster(jedisClusterNode, config);
        jc.set("birthday", "today");
        String value = jc.get("birthday");
        System.out.println(value);
        try {
            jc.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

結果: