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.gem 地址:】 redis-3.0.0.gem_免费高速下载|百度网盘-分享无限制 

拷贝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实例。

写脚本启动实例

注意:这里图片里的 ./  去掉,事错误的 ;

修改批出里文件权限

创建关闭集群的脚本:

 [root@localhost 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连接集群。

[root@localhost 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");
	}
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_无往而不胜_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值