1. 程式人生 > >Redis 叢集搭建與連線

Redis 叢集搭建與連線

1.Redis 安裝

2.Redis 叢集介紹

2.1 redis-cluster架構圖

edis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點

Key:a
計算a的hash值,例如值為100,100這個槽在server1上,所以a應該放到server1.

Key:hello
Hash值:10032,此槽在server2上。Hell可以應該存在server2.

2.2  redis-cluster投票:容錯

(1)領著投票過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.
(2):什麼時候整個叢集不可用(cluster_state:fail)? 
    a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.
    b:如果叢集超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.
  ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

3 Redis叢集搭建

3.1 我的叢集結構

<span style="font-size:14px;font-weight: normal;">叢集中有三個節點的叢集,每個節點有一主一備。需要6臺虛擬機器。
搭建一個偽分散式的叢集,使用6個redis例項來模擬。
所有redis  都安裝在一個虛擬機器裡,即共用一個Ip,埠不同。(埠分別為6379,7001,7002,7003,7004,7005,7006)</span>

3.2搭建叢集需要的環境

搭建叢集需要安裝Ruby 和Redis的介面

如果系統沒有Ruby,那麼 在搭建叢集的時候會報如圖所示的錯誤

/usr/bin/env: ruby: No such file or directory

如果系統沒有Redis介面,那麼在搭建的時候會報這樣的錯誤

/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25

3.2.1Ruby 安裝

yum install ruby

yum install rubygems

3.2.2 Redis介面安裝

方法一: 使用命令 gem install redis 。使用gem直接安裝可能會出現網路不通,無法安裝的情況,故推薦方法二。

方法二:離線安裝

將redis-3.2.1.gem 包拷貝至 /usr/local 目錄下

使用gem命令安裝: gem install redis-3.0.0.gem 

3.2 Redis叢集搭建

3.2.1 建立Redis例項

在Redis 安裝目錄下拷貝如下檔案到一個新的資料夾(我命名為redis01,redis02....以此類推)

修改每個redis下的redis.conf  將 cluster-enabled 後的值設為 yes ,如圖所示

在Redis 安裝目錄下拷貝ruby指令碼(redis-trib.rb)拷貝到 redis01 的同級目錄下

建立叢集

./redis-trib.rb create --replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 
192.168.25.153:7004 192.168.25.153:7005  192.168.25.153:7006

192.168.25.103 為虛擬機器Ip.
如果沒安裝Rub 會報錯 

/usr/bin/env: ruby: No such file or directory

解決方式見上文

建立Redis叢集啟動與停止檔案

vim start.sh

輸入以下內容

cd redis01
./redis-server redis.conf
cd ../redis02
./redis-server redis.conf
cd ../redis03
./redis-server redis.conf
cd ../redis04
./redis-server redis.conf
cd ../redis05
./redis-server redis.conf
cd ../redis06
./redis-server redis.conf
cd ..

vim shutdown.sh

輸入以下內容

redis01/redis-cli -p 7001 shutdown
redis02/redis-cli -p 7002 shutdown
redis03/redis-cli -p 7003 shutdown
redis04/redis-cli -p 7004 shutdown
redis05/redis-cli -p 7005 shutdown
redis06/redis-cli -p 7006 shutdown

啟動  ./start.sh

檢視是否啟動  命令 ps aux|grep redis 發現有

root      64055  0.0  0.9 137436  9464 ?        Ssl  12:44   0:08 ./redis-server *:7001 [cluster]

....

停止 ./shutdown.sh

檢視是否停止 命令 ps aux|grep redis 發現沒有啟動後的內容,則說明停止成功


 

4 連線Redis

4.1圖形化介面客戶端   --  RedisDesktopManager

缺點:不能連線叢集,智慧連線一個單獨的

4.2 redis-cli

使用Redis 自帶的 redis-cli 連線

連線一個單獨的Redis   :cd 到一個Redis 目錄下 使用命令 ./redis-cli -h 192.168.204.131 -p 6379

連線叢集則在其後加入一個 -c 即 ./redis-cli -h 192.168.204.131 -p 6379 -c

4.3 Jedis 連線(Java連線)

然後就是編寫程式碼。這裡我寫一個小demo 給做個參考

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;

public class JedisTest {

	@Test
	public void testJedisSingle() {
		//建立jedis物件
		Jedis jedis = new Jedis("192.168.204.131", 6379);
		//呼叫jedis物件的方法,方法名稱和redis 的命令一致
		jedis.set("key2", "jedis test2");
		String string = jedis.get("key1");
		System.out.println(string);
		//關閉jedis
		jedis.close();
	}
	
	
	/**
	 *使用jedis連線池 
	 */
	@Test
	public void testJedisPool(){
		JedisPool jedisPool = new JedisPool("192.168.204.131", 6379);
		//獲得jedis 連線物件
		Jedis jedis = jedisPool.getResource();
		System.out.println(jedis.get("key1"));
		jedis.close();
	}
	/**
	 * 叢集連線測試
	 */
	@Test
	public void testJedisCluster(){
		Set<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("192.168.204.131", 7001));
		nodes.add(new HostAndPort("192.168.204.131", 7002));
		nodes.add(new HostAndPort("192.168.204.131", 7003));
		nodes.add(new HostAndPort("192.168.204.131", 7004));
		nodes.add(new HostAndPort("192.168.204.131", 7005));
		nodes.add(new HostAndPort("192.168.204.131", 7006));
		JedisCluster cluster = new JedisCluster(nodes );
		cluster.set("key1", "1000");
		System.out.println(cluster.get("key1"));
	}
}


至此,Redis 叢集安裝測試完結,感謝閱讀。

以上為個人在安裝配置Redis 時的經驗,如有重複,望見諒。