哨兵模式java
在redis3.0之前的版本要實現集羣通常是藉助哨兵sentinel工具來監控master節點的狀態,若是master節點異常,則會作主從切換,將某一臺slave做爲master,哨兵的配置略微複雜,而且性能和高可用性等各方面表現通常,特別是在主從切換的瞬間存在訪問瞬斷的狀況node
高可用集羣模式redis
redis集羣是一個由多個主從節點羣組成的分佈式服務器羣,它具備複製、高可用和分片特性。Redis集羣不須要sentinel哨兵也能完成節點移除和故障轉移的功能。須要將每一個節點設置成集羣模式,這種集羣模式沒有中心節點,可水平擴展,據官方文檔稱能夠線性擴展到1000節點。redis集羣的性能和高可用性均優於以前版本的哨兵模式,且集羣配置很是簡單ruby
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-cil make install # 創建倆個文件夾存放redis命令和配置文件 mkdir -p /usr/local/redis/etc mkdir -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實例配置成集羣模式,因此這裏搭建的是僞分佈式集羣模式,固然真正的分佈式集羣的配置方法幾乎同樣,搭建僞分佈式集羣的步驟以下:app
第一步:在/usr/local下建立文件夾redis-cluster,而後在其下面分別建立6個文件夾以下 (1)mkdir -p /usr/local/redis-cluster (2)mkdir 800一、 mkdir 800二、 mkdir 800三、 mkdir 800四、 mkdir 800五、 mkdir 8006 第一步:把以前的redis.conf配置文件copy到8001下,修改以下內容: (1)daemonize yes (2)port 8001(分別對每一個機器的端口號進行設置) (3)bind 192.168.0.61(必需要綁定當前機器的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到各個文夾下,注意每一個文件要修改第二、四、6項裏的端口號 第四步:因爲 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 查看是否啓動成功 第六步:在redis的安裝目錄下執行 redis-trib.rb命令 (1)cd /usr/local/redis-3.0.0/src (2)./redis-trib.rb create --replicas 1 192.168.0.61:8001 192.168.0.61:8002 192.168.0.61:8003 192.168.0.61:8004 192.168.0.61:8005 192.168.0.61:8006 第七步:驗證集羣: (1)鏈接任意一個客戶端便可:./redis-cli -c -h -p (-c表示集羣模式,指定ip地址和端口號)如:/usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 800* (2)進行驗證: cluster info(查看集羣信息)、cluster nodes(查看節點列表) (3)進行數據操做驗證 (4)關閉集羣則須要逐個進行關閉,使用命令: /usr/local/redis/bin/redis-cli -c -h 192.168.0.61 -p 800* shutdown PS:當出現集羣沒法啓動時,刪除redis的臨時數據文件,再次從新啓動每個redis服務,而後從新構造集羣環境。
藉助redis的java客戶端jedis能夠操做以上集羣,引用jedis版本的maven座標以下: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.61", 8001)); jedisClusterNode.add(new HostAndPort("192.168.0.61", 8002)); jedisClusterNode.add(new HostAndPort("192.168.0.61", 8003)); jedisClusterNode.add(new HostAndPort("192.168.0.61", 8004)); jedisClusterNode.add(new HostAndPort("192.168.0.61", 8005)); jedisClusterNode.add(new HostAndPort("192.168.0.61", 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(); } }
運行效果以下: OK OK aaron 18
更多關於Redis深刻學習的文章請掃描下方二維碼關注微信公號「輕風吟」工具