文档章节

redis(9)、redis集群之redis Cluster使用

haoran_10
 haoran_10
发布于 2016/07/15 16:40
字数 906
阅读 225
收藏 2

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

前提:redis集群分片,目前redis有两类方案

  • 哈希槽(hash slot),代表方案:redis cluster
  • 一致性哈希,代表方案:twemproxy、codis

  本篇是针对redis cluster配置实现,原理会在另一个文章在解析。By haoran-10.iteye.com

 

 

先理解几个关键词:

节点:单个redis运行时,是孤立的,一旦出现故障,最多主从复制时,数据不会丢失,但是造成了redis不可用。redis单机,一个节点。

集群:很多节点通过某种方案联系起来,一起提供redis服务,称为redis集群。单个节点出现故障时,数据会转移(不保证强一致性)到安全的备份节点,提供高可用的redis服务,缺点是不可以使用不支持处理多个              键的命令

分片:redis数据很多时,单个redis放不下,此时redis集群通过分片技术,把数据平均分配到不同的节点。

哈希槽:redis集群通过哈希槽的方式,把数据分配到不同的节点。Redis集群有16384个哈希槽,我们只是使用键的CRC16编码对16384取模来计算一个指定键所属的哈希槽。 

 

 

1、redis节点关键配置

daemonize yes
pidfile /mytest/redis_dev/9001/redis.pid
port 9001
appendonly yes
appendfsync everysec
cluster-enabled yes
cluster-config-file nodes.conf  
cluster-node-timeout 15000

 

 首次配置,强烈建议使用6个节点,这样更能直观的理解redis集群的配置以及优点所在。

 复制成6分,9001,9002,9003,9004,9005,9006(注意改成不同的端口,不同的pid文件,nodes.conf不要理会,redis会自动创建,自动管理)

2、启动各个节点



 

3、使用redis-trib工具 创建集群 

启动成功之后,使用redis自带的工具创建集群

注,这里要安装ruby等工具

(1)、安装ruby

http://jingyan.baidu.com/article/b7001fe173fe9a0e7382dd57.html

(2)、安装ruby gem

https://rubygems.org/pages/download#formats

(3)、安装gem redis

https://rubygems.org/gems/redis/versions/3.2.2

安装过程比较简单,略过。



 

 输入"yes",继续


 

哈希槽已经分配到9001,9002,9003节点中。 

4、使用redis-cli测试


 

注意:这里是使用src/redis-cli -c 命令,才能启动客户端集群操作模式

获取操作测试:



 

从数据中可以看到,客户端是从9002端口进入,当输入set age 27 时,是自动转存到9001节点上,

当输入get age 时,也是从9001节点获取数据

 

5、容错处理测试

手动把9001节点给kill 掉


 

 

 

此时继续操作redis集群


 

自动从原先的9001的从节点9004节点(9001为主节点,9004是9001的从节点)中获取数据,说明9004自动转为主节点

 

 

6、增加节点测试

创建9007节点,启动9007

 

并且把9007节点设为9004的从节点

src/redis-trib.rb add-node --slave 127.0.0.1:9007 127.0.0.1:9004

 

从输出结果中,可以看到9007做为9004的一个复制节点,也就是从节点。

 

 

7、增加一个主节点,重新分片集群

redis-trib.rb reshard 127.0.0.1:9008

 主要是把哈希槽重新分配 

 

8、java 客户端 

貌似只有使用sharedjedis 才可以,spring-data-redis还不支持redis新的集群特性,不知道是不是姿势不对。

package wang.conge.init;

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

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

public class SharedRedisClient {
	public static void main(String[] args) {
		Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();  
        jedisClusterNodes.add(new HostAndPort("127.0.0.1", 9001));  
        
        JedisCluster jedis = new JedisCluster(jedisClusterNodes);
        
        jedis.set("nginx", "yes");
		jedis.set("tomcat", "yes");
		jedis.set("keepalived", "yes");
		jedis.set("vip", "yes");
		jedis.set("redis", "yes");
		jedis.set("mysql", "yes");
		
		String key = jedis.get("redis");
		System.out.println(key);
	}
}

 

9、小结

redis官方提供的集群方案配置太繁琐了,不过性能上也比较强悍,公司还没用到生产,拭目以待吧。

 

© 著作权归作者所有

haoran_10
粉丝 27
博文 89
码字总数 82446
作品 0
杭州
程序员
私信 提问
加载中

评论(1)

leehark
leehark
请问 有没有在生产环境下使用过redis3.0 cluster? 并发量有多少?遇到什么坑?
docker部署redis集群

一、查询最新redis镜像 docker search redis 二、下载redis镜像 docker pull redis 三、创建一个文件夹,以及创建redis-cluster.tmpl模板文件 mkdir redis-cluster-d cd redis-cluster-d por...

osc_qukgacve
2019/10/15
15
0
Redis 5.0.3集群部署

参考文章 https://blog.csdn.net/yyTomson/article/details/85783753 https://www.cnblogs.com/zy-303/p/10273167.html 1,环境两台centos7主机IP地址为:172.16.103.12和172.16.103.13 2,上......

osc_ycepdqlf
2019/04/08
4
0
Redis cluster集群:原理及搭建

Redis cluster集群:原理及搭建 2018年03月19日 16:00:55 阅读数:6120 1.为什么使用redis? redis是一种典型的no-sql 即非关系数据库 像python的字典一样 存储key-value键值对 工作在memor...

osc_g75abnjv
2018/07/27
1
0
Redis集群的离线安装以及原理理解

  本文主要是记录一下Redis集群在linux系统下离线的安装步骤,毕竟在生产环境下一般都是无法联网的,Redis的集群的Ruby环境安装过程还是很麻烦的,涉及到很多的依赖的安装,所以写了一个文...

osc_cw97bsoa
04/16
5
0
全面剖析Redis Cluster原理和应用

全面剖析Redis Cluster原理和应用 -------------------------------------------------------------------------------- 1.Redis Cluster总览 1.1 设计原则和初衷 在官方文档Cluster Spec中,......

osc_d41sfzmu
2018/07/05
1
0

没有更多内容

加载失败,请刷新页面

加载更多

检测未定义的对象属性 - Detecting an undefined object property

问题: 检查JavaScript中的对象属性是否未定义的最佳方法是什么? 解决方案: 参考一: https://stackoom.com/question/79h/检测未定义的对象属性 参考二: https://oldbug.net/q/79h/Detec...

fyin1314
55分钟前
11
0
jasypt-spring-boot提示Failed to bind properties

1 问题描述 在Spring Boot中使用jasypt-spring-boot进行加密,但是提示: Description:Failed to bind properties under 'spring.datasource.password' to java.lang.String: Reason:......

氷泠
今天
29
0
在git 2.13之前,只保存多个已更改的文件中的一个文件

问题: 如何在我的分支上只隐藏多个已更改文件中的一个? 解决方案: 参考一: https://stackoom.com/question/Cl3h/在git-之前-只保存多个已更改的文件中的一个文件 参考二: https://oldb...

技术盛宴
今天
30
0
SQL笔记:把Excel的数据导入MySQL中作运算

很多Excel用户都知道,Excel单个工作簿单张表存储的数据量很有限(旧版本月60多万条记录,新版本也才104万条不到),而且Excel中,因为自带各种格式与公式,兼之高度封装性等原因,导致Excel...

tengyulong
今天
15
0
Qt创建Application的文件依赖浅析

在使用QtCreator创建Application程序时,会自动创建***.ui文件,在文件夹“build-***-Desktop_Qt_***-Debug”中生成ui_***.h,***.ui可以通过QtDesigner进行调整,同时还会在***.ui的文件夹内...

qwz185_堡垒
今天
27
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部