構建高可用redis(4.0.8)快取叢集-根據圖靈公開課完整實現搭建
redis 主從模式
單體應用,系統中只有一臺redis伺服器,只有一臺時候有單點的問題。
redis升級 主從形式:
升級主從後,從redis 伺服器不對外提供服務,只是從主伺服器哪裡同步資料;一旦主redis伺服器不能提供服務後,前臺運維人員手動切換直接配置呼叫從Redis伺服器。
這樣主從升級後還可以進行讀寫分離,讓讀取redis服務直接呼叫從redis伺服器資料,寫資料呼叫主Redis伺服器。
但是這種方式需要運維人員手動切換主從模式。需要系統自動切換就需要哨兵模式。
redis 哨兵模式
一旦主redis服務掛了,哨兵節點會直接在redis伺服器群中再次選舉一個主redis服務。網路訪問通過負載均衡直接先到哨兵節點。哨兵節點再次轉發請求到redis伺服器。
哨兵模式一大缺點是 :寫的服務只有一臺,哨兵節點(哨兵節點也可高可用部署,多例項)的單點問題,特別是在主從切換時候有訪問瞬斷的情況。
redis 高可用叢集模式
原始碼安裝步驟
第一階段命令
- 安裝好gcc編譯器
- 下載redis 原始碼安裝包
- 將下載的壓縮包解壓縮到一個目錄下,
- 進入解壓縮的目錄,然後執行
make
命令 - 進入src目錄下檢查是有生成
redis-cli
和redis-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/
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目錄下,修改如下命令引數
daemonize yes
port 8001
bind 192.168.0.5
綁定當前redis 的ip地址,redis服務監聽當前主機的192.168.0.5網路埠請求。dir /home/vc/dev/redis/redis-cluster/8001
指定資料持久化檔案存放位置cluster-enabled yes
開啟叢集模式cluster-config-file nodes-8001.conf
(叢集每個節點有一個叢集配置檔案,這裡800X最好和port對應上)cluster-node-timeout 5000
叢集節點間通訊的超時時間限制(毫秒)appendonly yes
表示日誌是尾加的日誌資訊。- 設定每個節點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命令
sudo apt-get install ruby
sudo apt-get install rubygems
ruby外掛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