1. 程式人生 > >輕鬆搭建Redis快取高可用叢集

輕鬆搭建Redis快取高可用叢集

1、Redis叢集方案比較
哨兵模式


在redis3.0以前的版本要實現叢集一般是藉助哨兵sentinel工具來監控master節點的狀態,如果master節點異常,則會做主從切換,將某一臺slave作為master,哨兵的配置略微複雜,並且效能和高可用性等各方面表現一般,特別是在主從切換的瞬間存在訪問瞬斷的情況高可用叢集模式
 

redis叢集是一個由多個主從節點群組成的分散式伺服器群,它具有複製、高可用和分片特性。Redis叢集不需要sentinel哨兵也能完成節點移除和故障轉移的功能。需要將每個節點設定成叢集模式,這種叢集模式沒有中心節點,可水平擴充套件,據官方文件稱可以線性擴充套件到1000節點。redis叢集的效能和高可用性均優於之前版本的哨兵模式,且叢集配置非常簡單2、redis高可用叢集搭建
redis安裝
 
下載地址:http://redis.io/download安裝步驟:⦁ 安裝gcc yum install gcc
⦁ 把下載好的redis-3.0.0-rc2.tar.gz放在/usr/local資料夾下,並解壓 tar -zxvf redis-3.0.0-rc2.tar.gz
⦁ 進入到解壓好的redis-3.0.0目錄下,進行編譯make
⦁ 進入到redis-3.0.0/src目錄下進行安裝,安裝完成驗證src目錄下是否已經生成了redis-server 和redis-cilmake install
⦁ 建立倆個資料夾存放redis命令和配置檔案 mkdir -p /usr/local/redis/etcmkdir -p /usr/local/redis/bin
⦁ 把redis-3.0.0下的redis.conf複製到/usr/local/redis/etc下 cp redis.conf /usr/local/redis/etc/
⦁ 移動redis-3.0.0/src裡的幾個檔案到/usr/local/redis/bin下mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
⦁ 啟動並指定配置檔案/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf(注意要使用後臺啟動,所以修改redis.conf裡的daemonize改為yes)
⦁ 驗證啟動是否成功 ps -ef | grep redis
⦁ 檢視是否有redis服務或者檢視埠 netstat -tunpl | grep 6379
⦁ 進入redis客戶端/usr/local/redis/bin/redis-cli
⦁ 退出客戶端quit
⦁ 退出redis服務:(1)pkill redis-server(2)kill 程序號(3)/usr/local/redis/bin/redis-cli shutdown
 
redis叢集搭建
 redis叢集需要至少要三個master節點,我們這裡搭建三個master節點,並且給每個master再搭建一個slave節點,總共6個redis節點,由於節點數較多,這裡採用在一臺機器上建立6個redis例項,並將這6個redis例項配置成叢集模式,所以這裡搭建的是偽叢集模式,當然真正的分散式叢集的配置方法幾乎一樣,搭建偽叢集的步驟如下:
 第一步:在/usr/local下建立資料夾redis-cluster,然後在其下面分別建立6個資料夾如下(1)mkdir -p /usr/local/redis-cluster(2)mkdir 8001、 mkdir 8002、 mkdir 8003、 mkdir 8004、 mkdir 8005、 mkdir 8006
第一步:把之前的redis.conf配置檔案copy到8001下,修改如下內容:(1)daemonize yes(2)port 8001(分別對每個機器的埠號進行設定)(3)bind 192.168.0.60(必須要綁定當前機器的ip,這裡方便redis叢集定位機器,不繫結可能會出現迴圈查詢叢集節點機器的情況)(4)dir /usr/local/redis-cluster/8001/(指定資料檔案存放位置,必須要指定不同的目錄位置,不然會丟失資料)(5)cluster-enabled yes(啟動叢集模式)(6)cluster-config-file nodes-8001.conf(這裡800x最好和port對應上)(7)cluster-node-timeout 5000(8)appendonly yes
第三步:把修改後的配置檔案,分別 copy到各個文夾下,注意每個檔案要修改第2、4、6項裡的埠號,可以用批量替換::%s/源字串/目的字串/g
第四步:由於 redis叢集需要使用 ruby命令,所以我們需要安裝 ruby (1)yum install ruby(2)yum install rubygems(3)gem install redis --version 3.0.0(安裝redis和 ruby的接囗)
第五步:分別啟動6個redis例項,然後檢查是否啟動成功(1)/usr/local/redis/bin/redis-server /usr/local/redis-cluster/800*/redis.conf(2)ps -ef | grep redis 檢視是否啟動成功第六步:在redis3的安裝目錄下執行 redis-trib.rb命令建立整個redis叢集(1)cd /usr/local/redis3/src(2)./redis-trib.rb create --replicas 1 192.168.0.60:8001 192.168.0.60:8002 192.168.0.60:8003 192.168.0.60:8004 192.168.0.60:8005 192.168.0.60:8006
第七步:驗證叢集:(1)連線任意一個客戶端即可:./redis-cli -c -h -p (-c表示叢集模式,指定ip地址和埠號)如:/usr/local/redis/bin/redis-cli -c -h 192.168.0.60 -p 800*(2)進行驗證: cluster info(檢視叢集資訊)、cluster nodes(檢視節點列表)(3)進行資料操作驗證(4)關閉叢集則需要逐個進行關閉,使用命令:/usr/local/redis/bin/redis-cli -c -h 192.168.0.60 -p 800* shutdown
 PS:當出現叢集無法啟動時,刪除臨時的資料檔案,再次重新啟動每一個redis服務,然後重新構造叢集環境。3、Java操作redis叢集藉助redis的java客戶端jedis可以操作以上叢集,引用jedis版本的maven座標如下:
 
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency>
 
Java編寫訪問redis叢集的程式碼非常簡單,如下所示:
 
import java.io.IOException;import java.util.HashSet;import java.util.Set;import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig;
/**⦁ 訪問redis叢集⦁ @author aaron.rao⦁ */public class RedisCluster{public static void main(String[] args) throws IOException{Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>(); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8001)); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8002)); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8003)); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8004)); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8005)); jedisClusterNode.add(new HostAndPort("192.168.0.60", 8006));
JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(10);config.setTestOnBorrow(true);JedisCluster jedisCluster = new JedisCluster(jedisClusterNode, 6000, 10,config);System.out.println(jedisCluster.set("student", "aaron"));System.out.println(jedisCluster.set("age", "18"));System.out.println(jedisCluster.get("student"));System.out.println(jedisCluster.get("age"));jedisCluster.close();}}執行效果如下:OKOKaaron18