1.为什么要有集群
由于Redis主从复制架构每个数据库都要保存整个集群中的所有数据,容易形成木桶效应,所以Redis3.0之后的版本添加特性就是集群(Cluster)

2.Redis集群架构说明

架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的master节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key

3.Redis Cluster环境搭建
3.1 分别修改配置文件,将端口分别设置为:6379、6380、6381,同时要设置pidfile文件为不同的路径。并且允许集群模式,修改集群配置文件指向地址,并且开启远程访问

修改配置文件
# vim /opt/redis/6379/6379.conf# 开启守护进程模式
daemonize yes# 修改启动端口为6379
port 6379# 修改pidfile指向路径
pidfile /opt/redis/6379/redis_6379.pid# 开启允许集群
cluster-enabled yes# 修改集群配置文件指向路径
cluster-config-file nodes-6379.conf# 注释一下内容开启远程访问
# bind 127.0.0.1 端口不用放开
#aof开启appendonly yes
# 关闭保护模式
#protected-mode no
以此类推,修改端口6380及6381配置。

3.2 分别启动redis实例

# cd /opt/redis/redis-3.2.8/bin
# ./redis-server /opt/redis/6379/6379.conf
# ./redis-server /opt/redis/6380/6380.conf
# ./redis-server /opt/redis/6381/6381.conf

3.3 查看redis状态

说明redis已经是以集群方式启动了,但是redis之间关系还没确定下来

3.4 因为redis-trib.rb是由ruby语言编写的所以需要安装ruby环境

安装ruby环境
# yum -y install zlib ruby rubygems#gem install redis
报异常:解决
https://www.cnblogs.com/PatrickLiu/p/8454579.html

3.5 建立集群Redis关系

首先,进入redis的安装包路径下
# cd /opt/redis/redis-3.2.8/src执行命令:
# ./redis-trib.rb create --replicas 0 192.168.29.128:6379 192.168.29.128:6380 192.168.29.128:6381说明:--replicas 0:指定了从数据的数量为0
注意:这里不能使用127.0.0.1,否则在Jedis客户端使用时无法连接到!

3.6 如果出现如下异常

sr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb:113:in `call': ERR Slot 0 is already busy (Redis::CommandError)from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2556:in `block in method_missing'from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `block in synchronize'from /usr/share/ruby/monitor.rb:211:in `mon_synchronize'from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `synchronize'from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2555:in `method_missing'from ./redis-trib.rb:212:in `flush_node_config'from ./redis-trib.rb:776:in `block in flush_nodes_config'from ./redis-trib.rb:775:in `each'from ./redis-trib.rb:775:in `flush_nodes_config'from ./redis-trib.rb:1296:in `create_cluster_cmd'from ./redis-trib.rb:1701:in `<main>'

经检查,这是由于上一次配置集群失败时留下的配置信息导致的。 只要把redis.conf中定义的 cluster-config-file 所在的文件删除,重新启动redis-server及运行redis-trib即可。

3.7 建立集群Redis关系正常执行响应如下

>>> Creating cluster
>>> Performing hash slots allocation on 3 nodes...
Using 3 masters:
192.168.29.128:6379
192.168.29.128:6380
192.168.29.128:6381
M: d5d0951bb185a67a44d29dd2142170dbce84d977 192.168.29.128:6379slots:0-5460 (5461 slots) master
M: e41fe58ef571836d891656b482307628b3f7ab35 192.168.29.128:6380slots:5461-10922 (5462 slots) master
M: ddbc810661f81500059e0b22b1550713a0e3766d 192.168.29.128:6381slots:10923-16383 (5461 slots) master
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 192.168.29.128:6379)
M: d5d0951bb185a67a44d29dd2142170dbce84d977 192.168.29.128:6379slots:0-5460 (5461 slots) master0 additional replica(s)
M: ddbc810661f81500059e0b22b1550713a0e3766d 192.168.29.128:6381slots:10923-16383 (5461 slots) master0 additional replica(s)
M: e41fe58ef571836d891656b482307628b3f7ab35 192.168.29.128:6380slots:5461-10922 (5462 slots) master0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
成功
*****************************************************************************
注:redis集群 Waiting for the cluster to join 一直等待
./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 ....
的时候
一直等待 Waiting for the cluster to join 很久都没有反应
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口
注意:iptables 放开,如果有安全组,也要放开这两个端口
*******************************************************************************

3.8 查看集群节点信息

3.9 测试
3.9.1 测试插入数据
因为abc的hash槽信息是在6380上,现在使用redis-cli连接的6379,无法完成set操作,需要客户端跟踪重定向。使用redis-cli -c

3.9.2 重新测试插入数据

4. 插槽的概念及插槽分配
整个Redis提供了16384个插槽,也就是说集群中的每个节点分得的插槽数总和为16384。./redis-trib.rb 脚本实现了是将16384个插槽平均分配给了N个节点。当我们执行set abc 123命令时,redis是如何将数据保存到集群中的呢?执行步骤:

i.接收命令set abc 123ii.通过key(abc)计算出插槽值,然后根据插槽值找到对应的节点。abc的插槽值为:7638iii.重定向到该节点执行命令123

注意:如果插槽数有部分是没有指定到节点的,那么这部分插槽所对应的key将不能使用。

5.新增集群节点
5.1 再开启一个实例的端口为6382 配置同上

5.2 执行脚本建立6382节点与集群的关系

5.3 查看集群状态,发现新增的节点没有插槽

5.4 给6382节点分配插槽

5.5 查看集群节点状态

6.删除集群节点
想要删除集群节点中的某一个节点,需要严格执行2步:

6.1.将这个节点上的所有插槽转移到其他节点上
6.1.1执行脚本:./redis-trib.rb reshard 192.168.29.128:6382

6.1.2选择需要转移的插槽的数量,因为6382有100个,所以转移100个

6.1.3输入转移的节点的id,我们转移到6379节点

6.1.4输入插槽来源id,也就是6382的id

6.1.5输入done,开始转移

6.1.6查看集群节点信息,可以看到6380节点已经没有插槽了

6.2.删除节点
6.2.1 删除节点

6.2.2 查看集群节点信息

7. Redis Cluster高可用
7.1 假设集群中某一节点宕机 测试数据写入操作

我们尝试执行set命令,结果发现无法执,行集群不可用了?? 这集群也太弱了吧??

7.2 集群中的主从复制架构

7.3 本教程不详细介绍集群中主从复制架构的具体安装,只提一下过程

7.3.1 为每个集群节点添加Slave,形成主从复制架构,主从复制架构可参考:主从复制架构,搭建结构如下所示

6379(Master)     6479(Slave of 6379)     6579(Slave of 6379)
6380(Master)     6480(Slave of 6380)     6580(Slave of 6380)
6381(Master)     6481(Slave of 6381)     6581(Slave of 6381)

7.3.2 为每个主从复制架构添加哨兵集群,哨兵模式集群可参考:哨兵模式集群

7.3.3 创建集群 使用如下命令

./redis-trib.rb create --replicas 2 192.168.29.128:6379 192.168.29.128:6380 192.168.29.128:6381 192.168.29.128:6479 192.168.29.128:6480 192.168.29.128:6481 192.168.29.128:6579 192.168.29.128:6580 192.168.29.128:6581

参考:

https://blog.csdn.net/robertohuang/article/details/70833231

转载于:https://blog.51cto.com/4925054/2090841

Redis Cluster高可用(HA)集群环境搭建详细步骤相关推荐

  1. gitee如何搭建mysql_MySQL高可用架构集群环境搭建手册.md

    # MySQL高可用架构集群环境搭建手册 ## 环境准备 ### 机器规划 | 节点 | IP | 配置 | 角色 | | -------- | -------------- | ---- | --- ...

  2. corosync+pacemaker实现高可用(HA)集群(二)

    部署方案二(推荐):corosync+pacemaker 利用ansible自动安装corosync和pacemaker 注:关于ansible的具体使用可参见"ansible实现自动化自动 ...

  3. Hadoop 2.x 完全分布式HA集群环境搭建

    Hadoop 2.x 完全分布式HA集群环境搭建 目录 Hadoop 2.0 环境搭建 前提:环境准备 第一步:修改hadoop-env.sh配置文件,配置好JAVA_HOME环境变量 第二步:修改h ...

  4. Kubernetes集群环境搭建详细教程(一主两从)

    Kubernetes集群环境搭建详细教程(一主两从) 1.1 安装要求 在开始之前,部署Kubernetes 集群机器需要满足以下几个条件: 一台或多台机器,操作系统CentOS7.x-86_x64 ...

  5. Redis进阶-高可用:集群

     前言 前面几篇文章中,已经介绍了Redis的几种高可用技术:持久化.主从复制和哨兵,但这些方案仍有不足,其中最主要的问题是存储能力受单机限制,以及无法实现写操作的负载均衡. Redis集群解决了上述 ...

  6. Redis(3)-高可用与集群

    Redis 高可用与集群 虽然 Redis 可以实现单机的数据持久化,但无论是 RDB 也好或者 AOF 也好,都解决 不了单点宕机问题,即一旦单台 redis 服务器本身出现系统故障.硬件故障等问题 ...

  7. 高可用(HA)集群原理概述

    一.高可用集群(High Availability Cluster) 集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源.每一个单个的计算机系统都叫集群节点(node).随着 ...

  8. mysql keepalived主主同步_KEEPALIVED+MYSQL主主同步=MYSQL高可用(HA)集群

    1.这个环境最大的缺陷在于主机写入速度极慢,主键重复. 2.mysql最好采用5.6以上集群版本,5.5以下单线程版本不大适合.博客中的mysql为5.5,实际测试挺差的,换成5.6之后十分完美,请各 ...

  9. Hadoop分布式高可用HA集群搭建笔记(含Hive之构建),java高级架构师视频

    | HOSTNAME | IP | 操作系统 | | - | - | - | | masterndoe | 192.168.122.128 | Manjaro 20.1 | | slavenode1 ...

最新文章

  1. 单商户商城与多商户商城的区别
  2. java:数组的默认值
  3. 如何提升蜘蛛的抓取频率?
  4. echart 数据视图_关于数据可视化图表的制作,你需要关注的30个小技巧
  5. java中的类型擦除type erasure
  6. python学习实例(3)
  7. 白中英 计算机组成原理_计算机组成原理 第五版.立体化教材 白中英 大学教材...
  8. qt5.9.0调试如何查看变量的值_深入了解 Java 调试
  9. CodeVs1519 过路费
  10. python去掉数字列表中括号_如何从列表中的元素中移除括号(Python)
  11. java aop xml配置_spring AOP使用 xml配置
  12. Python学习之路(一)字符串
  13. 关于点击锁(防止多次点击)
  14. 启动计算机实现5秒开机,win10提高开机速度的设置教程 电脑五秒开机优化步骤...
  15. DES算法理解--附《密码编码学与网络安全(第七版)》课后练习题答案
  16. Win7 系统 屏幕旋转快捷键取消(有可能和别的软件有冲突)
  17. 计算机类的本科学校有哪些专业考研,计算机专业考研学校推荐有哪些
  18. 漫天繁星构成文字情话
  19. 第九周 练习判断闰年和平年
  20. java线程中join方法的简单讲解

热门文章

  1. Android 服务器推送技术
  2. Linux系统openssl测试指导,Linux管理员必用:OpenSSL服务器测试技巧
  3. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果
  4. python怎样遍历列表中数字_关于Python列表的遍历和数字列表
  5. python的命名空间_python中命名空间的三种方式介绍(附示例)
  6. django 后台日期_Django中的日期和时间格式 DateTimeField
  7. linux centos升级php_CentOS使用yum升级php到最新版本
  8. 升序排序中国_排序的4个技巧都不掌握,那就真的Out了!
  9. selenium webdriver 如何添加cookie
  10. Django数据库开发思想与OPM