为什么要用redis-cluster

1.并发问题

redis官方生成可以达到 10万/每秒,每秒执行10万条命令假如业务需要每秒100万的命令执行呢?

2.数据量太大

一台服务器内存正常是16~256G,假如你的业务需要500G内存,

新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。

各大企业集群方案:
twemproxy由Twitter开源
Codis由豌豆荚开发,基于GO和C开发
redis-cluster官方3.0版本后的集群方案

解决方案如下

  1. 配置一个超级牛逼的计算机,超大内存,超强cpu,但是问题是。。。。

2.正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力,一堆机器做一件事

客户端分片

redis3.0集群采用P2P模式,完全去中心化,将redis所有的key分成了16384个槽位,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。

redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上

数据分布原理图

数据分布理论

分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。

常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。

  • 节点取余分区
  • 一致性哈希分区
  • 虚拟槽分区(redis-cluster采用的方式)

顺序分区

哈希分区

节点取余

例如按照节点取余的方式,分三个节点

1~100的数据对3取余,可以分为三类

  • 余数为0
  • 余数为1
  • 余数为2

那么同样的分4个节点就是hash(key)%4

节点取余的优点是简单,客户端分片直接是哈希+取余

一致性哈希

客户端进行分片,哈希+顺时针取余

虚拟槽分区

Redis Cluster采用虚拟槽分区

虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。

Redis Cluster槽的范围是0 ~ 16383。

槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展,

每个节点负责一定数量的槽。

搭建redis cluster

搭建集群分为几部

  • 准备节点(几匹马儿)
  • 节点通信(几匹马儿分配主从)
  • 分配槽位给节点(slot分配给马儿)

redis-cluster集群架构

多个服务端,负责读写,彼此通信,redis指定了16384个槽。多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。ruby的脚本自动就把分配槽位这事做了

安装方式

官方提供通过ruby语言的脚本一键安装

1.环境准备

通过配置,开启redis-cluster

port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes   #开启集群模式
cluster-config-file nodes-7000.conf  #集群内部的配置文件
cluster-require-full-coverage no  #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no

redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。

每个节点仅仅是端口运行的不同!

[root@yugo /opt/redis/config 17:12:30]#ls
redis-7000.conf  redis-7002.conf  redis-7004.conf
redis-7001.conf  redis-7003.conf  redis-7005.conf

#确保每个配置文件中的端口修改!!

2.运行redis实例

创建6个节点的redis实例

 1855  2018-10-24 15:46:01 redis-server redis-7000.conf1856  2018-10-24 15:46:13 redis-server redis-7001.conf1857  2018-10-24 15:46:16 redis-server redis-7002.conf1858  2018-10-24 15:46:18 redis-server redis-7003.conf1859  2018-10-24 15:46:20 redis-server redis-7004.conf1860  2018-10-24 15:46:23 redis-server redis-7005.conf

检查日志文件

cat 7000.log

检查redis服务的端口、进程

netstat -tunlp|grep redisps -ef|grep redis

此时集群还不可用,可以通过登录redis查看

redis-cli -p 7000
set hello world(error)CLUSTERDOWN The cluster is down

3.创建开启redis-cluster

准备ruby环境

  1. 下载、编译、安装Ruby
  2. 安装rubygem redis
  3. 安装redis-trib.rb命令

第一步,安装ruby(这些命令可以放入一个sh脚本文件里)

#下载ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz

#安装ruby
tar -xvf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby/
make && make install
#准备一个ruby命令#准备一个gem软件包管理命令
#拷贝ruby命令到path下/usr/local/ruby
cp /opt/ruby/bin/ruby /usr/local/cp bin/gem /usr/local/bin

安装ruby gem 包管理工具

wget http://rubygems.org/downloads/redis-3.3.0.gem

gem install -l redis-3.3.0.gem
#查看gem有哪些包
gem list -- check redis gem

安装redis-trib.rb命令

[root@yugo /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/

一键开启redis-cluster集群

#每个主节点,有一个从节点,代表--replicas 1redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005

#集群自动分配主从关系  7000、7001、7002为 7003、7004、7005 主动关系

查看集群状态

redis-cli -p 7000 cluster info  redis-cli -p 7000 cluster nodes  #等同于查看nodes-7000.conf文件节点信息集群主节点状态
redis-cli -p 7000 cluster nodes | grep master
集群从节点状态
redis-cli -p 7000 cluster nodes | grep slave

安装完毕后,检查集群状态

[root@yugo /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10468
cluster_stats_messages_pong_sent:10558
cluster_stats_messages_sent:21026
cluster_stats_messages_ping_received:10553
cluster_stats_messages_pong_received:10468
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:21026

测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数

127.0.0.1:7000> set name chao
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> exit
[root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000
127.0.0.1:7000> ping
PONG
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> get name
-> Redirected to slot [5798] located at 127.0.0.1:7001
"chao"

集群ok

工作原理:

redis客户端任意访问一个redis实例,如果数据不在该实例中,通过重定向引导客户端访问所需要的redis实例

转载于:https://www.cnblogs.com/pyyu/p/9844093.html

redis-cluster配置相关推荐

  1. redis cluster 添加 删除 重分配 节点

    redis cluster配置好,并运行一段时间后,我们想添加节点,或者删除节点,该怎么办呢. 一,redis cluster命令行 //集群(cluster) CLUSTER INFO 打印集群的信 ...

  2. redis cluster配置文件和集群状态详解

    Redis cluster命令 集群(cluster)   cluster info       打印集群的信息 cluster nodes   列出集群当前已知的所有节点(node),以及这些节点的 ...

  3. 记一次 Redis Cluster 宕机引发的事故

    关注我们,获得更多资源 导读: Redis官方号称支持并发11万读操作,并发8万写操作.由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Re ...

  4. redis cluster中添加删除重分配节点例子

    redis cluster中添加删除重分配节点例子 作者:用户 来源:互联网 时间:2016-05-05 10:22:27 摘要: 本文讲的是redis cluster中添加删除重分配节点例子, re ...

  5. Redis Cluster 宕机引发的事故

    导读: Redis官方号称支持并发11万读操作,并发8万写操作.由于优异的性能和方便的操作,相信很多人都在项目中都使用了Redis,为了不让应用过分的依赖 Redis服务,Redis的作用只作为提升应 ...

  6. 基于redis 5的redis cluster 部署

    1.创建redis cluster集群的环境准备 每个redis节点采用相同的redis版本.相同的密码.硬件配置 每个redis服务器必须没有任何数据 准备六台主机,地址如下 10.0.0.6 10 ...

  7. redis cluster 安装配置

    一.redis集群安装配置 1.下载redis源码包并下载 wget http://download.redis.io/releases/redis-3.0.7.tar.gz $ tar xzf re ...

  8. redis cluster 集群 安装 配置 详解

    redis cluster 集群 安装 配置 详解 张映 发表于 2015-05-01 分类目录: nosql 标签:cluster, redis, 安装, 配置, 集群 Redis 集群是一个提供在 ...

  9. Redis cluster集群原理与配置

    Redis cluster集群原理与配置 一.cluster集群原理 1.数据迁移 过程 2.复制以及故障转移 故障检测 故障转移 二.配置cluster集群 1.创建文件夹 2.编辑 7001.co ...

  10. Redis Cluster集群配置

    Redis Cluster集群配置 背景:Redis Cluster 提供了一种运行 Redis 安装的方法,其中数据 在多个 Redis 节点之间自动分片. 一.下载安装 1.下载安装redis w ...

最新文章

  1. python画小猪佩奇
  2. 初版python计算器
  3. 需求工程阅读笔记01
  4. Python中安装moveit_commander,顺带解决rospy模块未安装问题
  5. 基层数字化治理困境如何破局?
  6. BUAA - Team Review Score
  7. 华三交换机路由器图标_弱电箱网口不够用,用华三8口千兆交换机搞定
  8. leetcode —— 面试题68 - I. 二叉搜索树的最近公共祖先
  9. Mac下安装Flink的local模式(flink-1.0.2)
  10. 开发者友好性和易用性
  11. 探寻C++最快的读取文件的方案
  12. 操作系统复习笔记(三)
  13. 【JAVA】-- 坦克大战全部代码
  14. keil5怎么放大字体_keil5不同字体不全 keil字体放大快捷键
  15. 三极管当做开关的导通方式
  16. s7 modbus测试软件,S7-1200 Modbus-Tcp通讯测试
  17. 32位微型计算机能不能安装64位操作系统,32位cpu能装64位系统吗|32位cpu可以装64位系统吗...
  18. 【小程序】小程序安卓,ios,ipad兼容问题
  19. 有关OLE对象的使用(1)
  20. 23计算机考研复习规划和经验分享

热门文章

  1. 算法提高 c++_ch04_02_修正版
  2. mysql条件填充命令_mysql的简单命令
  3. c语言中的文件类型只有文本文件一种,C语言中的文件类型只有哪两种_后端开发...
  4. 如何做网络推广告诉你如何更新网站内容会提升索引收录?
  5. 浅析企业网站从何开始了解百度蜘蛛?
  6. 2020年网站优化思路从哪着手?
  7. 积累有价值的seo资源提高网站优化效果
  8. 网站seo优化相关性需要了解哪三方面内容?
  9. linux模拟树莓派,树莓派使用入门:树莓派上的模拟器和原生 Linux 游戏
  10. springboot默认开启事务吗_香~Spring Boot 应用也可以有配置中心。