Redis叢集的搭建與主從複製,redis-cluster
注意:我是搭建的偽叢集,我在一個伺服器上啟動了6個redis ,ip地址一致埠號不同;與搭建正式叢集方法一致,只是正式叢集用了6臺伺服器,IP地址不同,埠號一致;
- Redis叢集的搭建
- redis-cluster架構圖
redis-cluster投票:容錯
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
(4)redis-cluster
Redis 叢集中內建了 16384 個雜湊槽,當需要在 Redis 叢集中放置一個 key-value 時,redis 先對 key 使用 crc16 演算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的雜湊槽,redis 會根據節點數量大致均等的將雜湊槽對映到不同的節點
-
- Redis叢集的搭建
Redis叢集中至少應該有三個節點。要保證叢集的高可用,需要每個節點有一個備份機。
Redis叢集至少需要6臺伺服器。
搭建偽分散式。可以使用一臺虛擬機器執行6個redis例項。需要修改redis的埠號7001-7006
-
-
- 叢集搭建環境
-
1、使用ruby指令碼搭建叢集。需要ruby的執行環境。
安裝ruby
yum install ruby
yum install rubygems
- 安裝ruby指令碼執行使用的包。
將 redis-3.0.0.gem.tar.gz上傳到根目錄
拷貝redis-3.0.0/src下的ruby指令碼到redis-cluster下
-
-
- 搭建步驟
-
需要6臺redis伺服器。搭建偽分散式。
需要6個redis例項。
需要執行在不同的埠7001-7006
建立6個redis例項:
- 建立資料夾/usr/local/redis-cluster
- 複製redis/bin6份到/usr/local/redis-cluster
- 修改埠號和cluster-enable
注意,每個reids總必須將資料儲存檔案和恢復檔案刪除
逐個修改埠號
第二步:啟動每個redis例項。
寫指令碼啟動例項
注意:這裡圖片裡的 ./ 去掉,事錯誤的 ;
修改批出裡檔案許可權
建立關閉叢集的指令碼:
[[email protected] redis-cluster]# chmod u+x shutdown-all.sh
第三步:使用ruby指令碼搭建叢集。
./redis-trib.rb create --replicas 1 192.168.11.194:7001 192.168.11.194:7002 192.168.11.194:7003 192.168.11.194:7004 192.168.11.194:7005 192.168.11.194:7006 |
-
- 叢集的使用方法
Redis-cli連線叢集。
[[email protected] redis-cluster]# redis01/redis-cli -p 7002 -c
-c:代表連線的是redis叢集
叢集程式碼:
package com.igeek.jedis;
import java.util.HashSet;
import java.util.Set;
import org.junit.Test;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
/**
* @author www.igeehome.com
*
* TODO
*
* 2018年11月14日下午8:47:46
*/
public class JedisClusterTest {
@Test
public void testJedisCluster(){
Set<HostAndPort> nodes = new HashSet<HostAndPort>();
nodes.add(new HostAndPort("192.168.229.112", 7001));
nodes.add(new HostAndPort("192.168.229.112", 7002));
nodes.add(new HostAndPort("192.168.229.112", 7003));
nodes.add(new HostAndPort("192.168.229.112", 7004));
nodes.add(new HostAndPort("192.168.229.112", 7005));
nodes.add(new HostAndPort("192.168.229.112", 7006));
//連線叢集
JedisCluster cluster = new JedisCluster(nodes );
String set = cluster.set("uname", "zhangsan");
System.out.println(set);
}
}
單服務程式碼操作:
package com.igeek.jedis;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* @author www.igeehome.com
*
* TODO
*
* 2018年11月14日下午7:27:22
*/
public class JedisTest {
Jedis jedis = null;
JedisPool pool = null;
@Before
public void before(){
//jedis = new Jedis("192.168.229.112", 6379);
//pool = new JedisPool("192.168.229.112", 6379); //預設配置
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxIdle(20);
config.setMaxTotal(50);
pool = new JedisPool(config, "192.168.229.112", 6379);
jedis = pool.getResource();
}
@Test
public void testOther(){
boolean flag = jedis.exists("jlist1");
Long incr = jedis.incr("k1");
jedis.expire("jlist", 50);
Long ttl = jedis.ttl("jlist");
}
@Test
public void testList1(){
List<String> lrange = jedis.lrange("jlist", 0, -1);
System.out.println(lrange);
}
@Test
public void testList(){
jedis.lpush("jlist", "1","2","3");
}
@Test
public void testHash(){
jedis.hset("user1", "name", "zhangsan");
jedis.hset("user1", "age", "18");
jedis.hset("user1", "gender", "1");
}
@Test
public void testGet(){
Jedis jedis = new Jedis("192.168.229.112", 6379);
String name = jedis.get("stuname");
System.out.println(name);
}
@Test
public void testConnRedis(){
Jedis jedis = new Jedis("192.168.229.112", 6379);
jedis.set("jedisK1", "testjedis");
}
}