本文介紹一種經過Jedis和Cluster實現Redis集羣(主從)的高可用方案,該方案須要使用Jedis2.8.0(推薦),Redis3.0及以上版本(強制).html
附:
Redis Cluster集羣主從方案:http://www.cnblogs.com/soul-wonder/p/8891256.html
Redis Sentinel主從高可用方案:http://www.cnblogs.com/soul-wonder/p/8891217.html
node
爲了使在部分節點失敗或者大部分節點沒法通訊的狀況下集羣仍然可用,因此集羣使用了主從複製模型,假若有A,B,C三個節點的集羣,在沒有複製模型的狀況下,若是節點B失敗了,那麼整個集羣就會覺得缺乏5501-11000這個範圍的槽而不可用.
然而若是在集羣建立的時候咱們爲每一個節點添加一個從節點A1,B1,C1,那麼整個集羣便有三個master節點和三個slave節點組成,這樣在節點B失敗後,集羣便會選舉B1爲新的主節點繼續服務,整個集羣便不會由於槽找不到而不可用了。redis
下載redis最新的安裝包
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
解壓
tar xzf redis-3.0.7.tar.gz
安裝支持包tcl
yum install tcl 編譯原文件
make
建立集羣相關文件(方便管理)
mkdir cluster
cd cluster
mkdir 6379 6380 6381 6382 6383 6384
cluster下面每一個目錄中都建立一個redis.conf文件. 注意修改文件中的端口號:spring
port 6379 cluster-enabled yes cluster-config-file nodes_6379.conf cluster-node-timeout 5000 appendonly yes
把redis-server的可執行文件複製到cluster下面的各個目錄, 而後打開6個shell終端,進入各個目錄,啓動每一個實例, 命令以下:
./redis-server redis.confshell
檢查6個服務是否都啓動了apache
搭建集羣
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384ruby
–replicas 1 表示咱們但願爲集羣中的每一個主節點建立一個從節點。
此時報錯,發現缺乏相應的ruby環境,以下安裝相應環境:
yum install ruby
yum install rubygems
gem install redisapp
安裝好環境後再次搭建集羣
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 性能
檢測集羣節點相關信息
./redis-trib.rb check 127.0.0.1:6379 spa
能夠發現系統將前3個服務作了主節點,後3個服務做爲了從節點,而且是相對應的。
進入某個節點驗證
./redis-cli -c -h 127.0.0.1 -p 6379
能夠發現程序根據key對16384取模的值爲3488,根據hash槽的分佈跳轉到了對應的節點上。 可見集羣環境正常運行
package wusc.edu.demo.redis; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.context.support.ClassPathXmlApplicationContext; import redis.clients.jedis.JedisCluster; public class RedisClusterSpringTest { private static final Log log = LogFactory.getLog(RedisClusterSpringTest.class); public static void main(String[] args) { try { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/spring-context.xml"); context.start(); JedisCluster jedisCluster = (JedisCluster) context.getBean("jedisCluster"); int num = 1000; String key = "yingjun"; String value = ""; for (int i=1; i <= num; i++){ // 存數據 //jedisCluster.set(key+i, "yingjun"+i); //jedisCluster.setex(key+i, 60, "yingjun"+i); // 取數據 value = jedisCluster.get(key+i); log.info(key+i + "=" + value); // 刪除數據 //jedisCluster.del(key+i); //value = jedisCluster.get(key+i); //log.info(key+i + "=" + value); } context.stop(); } catch (Exception e) { log.error("==>RedisSpringTest context start error:", e); System.exit(0); } finally { log.info("===>System.exit"); System.exit(0); } } }