一、为什么要使用redis-cluster?

1.数据并发问题
2.数据量太大
新浪微博作为世界上最大的redis存储,就超过1TB的数据,去哪买这么大的内存条?各大公司有自己的解决方案,推出各自的集群功能,核心思想都是将数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例。 各大企业集群方案:
twemproxy由Twitter开源
Codis由豌豆荚开发,基于GO和C开发
redis-cluster官方3.0版本后的集群方案
============
解决方案:
1.一台超级计算机
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

搭建集群分为几部
1.准备节点(几匹马儿)
2.节点通信(几匹马儿分配主从)
3.分配槽位给节点(slot分配给马儿)
4.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@localhost opt]# ls redis-cluster/
7000.log 7004.log dump-7002.rdb nodes-7000.conf   nodes-7004.conf   redis-7002.conf
7001.log 7005.log dump-7003.rdb nodes-7001.conf   nodes-7005.conf   redis-7003.conf
7002.log dump-7000.rdb dump-7004.rdb nodes-7002.conf   redis-7000.conf redis-7004.conf
7003.log dump-7001.rdb dump-7005.rdb nodes-7003.conf   redis-7001.conf redis-7005.conf

运行实例

[root@localhost redis-cluster]# redis-server redis-7000.conf
[root@localhost redis-cluster]# redis-server redis-7001.conf
[root@localhost redis-cluster]# redis-server redis-7002.conf
[root@localhost redis-cluster]# redis-server redis-7003.conf
[root@localhost redis-cluster]# redis-server redis-7004.conf
[root@localhost redis-cluster]# redis-server redis-7005.conf
[root@localhost redis-cluster]# ps -ef|grep redis
root 9611 1 0 08:55 ? 00:00:00 redis-server *:7000 [cluster]
root 9616 1 0 08:55 ? 00:00:00 redis-server *:7001 [cluster]
root 9621 1 0 08:55 ? 00:00:00 redis-server *:7002 [cluster]
root 9626 1 0 08:55 ? 00:00:00 redis-server *:7003 [cluster]
root 9631 1 0 08:55 ? 00:00:00 redis-server *:7004 [cluster]
root 9636 1 0 08:56 ? 00:00:00 redis-server *:7005 [cluster]
root 9642 8992 0 08:56 pts/0 00:00:00 grep --color=auto redis

这时候集群还不可以用

127.0.0.1:7000> set hello world
(error) CLUSTERDOWN Hash slot not served

2.创建开启redis-cluster

准备ruby环境

下载、编译、安装Ruby

安装rubygem redis

安装redis-trib.rb命令

1.安装ruby

#下载ruby
wget https://cache.ruby-china.com/pub/ruby/ #安装ruby
tar -zxf ruby-2.3.1.tar.gz
./configure --prefix=/opt/ruby231/
make && make install #准备一个ruby命令
#准备一个gem软件包管理命令
#拷贝ruby命令到path下/usr/local/ruby
cp /opt/ruby231/bin/ruby /usr/local/
cp bin/gem /usr/local/bin

2.安装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

3.安装redis-trib.rb

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

4.一键开启redis-cluster

[root@localhost opt]# redis-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

5.查看集群状态

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@localhost opt]# 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:31
cluster_stats_messages_pong_sent:38
cluster_stats_messages_sent:69
cluster_stats_messages_ping_received:33
cluster_stats_messages_pong_received:31
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:69
[root@localhost opt]# redis-cli -p 7000 cluster nodes
60b1c0a3753d9534c5521df940025a88c0188a24 127.0.0.1:7002@17002 master - 0 1614045706068 3 connected 10923-16383
2a17b7573c8c99682f353c8e1b4bc2adbff90c39 127.0.0.1:7003@17003 slave facb9aecd1c2a17d992cc9372531abbb8535d834 0 1614045703000 4 connected
facb9aecd1c2a17d992cc9372531abbb8535d834 127.0.0.1:7000@17000 myself,master - 0 1614045705000 1 connected 0-5460
d55c2ad6bbb483a4c8be560527f537a531ef2df9 127.0.0.1:7005@17005 slave 60b1c0a3753d9534c5521df940025a88c0188a24 0 1614045705000 6 connected
1ed8f68fa534e22160651545e86cc2f224b65a02 127.0.0.1:7004@17004 slave 7d9d16ab9d476bc80e407203f4d6f9d1b1bf0b9d 0 1614045707075 5 connected
7d9d16ab9d476bc80e407203f4d6f9d1b1bf0b9d 127.0.0.1:7001@17001 master - 0 1614045705062 2 connected 5461-10922
[root@localhost opt]# redis-cli -p 7000 cluster nodes |grep master
60b1c0a3753d9534c5521df940025a88c0188a24 127.0.0.1:7002@17002 master - 0 1614045723177 3 connected 10923-16383
facb9aecd1c2a17d992cc9372531abbb8535d834 127.0.0.1:7000@17000 myself,master - 0 1614045718000 1 connected 0-5460
7d9d16ab9d476bc80e407203f4d6f9d1b1bf0b9d 127.0.0.1:7001@17001 master - 0 1614045721000 2 connected 5461-10922
[root@localhost opt]# redis-cli -p 7000 cluster nodes |grep slave
2a17b7573c8c99682f353c8e1b4bc2adbff90c39 127.0.0.1:7003@17003 slave facb9aecd1c2a17d992cc9372531abbb8535d834 0 1614045731000 4 connected
d55c2ad6bbb483a4c8be560527f537a531ef2df9 127.0.0.1:7005@17005 slave 60b1c0a3753d9534c5521df940025a88c0188a24 0 1614045731224 6 connected
1ed8f68fa534e22160651545e86cc2f224b65a02 127.0.0.1:7004@17004 slave 7d9d16ab9d476bc80e407203f4d6f9d1b1bf0b9d 0 1614045729000 5 connected

6. 测试写入数据

[root@localhost opt]# redis-cli -c -p 7000
127.0.0.1:7000> set name lucas
-> Redirected to slot [5798] located at 127.0.0.1:7001
OK
127.0.0.1:7001> exit
[root@localhost opt]# 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
"lucas"

工作原理:

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

redis集群(redis_cluster)的更多相关文章

  1. Redis集群搭建与简单使用

    介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. 两台虚拟机都是 CentOS ,一台 ...

  2. 使用Docker构建redis集群--最靠谱的版本

    1集群结构说明 集群中有三个主节点,三个从节点,一共六个结点.因此要构建六个redis的docker容器.在宿主机中将这六个独立的redis结点关联成一个redis集群.需要用到官方提供的ruby脚本 ...

  3. redis 集群

    http://www.linuxidc.com/Linux/2015-08/121845.htm Redis3.0版本之后支持Cluster,具体介绍redis集群我就不多说,了解请看redis中文简 ...

  4. redis单机安装以及简单redis集群搭建

    安装环境: 两台虚拟机都是Centos 7.0 IP分别为:192.168.149.132  192.168.149.133 Redis采用的版本是redis-3.2.4 集群是采用两台虚拟机模拟8个 ...

  5. CentOS下redis集群安装

    环境: 一台CentOS虚拟机上部署六个节点,创建3个master,3个slave节点 1.下载并解压 cd /root wget http://download.redis.io/releases/ ...

  6. redis集群离线安装

    环境准备: redis-4.0.7.tar.gz redis的安装包 Ruby环境(集群搭建需要用ruby创建, ruby环境在2.2以上.) rubygems-2.7.4.tgz 和 redis-3 ...

  7. Redis集群搭建方案(Linux)

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串). list(链表).set(集合)和zset(有序 ...

  8. redis集群搭建及设置账户(转)

    Redis集群搭建以及为集群设置密码 介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. ...

  9. Redis 集群环境的搭建

    下载与解压 [root@localhost ~]# cd /usr/temp/ [root@localhost temp]# wget http://download.redis.io/release ...

  10. redis 集群模式安装

    概念 Redis集群提供一种方式自动将数据分布在多个Redis节点上. 每个Redis集群中的节点都需要打开两个TCP连接.一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口( ...

随机推荐

  1. 【Java】位操作符

    位运算符 java支持的位运算符有7个,分为两类:位逻辑运算和移位运算.位逻辑运算符包括按位取反(~).按位与(&).按位或(|)和按位异或(^)4种,.移位运算符包括左移(<<) ...

  2. 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query

    目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...

  3. 北京网络赛G BOXES 大模拟+BFS

    题目描述 Description There is a strange storehouse in PKU. In this storehouse there are n slots for boxe ...

  4. very useful English Acronyms in Programming for Programmer

    very useful English Acronyms in Programming for Programmer alias / shorthand / acronyms 别名 / 简写 / 缩略 ...

  5. react-parent-child-lifecycle-order

    react-parent-child-lifecycle-order react parent child lifecycle order live demo https://33qrr.csb.ap ...

  6. react hooks useEffect 取消 promise

    react hooks useEffect 取消 promise cancel promise https://github.com/facebook/react/issues/15006#issue ...

  7. betterscroll上拉加载

    mounted(){ var that=this; setTimeout(()=>{ let scroll = new BScroll(document.getElementById('wrap ...

  8. 深入理解Linux TCP backlog

    本文转载自深入理解Linux TCP backlog 当应用程序调用listen系统调用让一个socket进入LISTEN状态时,需要指定一个参数:backlog.这个参数经常被描述为,新连接队列的长 ...

  9. Error: Actions must be plain objects. Use custom middleware for async actions.

    原本代码: import { SREACH_FOCUS, SREACH_BLUR } from "./actionType" export const searchFocus = ...

  10. Project facet Java version 1.7 is not supported.解决方法

    最近遇到这个问题,在网上查到的解决方案基本都是下面几个: 1.右击项目,properties,project facets,改动java的version为1.7. 2.window,propertie ...