1. 程式人生 > >Redis叢集的搭建與主從複製,redis-cluster

Redis叢集的搭建與主從複製,redis-cluster

注意:我是搭建的偽叢集,我在一個伺服器上啟動了6個redis ,ip地址一致埠號不同;與搭建正式叢集方法一致,只是正式叢集用了6臺伺服器,IP地址不同,埠號一致;

  1. Redis叢集的搭建
    1. redis-cluster架構圖

redis-cluster投票:容錯

架構細節:

(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.

(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.

(3)客戶端與redis節點直連,不需要中間proxy.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可

(4)redis-cluster

把所有的物理節點對映到[0-16383]slot,cluster 負責維護node<->slot<->value

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

    1. Redis叢集的搭建

Redis叢集中至少應該有三個節點。要保證叢集的高可用,需要每個節點有一個備份機。

Redis叢集至少需要6臺伺服器。

搭建偽分散式。可以使用一臺虛擬機器執行6個redis例項。需要修改redis的埠號7001-7006

      1. 叢集搭建環境

1、使用ruby指令碼搭建叢集。需要ruby的執行環境。

安裝ruby

yum install ruby

yum install rubygems

  1. 安裝ruby指令碼執行使用的包。

將 redis-3.0.0.gem.tar.gz上傳到根目錄

拷貝redis-3.0.0/src下的ruby指令碼到redis-cluster下

      1. 搭建步驟

需要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

    1. 叢集的使用方法

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");
	}
}