Redis 高可用叢集
Redis Cluster
什麼是Redis-Cluster:
為何要搭建Redis叢集。Redis是在記憶體中儲存資料的,而我們的電腦一般記憶體都不大,這也就意味着Redis不适合存儲大資料,适合存儲大資料的是Hadoop生态系統的Hbase或者是MogoDB。Redis更适合處理高并發,一台裝置的存儲能力是很有限的,但是多台裝置協同合作,就可以讓記憶體增大很多倍,這就需要用到叢集。
Redis叢集搭建的方式有多種,例如使用用戶端分片、Twemproxy、Codis等,但從redis 3.0之後版本支援redis-cluster叢集,它是Redis官方提出的解決方案,Redis-Cluster采用無中心結構,每個節點儲存資料和整個叢集狀态,每個節點都和其他所有節點連接配接。其redis-cluster架構圖如下:
用戶端與 redis 節點直連,不需要中間 proxy 層.用戶端不需要連接配接叢集所有節點連接配接叢集中任何一個可用節點即可。
所有的 redis 節點彼此互聯(PING-PONG 機制),内部使用二進制協定優化傳輸速度和帶寬.
分布存儲機制-槽 :
這個在叢集搭完會提到。
容錯機制-投票
1.選舉過程是叢集中所有master參與,如果半數以上master節點與故障節點通信超過(cluster-node-timeout),認為該節點故障,自動觸發故障轉移操作. 故障節點對應的從節點自動更新為主節點。
2.什麼時候整個叢集不可用(cluster_state:fail)?
如果叢集任意master挂掉,且目前master沒有slave.叢集進入fail狀态,也可以了解成叢集的slot映射[0-16383]不完成時進入fail狀态.
就簡紹到這裡,接下來我們開始搭建redis叢集:
搭建Redis-Cluster
搭建要求: 需要 6 台 redis 伺服器,搭建僞叢集(在一台伺服器上來模拟redis叢集)。
需要 6 個 redis 執行個體。
需要運作在不同的端口 7002-7007 ( 通過不同的端口号來區分)
準備工作
-
在阿裡雲上面安裝 gcc: Redis 是 c 語言開發的。安裝 redis 需要 c 語言的編譯環境。如果沒有 gcc 需要線上安裝。
1.安裝gcc的指令
2.使用yum指令安裝 ruby (我們需要使用ruby腳本來實作叢集搭建)yum install gcc-c++
yum install ruby yum install rubygems
-
将redis源碼包上傳到 linux 系統 ,解壓redis源碼包
編譯redis源碼 ,進入redis源碼檔案夾
3.看到以下輸出結果,表示編譯成功
4.建立目錄/usr/local/redis-cluster目錄, 安裝6個redis執行個體,分别安裝在以下目錄
以第一個redis執行個體為例,指令如下:
make install PREFIX=/usr/local/java/redis/redis-cluter/redis1
在這裡要注意: 要先進入redis 那個檔案夾再使用這個指令
出現此提示表示成功,按此方法安裝其餘5個redis執行個體
安裝完剩下redis執行個體的開始下一步
5.複制配置檔案 将 /redis-3.0.0/redis.conf 複制到redis下的bin目錄下
配置叢集
(1)修改每個redis節點的配置檔案redis.conf (分别是7002 - 7007)
将cluster-enabled yes 前的注釋去掉(我的是816行)
我用的是小紅本 可以加一個ftp組 這樣修改起來也比較友善
啟動每個redis執行個體
以第一個執行個體為例,指令如下:
cd /usr/local/java/redis/redis-cluster/redis1/bin/ ./redis-server redis.conf
啟動所有的redis執行個體
檢視一下狀态
指令:
ps -ef | grep redis
如果後面的括号裡面沒有顯示cluster 則就說明該伺服器沒有啟動叢集模式
如果沒有啟動的話,找到那個程序 使用指令
kill pid
例如我剛才沒有啟動7006 那麼就找到那個程序id 29712 先殺掉該程序,再啟動就可以了。
下一步:由于redis叢集需要使用ruby指令,是以我們安裝ruby
yum install ruby
yum install rubygems
gem install redis --version3.0.0 (需要自己下載下傳) ( 安裝redis和ruby的接口 )
這樣就代表安裝成功了
使用 ruby 腳本搭建叢集。
進入redis源碼目錄中的src目錄 執行下面的指令
./redis-trib.rb create --replicas 1 IP:7003 IP:7004 IP:7005 IP:7006 IP:7007 IP:7008
最後如下圖這樣:
可以看到是3主3從的關系
前面的m是代表Master , s代表Slave
spring boot小demo
依賴:
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
application.yml
spring:
redis:
cluster:
nodes: IP:7003,IP:7004,IP:7005,IP:7006,IP:7007,IP:7008
max-redirects: 6
代碼:
@SpringBootTest
public class RedisTest {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void test1(){
System.out.println(redisTemplate.hasKey("name"));
}
}
haskey是判斷是否有這個鍵,在這裡是用來判斷叢集是否配置成功。
輸出結果為:
搭建就這裡已經成功了,有什麼錯誤修正的地方請留言,謝謝。