1. 程式人生 > >構建高可用redis(4.0.8)快取叢集-根據圖靈公開課完整實現搭建

構建高可用redis(4.0.8)快取叢集-根據圖靈公開課完整實現搭建

redis 主從模式

單體應用,系統中只有一臺redis伺服器,只有一臺時候有單點的問題。

redis升級 主從形式:

升級主從後,從redis 伺服器不對外提供服務,只是從主伺服器哪裡同步資料;一旦主redis伺服器不能提供服務後,前臺運維人員手動切換直接配置呼叫從Redis伺服器。

這樣主從升級後還可以進行讀寫分離,讓讀取redis服務直接呼叫從redis伺服器資料,寫資料呼叫主Redis伺服器。

但是這種方式需要運維人員手動切換主從模式。需要系統自動切換就需要哨兵模式。

redis 哨兵模式

一旦主redis服務掛了,哨兵節點會直接在redis伺服器群中再次選舉一個主redis服務。網路訪問通過負載均衡直接先到哨兵節點。哨兵節點再次轉發請求到redis伺服器。
哨兵模式一大缺點是 :寫的服務只有一臺,哨兵節點(哨兵節點也可高可用部署,多例項)的單點問題,特別是在主從切換時候有訪問瞬斷的情況。

redis 高可用叢集模式

原始碼安裝步驟

第一階段命令

  • 安裝好gcc編譯器
  • 下載redis 原始碼安裝包
  • 將下載的壓縮包解壓縮到一個目錄下,
  • 進入解壓縮的目錄,然後執行make命令
  • 進入src目錄下檢查是有生成redis-cliredis-server 檔案命令檔案
  • 在src目錄執行sudo make install命令檢查是否可以輸出如下資訊說明執行原始碼安裝成功了。

運維最佳實踐

不想每次進入src目錄下去執行redis-cli命令以及redis-server命令。一般運維人員會將常用命令已經配置檔案拿出來放置在另外一個目錄下:

新建etc目錄和bin目錄

redis-4.0.8 現在安裝在目錄/home/vc/dev/redis目錄下,在這個和redis-4.0安裝目錄下相同目錄下新建etc目錄當作redis配置檔案的配置目錄。新建bin目錄當作啟動的指令碼的配置目錄。

第二階段命令 將配置檔案複製一份到剛才新建的目錄中

  • 進入redis安裝目錄cp redis.conf ../etc/ 執行cp命令複製到剛才新建的etc目錄。
  • 進入redis安裝目錄下的src目錄執行:mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server ../../bin/
    命令將可執行命令複製到剛才新建的bin目錄下。(修改配置檔案項:daemonize yes將redis以後臺程序形式啟動 )
  • 進入bin目錄:redis-server ../etc/redis.conf執行這個命令啟動單個redis例項
  • 通過ps -ef | grep redis命令或者netstat -tunpl| grep 6379命令 檢查是否有redis服務以及檢視redis服務監聽埠。
  • 進入bin目錄執行redis-cli命令執行redis客戶端連線redis服務。並可以通過quit命令斷開和redis服務的連線
  • 殺死redis服務程序
    • pkill redis-server 殺死redis-server 程序名稱的程序
    • kill -9 程序號
    • redis-cli shutdown命令也可以停止redis服務程序,但是有一個問題是必須進入到redis-cli命令所在目錄。


上面已經對單例項redis已經啟動起來了,下面搭建叢集redis服務

叢集的話,至少需要三個master主節點。為了叢集選舉

在單臺機器上建立 “三主三從” 的 偽分散式Redis叢集。

建立叢集操作命令步驟 在/home/vc/dev/redis目錄下

  • mkdir redis-cluster 新建叢集目錄
  • 進入redis-cluster目錄 新建mkdir 8001,mkdir 8002,mkdir 8003,mkdir 8004,mkdir 8005,mkdir 8006新建六個目錄分別放置六個redis例項的啟動配置檔案
  • 把之前的redis.conf配置檔案copy 到 8001目錄下,修改如下命令引數

    1. daemonize yes
    2. port 8001
    3. bind 192.168.0.5綁定當前redis 的ip地址,redis服務監聽當前主機的192.168.0.5網路埠請求。
    4. dir /home/vc/dev/redis/redis-cluster/8001指定資料持久化檔案存放位置
    5. cluster-enabled yes 開啟叢集模式
    6. cluster-config-file nodes-8001.conf (叢集每個節點有一個叢集配置檔案,這裡800X最好和port對應上)
    7. cluster-node-timeout 5000 叢集節點間通訊的超時時間限制(毫秒)
    8. appendonly yes表示日誌是尾加的日誌資訊。
    9. 設定每個節點redis日誌存放位置logfile "/home/vc/dev/redis/redis-cluster/8006/redis-8006.log" 檔案安裝redis-8xxx.log命令,以埠結尾。
  • 將8001目錄下修改後的配置檔案,分別複製到800x目錄下,然後對每個配置檔案進行修改,只需要修改 第 2, 4, 6 項裡面的埠號即可,可以用批量替換
    Linux下文字批量修改

:%s/源字串/目的字串/g
:%s/8001/8005/g
  • 分別啟動 6個redis例項 /home/vc/dev/redis/bin/redis-server /home/vc/dev/redis/redis-cluster/8006/redis.conf
  • 由於redis 3.0之後官方提供了搭建叢集的ruby指令碼,所以需要安裝ruby命令

    1. sudo apt-get install ruby
    2. sudo apt-get install rubygems ruby外掛
    3. sudo gem install redis 這步出錯了。redis requires Ruby version >= 2.2.2. ruby 需要2.2.2版本的,現在是1.8.7版本。更新ruby版本可以先安裝RVM–> ubuntu_rvm去管理ruby版本升級,目前沒有成功。

    1.不通過RVM,直接手動更新ruby 到2.4 命令指令碼:使用brightbox ppa倉庫安裝

    $ sudo apt-add-repository ppa:brightbox/ruby-ng
    $ sudo apt-get update
    $ sudo apt-get install ruby2.4
    $ ruby -v

將建立的六個單獨執行例項 聯合起來成為redis叢集例項

  • 進入redis安裝目錄/home/vc/dev/redis/redis-4.0.8/src 執行如下命令:./redis-trib.rb create --replicas 1 192.168.0.5:8001 192.168.0.5:8002 192.168.0.5:8003 192.168.0.5:8004 192.168.0.5:8005 192.168.0.5:8006

建立叢集成功

驗證叢集

  • 通過局域網裡面任何的客戶端機器連線機器中任務一個redis節點即可。redis-cli.exe -c -h 192.168.0.5 -p 8006(-c 表示以連線的是叢集節點,注意每個節點都設定為監聽192.168.0.5網路埠網路請求,所以redis-cli連線-h 引數務必寫bind 引數設定的網路埠。)

java 程式碼連線叢集庫並測試設定kv值

package org.vincent;

import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @Package: org.vincent <br/>
 * @Description: TODO <br/>
 * @author: PengRong <br/>
 * @Date: Created in 2018/6/3 1:44 <br/>
 * @Company: PLCC <br/>
 * @Copyright: Copyright (c) 2018 <br/>
 * @Version: 1.0 <br/>
 * @Modified By: <br/>
 * @Created by PengRong on 2018/6/3. <br/>
 */

public class RedisCluster {
        public static void main(String[] args){
                Set<HostAndPort> jedisConfig=new HashSet<>();
                jedisConfig.add(new HostAndPort("192.168.0.5",8001));
                jedisConfig.add(new HostAndPort("192.168.0.5",8002));
                jedisConfig.add(new HostAndPort("192.168.0.5",8003));
                jedisConfig.add(new HostAndPort("192.168.0.5",8004));
                jedisConfig.add(new HostAndPort("192.168.0.5",8005));
                jedisConfig.add(new HostAndPort("192.168.0.5",8006));
                JedisPoolConfig config=new JedisPoolConfig();
                config.setMaxTotal(100);
                config.setMaxIdle(10);
                config.setTestOnBorrow(true);
                JedisCluster cluster=new JedisCluster(jedisConfig,6000,10,config);
                System.out.println(cluster.set("student","aaaa"));
                System.out.println(cluster.set("age","18"));
                System.out.println(cluster.get("student"));
                System.out.println(cluster.get("age"));
        }
}

redis 叢集關閉

每個節點分別關閉
redis-cli.exe -c -h 192.168.0.5 -p 800x shutdown

redis 資料重定向

資料分片儲存