文章目录

  • 前言
  • Redis集群分片
    • 槽位分片举例:
  • Redis集群节点复制
  • Redis集群故障转移
  • 全分布式集群搭建
  • Redis集群总结

前言

之前我们介绍了Twitter的解决方案,推出了路由代理的模式。代理来对key哈希取模,带来了几个问题:
1.代理单点,要做高可用
2.hash稳定算法,一旦服务器数量增加,就得把所有的数据全量再分发。
3.就算服务器没变,也有可能key的特殊,导致哈希取模的值大多数都集中在某一台机器上,造成数据倾斜。这就得做数据迁移了。

3.0后开始支持redis集群,由多个Redis服务器组成的分布式网络服务集群,每一个Redis服务器称为节点Node,节点之间会互相通信。两两相连,Redis集群无中心节点

Redis集群分片

1.集群将整个数据库分为16384个槽位slot,所有key都数据这些slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16为16位的循环冗余校验和函数

2.集群中的每个主节点都可以处理0个至16383个槽,当16384个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求

槽位分片举例:

三个主节点7000、7001、7002平均分片16384个slot槽位
节点7000指派的槽位为0到5060
节点7001指派的槽位为5461到10022
节点7002指派的槽位为10923到16383
节点7003指派的槽位为5061到5460,10023-10922
就算服务器增加,算法无需改变。就算有数据迁移,工作量也大大降低了。
就算发生数据倾斜,也可以通过改变槽位管理范围来维持平衡。比如0-5000,5000-10000。如果大部分数据都集中在4000-5000,可以改变这两个槽位的范围:0-4000,4000-10000

3.0之前哨兵只监控master和slaves节点,3.0之后,redis主节点角色变了,既是主节点,也是哨兵。一旦主节点挂了,slave立刻提升为master。横向的3个节点扩充存储能力,根据哈希槽来进行sharding分片,散列在不同主节点上。然后每个主节点都有从节点。两者的结合,既能保证横向存储扩展能力(切片),又能保证纵向的高可用(镜像全量)。

Redis集群节点复制

1.Redis集群的每个节点都有两种角色可选:主节点master node、从节点slave node。其中主节点用于存储数据,而从节点则是某个主节点的复制品
2.当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能,因为Redis集群重用了单机Redis复制特性的代码,所以集群的复制行为和我们之前介绍的单机复制特性的行为是完全一样的

Redis集群故障转移

1.Redis集群的主节点内置了类似Redis Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移
2.集群进行故障转移的方法和Redis Sentinel进行故障转移的方法基本一样,不同的是,在集群里面,故障转移是由集群中其他在线的主节点负责进行的,所以集群不必另外使用Redis Sentinel

全分布式集群搭建

上传文件夹redis-cluster:

[root@node1 ~]# cd redis-cluster/
[root@node1 redis-cluster]# ll
总用量 1432
-rw-r--r-- 1 root root 1364993 6月  20 20:24 redis-3.0.4.tar.gz
-rw-r--r-- 1 root root   92160 6月  20 20:24 redis-3.3.0.gem
drwxr-xr-x 8 root root    4096 6月  20 20:24 redis-test

解压redis:

[root@node1 redis-cluster]# tar xf redis-3.0.4.tar.gz

检查是否有gcc:

[root@node1 redis-cluster]# whereis gcc
gcc: /usr/bin/gcc /usr/lib/gcc /usr/libexec/gcc /usr/share/man/man1/gcc.1.gz

安装redis:

[root@node1 redis-3.0.4]# make && make PREFIX=/opt/software/redis/ install

之后redis就会安装到指定目录中,且哨兵和redis被揉和在一起了:

[root@node1 bin]# ll
总用量 15456
-rwxr-xr-x 1 root root 4589155 6月  20 20:38 redis-benchmark
-rwxr-xr-x 1 root root   22193 6月  20 20:38 redis-check-aof
-rwxr-xr-x 1 root root   45403 6月  20 20:38 redis-check-dump
-rwxr-xr-x 1 root root 4693130 6月  20 20:38 redis-cli
lrwxrwxrwx 1 root root      12 6月  20 20:38 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 6466397 6月  20 20:38 redis-server

配置环境变量,并重新加载配置文件:

export JAVA_HOME=/usr/java/jdk1.8.0_171-amd64
export REDIS_HOME=/opt/software/redis
export PATH=$PATH:$JAVA_HOME/bin:$REDIS_HOME/bin

安装rubby编译环境:

yum -y install ruby rubygems

redis-cluster 目录下安装 redis gem 模块:

gem install --local redis-3.3.0.gem

打开6个单节点,分别打开对应的7*文件,统一执行:

redis-server r*

分发槽位: 在/root/redis-cluster/redis-3.0.4/src目录下,找到 redis-trib.rb 这是rubby脚本执行程序,完成redis3.0集群创建

./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

以下是分配的信息展示

Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: d4cbae0d69b87a3ca2f9912c8618c2e69b4d8fab 127.0.0.1:7000slots:0-5460 (5461 slots) master
M: bc2e33db0c4f6a9065792ea63e0e9b01eda283d7 127.0.0.1:7001slots:5461-10922 (5462 slots) master
M: 5c2217a47e03331752fdf89491e253fe411a21e1 127.0.0.1:7002slots:10923-16383 (5461 slots) master
M: 3d4b31af7ae60e87eef964a0641d43a39665f8fc 127.0.0.1:7003slots: (0 slots) masterreplicates d4cbae0d69b87a3ca2f9912c8618c2e69b4d8fab
M: 710ba3c9b3bda175f55987eb69c1c1002d28de42 127.0.0.1:7004slots: (0 slots) masterreplicates bc2e33db0c4f6a9065792ea63e0e9b01eda283d7
M: 7e723cbd01ef5a4447539a5af7b4c5461bf013df 127.0.0.1:7005slots: (0 slots) masterreplicates 5c2217a47e03331752fdf89491e253fe411a21e1

自动分配了主从,自动分配了slots,所有槽都有节点处理,集群上线

在该节点上以集群的方式连接redis:事实上被放到了7002上了,因为槽位号

[root@node1 src]# redis-cli -p 7000 -c
127.0.0.1:7000> set k1 5
-> Redirected to slot [12706] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set k2 10
-> Redirected to slot [449] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get k2
"10"

登录7003获取k2,实际上是跳到7000上去了:

[root@node1 ~]# redis-cli -p 7003 -c
127.0.0.1:7003> get k2
-> Redirected to slot [449] located at 127.0.0.1:7000
"10"

此时我把7000挂掉,7003马上就报错了。经历短暂的下线,7003就会被升级为主,此时再从7003上获取k2,就直接返回了:

127.0.0.1:7003> get k2
"10"

Redis集群总结

1.Redis集群是一个由多个节点组成的分布式服务集群,它具有复制、高可用和分片特性
2.Redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,或者因为某个节点下线而导致整个集群下线
3.集群中的主节点负责处理槽(储存数据),而从节点则是主节点的复制品
4.Redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
5.集群中的每个主节点都可以负责0个至16384个槽,当16384个槽都有节点在负责时,集群进入上线状态,可以执行客户端发送的数据命令
6.主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽的命令时,它将会处理指定槽的节点的地址返回给客户端,而客户端会向正确的节点重新发送

如果需要完整地分片、复制和高可用特性,并且要避免使用代理带来的性能瓶颈和资源消耗,那么可以选择使用Redis集群;如果只需要一部分特性(比如只需要分片,但不需要复制和高可用等),那么单独选用twemproxy、Redis的复制和Redis Sentinel中的一个或多个

redis全分布式集群相关推荐

  1. 全分布式集群搭建总结

    全局分布式集群搭建 注: 如果之前搭建过伪分布式集群,则必须删除就hadoop的jar包,重新解压,因为之前配的文件有可能会冲突.   接下来是搭建集群的详细配置步骤 ~~   搭建集群之前的一些设置 ...

  2. 深入浅出百亿请求高可用Redis(codis)分布式集群揭秘

    摘要:作为noSql中的kv数据库的王者,redis以其高性能,低时延,丰富的数据结构备受开发者青睐,但是由于redis在水平伸缩性上受限,如何做到能够水平扩容,同时对业务无侵入性是很多使用redis ...

  3. Hadoop全分布式集群搭建(全网最详细,保姆级教程)

    在上一篇Hadoop环境搭建(全网最详细,保姆级教程)中已经搭建好了一个单机Hadoop环境,接下来搭建全分布式Hadoop集群 首先对Hadoop全分布示集群进行简单介绍和规划 一个集群由一个主机, ...

  4. 全分布式集群搭建流程(超详细)

    全分布式的集群搭建流程如下: 1.克隆虚拟机 2.克隆后的配置 修改网卡信息 vi /etc/udev/rules.d/70-persistent-net.rules 修改主机名 vi /etc/sy ...

  5. 搭建全分布式集群全过程

    全分布式全步骤 三台机器,分别为hdp01,hdp02,hdp03 思路是先配置hdp01,再克隆hdp02,hdp03 一.搭建hdp01 1.关闭防火墙(一般会有延迟,即使关闭了防火墙以后查看状态 ...

  6. asp.net mvc 用Redis实现分布式集群共享Session。

    1.这两天研究Redis搞分布式session问题,网上找的资料都是用ServiceStack.Redis来实现的,但是在做性能测试的时候发现最新的v4版本有限制每小时候最多请求6000次,因为官网开 ...

  7. Redis主从复制、哨兵模式和分布式集群

    为什么需要集群和高可用 为什么需要主从复制 主要是安全性和可用性的考虑,如果只有一个redis服务,一旦服务宕机,那么所有的客户端无法访问,会对业务造成很大影响,另一个是一旦硬件损坏,单机无法恢复,会 ...

  8. redis集群 + 哨兵 + zookeeper_Redis05——Redis Cluster 如何实现分布式集群

     前面一片文章,我们已经说了Redis的主从集群及其哨兵模式.本文将继续介绍Redis的分布式集群. " 在高并发场景下,单个Redis实例往往不能满足业务需求.单个Redis数据量过大会 ...

  9. Redis分布式集群

    主从同步 增量同步: Redis主节点会将自己存储在Buffer中的操作指令异步同步给从库,从节点收到同步成功指令后会像主节点上报自己同步到文件偏移量.因为Redis主库的Buffer使用的是环形数组 ...

最新文章

  1. gpio引脚介绍 树莓派3b_使用微创联合M5S空气检测仪、树莓派3b+、prometheus、grafana实现空气质量持续监控告警WEB可视化...
  2. 在Visual Studio代码中显示空白字符
  3. buu robomunication
  4. java学习论坛汇总
  5. 组件中使用_React四种组件通信详解
  6. Linux装ntfs后内存不够,Linux_安装Ubuntu后无法使用NTFS硬盘或移动硬盘,  在安装Ubuntu系统后,存在 - phpStudy...
  7. Linux必懂知识大总结(下)
  8. qfile指定从多少行开始_大牛进化路上之Linux基础命令,看看你了解多少?
  9. SQL Server 插入数据报IDENTITY_INSERT设置为off
  10. bootstrap媒体查询类型的值_Redis系列-数据类型sorted_set
  11. 如何成为架构师?7个关键的思考、习惯和经验
  12. 数据结构笔记(二十四)-- 哈夫曼编译码
  13. 图像融合评价指标:CC(Correlation Coefficient)以及余弦相关度、欧氏距离和皮尔逊相关度的通俗解释
  14. bzoj1010: [HNOI2008]玩具装箱toy
  15. c语言如何删除链表相同元素,【图片】想问一道链表题,如何删除重复元素【c语言吧】_百度贴吧...
  16. 李炎恢php学习视频教程下载
  17. 北风网android,北风网JAVA/ASP.NET/Android系列公开课视频教程入门项目必学课程
  18. cs231n assignment1 SVM详解
  19. 总结:几个分布式系统架构设计原理
  20. HardDisk读取速度

热门文章

  1. echarts前后端交互数据_如何避免前后端在数据交互方面的相爱相杀?
  2. linux常用指令_Linux系统常用指令总结
  3. redis cli 删除key 模糊_redis 常用函数
  4. 3月31日华为鸿蒙,华为鸿蒙OS Beta 3将从3月31日起推送
  5. python协程池操作mysql_在python中使用aiomysql异步操作mysql
  6. 【跃迁之路】【552天】程序员高效学习方法论探索系列(实验阶段309-2018.08.11)...
  7. 在linux系统 挂载光盘:mount时提示: you must specify the filesystem type
  8. Webservice开发流程
  9. Taro -- 微信小程序登录
  10. LeetCode 12 Integer to Roman (整数转罗马数字)