Redis 群集部署及原理

1、Redis群集架构细节:node

一、全部的Redis节点彼此互联(PING-PONG机制)内部使用二进制协议优先传输速度和带宽。redis

二、节点的失效(fail)在群集中超过半数的主(master)节点检测失效时才会生效。算法

三、客户端与redis节点直连,不须要中间代理(proxy)层,客户端不须要链接群集全部节点,链接群集中任何一个可用节点便可。数据库

四、redis-cluster把全部的物理节点映射到 [ 0-1638 ] slot 上,cluster负责维护node< - >slot< - > key。
2、redis-cluster选举:
选举过程是群集中全部master参与,若是半数以上master节点与当前master节点通讯超时(cluster-node-timeout),认为当前master节点挂掉。如下两种状况为整个群集不可用(cluster_state:fail),当群集不可用时,全部对群集的操做都不可用,收到((error)CLUSTERDOWN Thecluster is down)错误:vim

  • 若是群集中任意master挂掉,且当前master没有slave,则群集进入fail状态,也能够理解成群集的slot映射 [ 0-16383 ]不完整时进入fail状态。centos

  • 若是群集中超过半数的master挂掉,不管是否有slave,群集都进入fail状态。

默认状况下,每一个群集的节点都是用两个TCP端口,一个是6379,一个是16379;6379服务于客户端的链接,16379用于群集总线,就是使用二进制协议的节点到节点通讯通道。节点使用群集总线进行故障检测、配置更新、故障转移受权等。
Redis群集原理:ruby

一、Redis集群架构:服务器

Redis Cluster采用虚拟槽分区,将全部的数据根据算法映射到0~16384整数槽内
Redis Cluster是一个无中心的结构
每一个节点都保存数据和整个集群的状态
二、集群角色:
Master:Master之间分配slots
Slave:Slave向它指定的Master同步数据
三、集群节点使用的TCP端口
6379端口用于客户端的链接
16379端口用于群集总线架构

Redis3.0版本以上开始支持群集,采用的是hash slot(哈希槽),能够将多个Redis实例整合在一块儿,造成一个群集,也就是将数据分散到群集的多台服务器上。
.
Redis cluster(Redis 群集)是一个无中心的结构,以下图所示,每一个节点都会保存数据和整个群集的状态。每一个节点都会保存其余节点的信息,知道其余节点所负责的槽,而且会与其余节点定时发送心跳信息,可以及时感知群集中异常的节点。
Redis 群集部署及原理
当客户端向群集中任一节点发送与数据库键有关的命令时,接受命令的节点会计算出命令要处理的数据属于哪一个槽,并检查这个槽是否指派给了本身,若是键所在的槽正好指派给了当前节点,那么节点直接执这个命令;若是键值所在的槽并无指派给当前节点,那么节点会向客户端返回一个MOVED错误,指引客户端转向(redirect)正确的节点,并再次发送以前想要执行的命令。
.
群集角色有master和slave。master之间分配slots,一共16384个slot。slave向它指定的master同步数据,实现备份。当其中一个master没法提供服务时,该master的slave将提高为master,以保证群集间slot的完整性。当其中的某一个master和它的slave都失效,致使了slot不完整,群集失效,这时就须要运维人员去处理了。
.
群集搭建好后,群集中的每一个节点都会按期地向其余节点发送PING消息,若是接收PING消息的节点没有在规定的时间内返回PONG消息,那么发送PING消息的节点就会将其标记为疑似下线(PFAIL)。各个节点会经过互相发送消息的方式来交换群集中各个节点的状态信息。若是已经在一个群集里面,半数以上的主节点都将某个主节点x报告为疑似下线,那么这个主节点x将被标记为已下线(FAIL),同时会向群集广播一条关于主节点x的FAIL消息,全部收到这条FAIL消息的节点都会当即将主节点x标记为已下线。
.
当须要减小或者增长群集中的服务器时,咱们须要将已经指派给某个节点(源节点)的槽改成指派给另外一个节点(目标节点),而且将相关槽所包含的键值对从源节点移动到目标节点。
.
Redis群集的从新分片操做时由Redis的群集管理软件redis-trib负责执行的,不支持自动分片,并且须要本身计算从哪些节点迁移多少Slot。在从新分片的过程当中,群集无需下线,而且源节点和目标节点均可以继续处理命令请求。
准备工做:
一、六台服务器,三台为master、三台为slave,这里均为centos 7,IP地址依次为192.168.1.10--60(参与群集的服务器数量最好为偶数,每一个master会自动对应一个slave,若为奇数,群集没法实现冗余,由于一定有一个master没有对应的slave,一旦这个master宕机,整个群集就会丢失一部分数据);
二、所需源码包: https://pan.baidu.com/s/12L6jNOBrXeLH4I445_uUtQ 提取码: smn6
三、全部redis服务器必须保证无任何数据,最好是全新安装的,由于若是有数据存在,在后面进行群集时会报错。
四、配置防火墙放行流量,本人较懒,这里直接关闭了
开始部署:
192.168.1.10 上的配置:运维

[root@localhost media]# ls
redis-3.2.0.gem  redis-3.2.9.tar.gz
[root@localhost media]# cp * /usr/src/                   # 将软件包复制
[root@localhost media]# cd /usr/src/
[root@localhost src]# ls                          # 确认都在呢
debug  kernels  redis-3.2.0.gem  redis-3.2.9.tar.gz
[root@localhost src]# tar zxf redis-3.2.9.tar.gz 
[root@localhost src]# cd redis-3.2.9/
[root@localhost redis-3.2.9]# make && make install      # 编译并安装 
[root@localhost redis-3.2.9]# cd utils/                  # 再进一个子目录
[root@localhost utils]# ./install_server.sh            # 一路回车便可 
# 由于make install  只是安装了二进制文件到系统中,并无启动脚本和配置文件,因此须要经过install_server.sh来设置 redis 服务所须要的相关配置文件。
[root@localhost utils]# cd /etc/init.d/      #优化redis控制启停方式
[root@localhost init.d]# mv redis_6379 redis     
[root@localhost init.d]# chkconfig --add redis          #将redis添加为系统服务
[root@localhost init.d]# systemctl restart redis          #重启服务,以测试是否生效
[root@localhost /]# vim /etc/redis/6379.conf            # 修改配置文件,修改如下几条
.......................
bind 192.168.1.10                   // 设置监听 IP 地址
daemonize yes               
logfile /var/log/redis_6379.log           // 指定日志文件
cluster-enabled yes                            // 启动群集
cluster-config-file nodes-6379.conf       // 群集配置文件
cluster-node-timeout 15000               // 节点超时时间,默认为毫秒
cluster-require-full-coverage no          // 将yes改成no
port   6379                         // 监听端口
# 保存退出

主配置文件修改完毕后先别着急启服务,由于咱们须要在每一台服务器上都要安装 redis ,按照以前的方法安装便可,而后修改配置文件。其中每台服务器都要修改,只是监听IP地址不一样而已,其余的配置都同样。因此,嘿嘿嘿~
192.168.1.20 的配置:

# 安装完毕redis后
[root@localhost utils]# scp root@192.168.1.10:/etc/redis/6379.conf /etc/redis/
# 咱们直接将第一台的主配文件复制过来使用,修改一下监听IP就能够了
[root@localhost utils]# vim /etc/redis/6379.conf 
........................
bind 192.168.1.20

而后将剩下的几台服务器依次配置完毕。
回到 192.168.1.1配置:
使用脚本建立群集:

[root@localhost /]# yum -y install ruby rubygems        
# 建立群集会用到ruby的一个脚本,在建立群集前,须要先安装ruby的运行环境和客户端,在任何一台服务器安装均可以
[root@localhost src]# gem install redis --version 3.2.0           # 执行这条命令须要此文件redis-3.2.0.gem,因此执行前切换到拥有此文件的目录
Successfully installed redis-3.2.0
Parsing documentation for redis-3.2.0
Installing ri documentation for redis-3.2.0
1 gem installed
[root@localhost src]# ./redis-trib.rb create --replicas 1 \
> 192.168.1.10:6379 \
> 192.168.1.20:6379 \
> 192.168.1.30:6379 \
> 192.168.1.40:6379 \
> 192.168.1.50:6379 \
> 192.168.1.60:6379 
.20:6379  192.168.1.30:6379  192.168.1.40:6379  192.168.1.50:6379  192.168.1.60:6379 >>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.10:6379
192.168.1.20:6379
192.168.1.30:6379
Adding replica 192.168.1.40:6379 to 192.168.1.10:6379
Adding replica 192.168.1.50:6379 to 192.168.1.20:6379
Adding replica 192.168.1.60:6379 to 192.168.1.30:6379
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
   replicates 4234dad1a041a91401d6e635c800581172e850dc
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
   replicates b386e4089c6f45a59d371549cda306669dd6938f
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
   replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
Can I set the above configuration? (type 'yes' to accept): yes             # 此处记得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.1.10:6379)
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
   slots: (0 slots) slave
   replicates b386e4089c6f45a59d371549cda306669dd6938f
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
   slots: (0 slots) slave
   replicates 4234dad1a041a91401d6e635c800581172e850dc
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
   slots: (0 slots) slave
   replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试一下群集:
[root@localhost /]# redis-cli -h 192.168.1.20 -p 6379 -c
192.168.1.20:6379> set zhangsan 123123 # 建立一个值
-> Redirected to slot [12767] located at 192.168.1.30:6379 # 发现他跑另外一个服务器上了
OK
192.168.1.30:6379> get zhangsan # 也是能够查到
"123123"

[root@localhost src]# ./redis-trib.rb check 192.168.1.10:6379             # 查看群集状态
>>> Performing Cluster Check (using node 192.168.1.10:6379)
M: 4234dad1a041a91401d6e635c800581172e850dc 192.168.1.10:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8 192.168.1.30:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
M: b386e4089c6f45a59d371549cda306669dd6938f 192.168.1.20:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: f0a387bf5f366de0e25c575588349bd424a0ff90 192.168.1.50:6379
   slots: (0 slots) slave
   replicates b386e4089c6f45a59d371549cda306669dd6938f
S: e772a17543efb1e11cd05d792c11319b0fbfee5f 192.168.1.40:6379
   slots: (0 slots) slave
   replicates 4234dad1a041a91401d6e635c800581172e850dc
S: abc2fef19988e6626243feff831bced36b83b642 192.168.1.60:6379
   slots: (0 slots) slave
   replicates c1d6d14364e8c5db2ae1ea3ee07360a8b17127d8
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

redis-3.x.x和redis-5.x.x建立群集的区别:

使用命令不同,redis-3.x.x使用redis-trib.rb命令,语法以下:

[root@localhost ~]#redis-trib.rb create --replicas 1 192.168.1.1:6379 ..192.168.1.6:6379
#redis-3.x.x建立群集。
[root@localhost src]# redis-trib.rb check 192.168.1.1:6379
#查看群集状态
# redis-trib.rb不能够直接使用,须要执行如下操做才可直接使用
[root@localhost src]# cd /usr/src/redis-5.0.5/src/           
[root@localhost src]# cp redis-trib.rb /usr/local/bin/  
#将该脚本复制到本地../bin下,以便直接使用。若否则,须要在目录下使用“./”执行该文件
相关文章
相关标签/搜索