redis-5.0.4 集群搭建

redis-cluster介绍

​ 1:redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。
​ 2:redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
​ 3:redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
​ 4:为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
​ 5:那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
​ 综上所述,每个Redis集群理论上最多可以有16384个节点。

redis-cluster的现状

  目前redis支持的cluster特性:

  1):节点自动发现

  2):slave->master 选举,集群容错

  3):Hot resharding:在线分片

  4):进群管理:cluster xxx

  5):基于配置(nodes-port.conf)的集群管理

  6):ASK 转向/MOVED 转向机制。

redis-cluster 架构

  1)redis-cluster架构图

架构细节:

  (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

  (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

  (3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

  (4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

2) redis-cluster选举:容错

(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉。

(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

​  如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。

​ 那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。

综上所述,每个Redis集群理论上最多可以有16384个节点。

​  如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

(3) Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。

要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7000-7005),当然实际生产环境的Redis集群搭建和这里是一样的。

redis集群环境描述:redis集群至少需要三个主节点才能构成集群,因为这是redis集群的投票机制决定的。正常情况下每个主节点都应该至少有一个从节点 所以Redis集群至少需要6台服务器。所以这里使用的是伪集群的构建方式,但是最新的版本的redis支持docker容器集群部署(可以尝试)

准备工作
用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master、3 salve 环境。

redis 采用 redis-5.0.4 版本。

两台虚拟机都是 CentOS ,一台 CentOS7(IP:192.168.11.12),一台 CentOS7(IP:192.168.11.13) 。

环境描述
操作系统 :centos7
gcc版本 :gcc-c++
redis版本 :redis-5.0.4

官网文档参考:https://redis.io/topics/cluster-tutorial

安装过程

1、安装支持的库文件:(注:可以只安装 gcc-c++)

 yum -y install gcc automake autoconf libtool make

2、下载redis安装包 :wget http://download.redis.io/releases/redis-5.0.4.tar.gz

3、解压文件:

cd /usr/local/
tar xvzf redis-5.0.4.tar.gz

3、编译与安装

cd /usr/local/redis-5.0.4
make
make install PREFIX=/usr/local/redis 

4、将 redis-trib.rb 复制到 /usr/local/bin 目录下

cd src
cp redis-trib.rb /usr/local/bin/ 

5、 创建 Redis 节点,

首先在 192.168.11.12 机器上 创建 redis_cluster 目录;

mkdir redis_cluster 

在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中

mkdir 7000 7001 7002cp redis.conf redis-cluster/7000
cp redis.conf redis-cluster/7001
cp redis.conf redis-cluster/7002 

分别修改这三个配置文件,修改如下内容

port 7000 //端口7000,7002,7003
bind 本机ip //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize yes //redis后台运行
pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002
cluster-enabled yes //开启集群 把注释#去掉
cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 把注释#去掉
cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置  把注释#去掉
appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 

接着在另外一台机器上(192.168.11.13),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可

6、启动redis各个节点

第一台12机器上执行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7000/redis.conf
./redis-server /usr/local/redis-cluster/7001/redis.conf
./redis-server /usr/local/redis-cluster/7002/redis.conf

13机器上执行

cd /usr/local/redis-5.0.4/src
./redis-server /usr/local/redis-cluster/7003/redis.conf
./redis-server /usr/local/redis-cluster/7004/redis.conf
./redis-server /usr/local/redis-cluster/7005/redis.conf


相关命令

启动 redis 命令

./redis-server redis.conf

查看redis是否启动

ps aux|grep redis

连接redis 命令为:

./redis-cli -h host -p port host为服务器host port 为redis.conf中的port

退出redis 命令:exit

关闭redis

./redis-cli -h 192.168.11.12 -p 7000 shutdown

7、检查 redis 启动情况

ps -ef | grep redis //查看redis启动情况
netstat -tnlp | grep redis//查看redis端口开启情况


8、开启两台机器的防火墙(选做)

firewall-cmd --zone=public --add-port=7000-7002/tcp --permanent
firewall-cmd --zone=public --add-port=17000-17002/tcp --permanent
firewall-cmd --reload
firewall-cmd --zone=public --list-ports

9、创建集群

原命令 redis-trib.rb 这个工具目前已经废弃,使用redis-cli

./redis-cli --cluster create --cluster-replicas 1 192.168.11.12:7000 192.168.11.12:7001 192.168.11.12:7002 192.168.11.13:7003 192.168.11.13:7004 192.168.11.13:7005


其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器

输入 yes 即可,然后出现如下内容,说明安装成功


10、集群验证

在第一台机器上连接集群的7000端口的节点,在另外一台连接7003节点,连接方式为

./redis-cli -h 192.168.11.13 -c -p 7000

在7000节点执行命令 set hello world ,执行结果如下:


然后在另外一台7003端口,查看 key 为 hello 的内容, get hello ,执行结果如下:


说明集群运作正常。

简单说一下原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

安装过程中的问题点汇总

1.关于启动集群时候出现一直等待 Waiting for the cluster to join 很久都没有反应的问题

Redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000,如redis端口为7000,则集群总线端口为17000,因此所有服务器的点需要开通redis的客户端连接端口和集群总线端口

2.关于集群连接验证时候连接失败,可以先关闭redis ./redis-cli -h 192.168.11.12 -p 7000 shutdown 再开启 ./redis-server redis.conf

Redis 集群模式下连接需要已-h ip地址方式连接,命令应为./redis-cli -h 192.168.11.12 -c -p 7000

转载于:https://blog.51cto.com/14237756/2395280

redis-5.0.4集群部署相关推荐

  1. redis 3.0的集群部署

    2019独角兽企业重金招聘Python工程师标准>>> redis 3.0的集群部署 博客分类: 缓存 文章转载自:http://hot66hot.iteye.com/blog/20 ...

  2. redis 3.0 cluster 集群 学习之路篇 [3]

    周氏一族,整理技术文档,给下一代留点教程...... redis 3.0 cluster 安装篇,请看 http://zhoushouby.blog.51cto.com/9150272/1560400 ...

  3. java redis 多节点,Redis单机多节点集群部署,超简单

    1.在虚拟机中部署具有三个主节点,三个从节点的集群(注,必须要有从节点),虚拟机的IP地址为192.168.133.129,三个主节点的部口号分别为7001(从:7004).7002(从:7005). ...

  4. redis4.0.6集群部署(5.0.2版本更新补充)

    Redis集群安装 4版本需要ruby    5版本不需要ruby就能集群 1集群机器分布 192.168.1.133        redis1 192.168.1.134        redis ...

  5. Redis 3.0.2集群搭建以及相关问题汇总

    Redis3 正式支持了 cluster,是为了解决构建redis集群时的诸多不便 (1)像操作单个redis一样操作key,不用操心key在哪个节点上 (2)在线动态添加.删除redis节点,不用停 ...

  6. CAT3.0的集群部署

    转载 https://www.jianshu.com/p/13d9de1f7fe5 CAT安装环境 CentOS 6.5Java 6,7,8,服务端推荐是用jdk7的版本,客户端jdk6.7.8都支持 ...

  7. redis3.0 java spring_Redis-3.0.6 集群部署集成SpringJava工程-----环境搭建

    注:本文所有操作都使用管理员权限 su root 输入密码 1.打开对应的端口- 既所有集群的端口号全部都打开 / 安装Jdk----暂时使用openJDK可行 /sbin/iptables -I I ...

  8. kubesphere v3.1.0 离线集群部署

    目录 一.简介 二.部署环境 2.1.系统要求 2.2.镜像仓库 三.安装部署 3.1.安装包下载: 3.2.安装步骤: 3.2.1.上传解压: 3.2.3.初始化环境: 3.2.4.导入镜像: 3. ...

  9. redis-3.0.2集群部署

    Redis 集群安装 集群搭建步骤 1.创建多个节点. 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群. 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态. 要求:搭建一个 ...

最新文章

  1. java鉴权_一个开箱即用的高效认证鉴权框架,专注于restful api的认证鉴权动态保护...
  2. (论坛答疑点滴)为什么设置了DropDownList的AutoPostBack=True还是不能触发SelectedIndexChanged事件?...
  3. 【ArcGIS Engine二次开发】入门基础(2):ArcGIS开发方式(VBA、DLL、Add-in、Engine)对比
  4. 投资最重要的事读后感_《投资最重要的事》读书笔记分享
  5. ThinkPHP6项目基操(12.实战部分 验证码)
  6. mysql netcdf_Linux下用Intel编译器编译安装NetCDF-Fortan库(4.2以后版本)
  7. Vue自定义组件数组型双向绑定
  8. hive中的日期转换函数
  9. 水桶平分 java_关于java:桶排序算法代码问题
  10. python与java区别-python(一):python与java语法的异同之处
  11. rsync aws ec2 pem
  12. Android仿miui11风格,华为手机适配MIUI11图标风格主题-适配EMUI9.1/9.0
  13. TOPSIS法作业题
  14. python 抓取豆瓣一拍一所有妹子客片
  15. Tp5开启cookie和session安全传输secure和httponly
  16. vs code 保存显示无法写入文件的解决方法
  17. Eclipse开发Android的安装配置。
  18. STM32——USART串口
  19. input输入框中嵌入下拉选项
  20. JS原型对象和JS原型链

热门文章

  1. rust怎么把门拿下来_皮肤好的女生都是怎么护肤的?快拿小本本记下来
  2. 2021 IEEE热门AI话题盘点:模仿生物大脑打造神经网络、GPT3“不当言论”惹关注…...
  3. “好像在哪见过你”现在有了科学解释,一群脑细胞帮你回忆那张脸 | Science
  4. 首个卡车全栈自动驾驶系统发布:嬴彻轩辕!年内量产上路
  5. 谷歌大脑最新研究:用AutoML的方式自动学习Dropout模式,再也不用手动设计
  6. 向碳基芯片更进一步:台积电、斯坦福等联手开发碳纳米管晶体管新工艺,性能逼近硅元件...
  7. 日本16岁编程少年,课余打造一款新冠感染追踪App
  8. RAdam优化器又进化:与LookAhead强强结合,性能更优速度更快
  9. 第9件事 产品定位要解决的6个问题
  10. python中关于操作时间的方法(一):使用time模块