1. 程式人生 > >Redis-3.2.4叢集配置(RedisCluster+SpringBoot+Jedis)

Redis-3.2.4叢集配置(RedisCluster+SpringBoot+Jedis)

來源http://blog.csdn.net/zhe1110/article/details/52993082

部署計劃 部署6個redis節點,為3主3從。
IP地址
6379 192.168.101.121
6379
192.168.101.199
6379
192.168.101.123
6379
192.168.101.127
6379
192.168.101.125
6379
192.168.101.126
編譯安裝 (所有關於許可權問題全部sudo,啟動服務 sudo ./redis-server /data/redis/conf/redis.conf,真實環境下,若是以一個較低的許可權啟動redis,那麼就可能產生無法建立日誌以及rdb的問題) 建立目錄 mkdir redis     cd redis
    tar zxvf redis-3.2.4.tar.gz
    cd redis-3.2.4 make make install PREFIX=/data/redis-3.2.4    //預設安裝到/usr/local/bin目錄下。這裡指定安裝目錄data/redis-3.2.4
 ln -s /data/redis-3.2.4 /data/redis    //軟連線 mkdir /data/redis/conf    //建立目錄結構 mkdir /data/redis/log mkdir /data/redis/data     cp /home/redis/redis/redis-3.2.4/redis.conf /data/redis/conf/    //copy配置檔案     vim /data/redis/conf/redis.conf redis的配置     protected-mode no    //關閉保護模式     port 6379    //埠     daemonize yes    //守護程序開啟,預設服務從後臺啟動
    loglevel verbose//日誌級別     logfile /data/redis/log/redis-6379.log    //日誌檔案位置     ==redis持久化rdb,AOF相關==     dbfilename dump.rdb    //redis持久化檔名稱     dir /data/redis/data/6379    //redis持久化檔案路徑,預設為當前路徑 appendonly yes    //開啟AOF appendfilename "appendonly.aof"    //AOF檔名稱     no-appendfsync-on-rewrite yes    //子程序在做rewrite時,主程序不呼叫fsync(由核心預設排程)     ==REPLICATION== slave-serve-stale-data yes    //當slave與master斷開連線,slave繼續提供服務     slave-read-only yes     repl-ping-slave-period 1    //slave ping master的時間間隔,單位為秒     repl-timeout 10    //複製超時,單位為秒,須大於repl-ping-slave-period的值  ==REDIS CLUSTER==
    cluster-enabled yes    //開啟叢集配置     cluster-config-file nodes-6379.conf    //節點配置檔案,這個檔案是服務啟動時自己配置建立的     cluster-node-timeout 5000    //叢集中各節點相互通訊時,允許"失聯"的最大毫秒數,如果超過沒向其它節點彙報成功,就認為該節點已掛。
    cluster-slave-validity-factor 0    //將該項設定為0,不管slave節點和master節點間失聯多久都會一直嘗試failover     repl-ping-slave-period 1 其他5臺機器配置     相同操作目錄可直接遠端拷貝
scp -r [email protected]:/data/redis/data /data/redis/ scp -r [email protected]:/data/redis/conf /data/redis/ scp -r [email protected]:/data/redis/log /data/redis/ 建立和啟動redis cluster前的準備工作
    yum -y install ruby    //安裝ruby     yum -y install rubygems    //安裝rubygems     wget https://rubygems.org/downloads/redis-3.3.1.gem    //安裝redis-3.3.1.gem     gem install -l redis-3.3.1.gem
    cp redis-3.2.4/src/redis-trib.rb /data/redis/bin/    //redis-trib.rb是redis官方提供的redis cluster管理工具,使用ruby實現。     ./redis-server /data/redis/conf/redis.conf    //啟動6臺服務
建立redis cluster
    redis-trib.rb create --replicas 1 192.168.101.121:6379 192.168.101.199:6379 192.168.101.123:6379 192.168.101.127:6379 192.168.101.125:6379 192.168.101.126:6379     #redis-trib.rb的create子命令構建   #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點  進入redis客戶端     redis-cli -c -p 6379    //-c進入叢集模式     info//檢視資訊 cluster nodes//檢視節點資訊 CLUSTER SLOTS//檢視插槽資訊 節點操作 ./redis-trib.rb del-node 192.168.101.121:6379 '2ff326bc9084236ee6540d58d307893662ceff0b'//刪除節點
./redis-trib.rb add-node --slave --master-id 0ecc54ed34cc7e2e1ebca168ab4564b803992094 192.168.101.121:6379 192.168.101.125:6379//新增從節點,新增前需要刪除已存在的node.conf,rdb,aof檔案 ./redis-trib.rb reshard 192.168.101.121:6379//為新節點分配slot     ./redis-trib.rb check 192.168.101.121:6379    //檢查叢集執行狀態,只要輸入任意叢集中節點即可,會自動檢查所有相關節點。     ./redis-trib.rb fix 192.168.101.121:6379    //修復叢集(若node移除了,但是並沒有移除node上面的slot,從而導致了slot總數沒有達到16384,其實也就是slots分佈不正確。所以在刪除節點的時候一定要注意刪除的是否是Master主節點)。 關於叢集建立錯誤 叢集建立的時候如果沒有建立成功,那麼需要刪除叢集節點配置檔案,不然無法重新建立叢集 sudo rm /data/redis-3.2.4/data/6379/nodes-6379.conf

如果遇到Waiting for the cluster to join .......................................................  >>> Sending CLUSTER MEET messages to join the cluster 解決方式 sudo ./redis-cli -c -p 6379    //進入客戶端 CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中。 Jedis的配置 config檔案需要新增 github上有這一句,Jedis Cluster 會自動去發現叢集中的節點,所以JedisClusterNodes只需要 add一個例項
// JedisCluster@BeanpublicJedisClusterJedisClusterFactory(){		LOG.info("JedisCluster建立!!");		LOG.info("redis地址:"+ host +":"+ port);Set<HostAndPort> jedisClusterNodes =newHashSet<HostAndPort>();JedisPoolConfig jedisPoolConfig =newJedisPoolConfig();		jedisPoolConfig.setMaxIdle(maxIdle);		jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);		jedisClusterNodes.add(newHostAndPort(host, port));JedisCluster jedisCluster =newJedisCluster(jedisClusterNodes, jedisPoolConfig);return jedisCluster;}
dao
package com.unioncast.db.rdbms.core.dao.commonDBDao.impl;import java.io.IOException;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.UUID;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Repository;import com.unioncast.common.util.JsonUtil;import com.unioncast.db.rdbms.core.dao.commonDBDao.RedisDao;import redis.clients.jedis.JedisCluster;@Repository("redisDao")publicclassRedisDaoImplimplementsRedisDao{@AutowiredJedisCluster jedisCluster;@Overridepublic<T>String addByKey(String key, T object)throwsIOException{String object2JsonString =JsonUtil.object2JsonString(object);String set = jedisCluster.set(key, object2JsonString);return set;}@Overridepublic<T>String add(T object)throwsIOException{String uuid = UUID.randomUUID().toString().trim().replaceAll("-","");String object2JsonString =JsonUtil.object2JsonString(object);		jedisCluster.set(uuid, object2JsonString);return uuid;}@OverridepublicObject getObject(String key)throwsIOException{<