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 時的經驗,如有重複,望見諒。