redis 集群讲解 (一 )安装 运行 基本 操作

redis cluster

  • 支撑N个redis master node,每个master node都可以挂载多个slave node

  • 读写分离的架构,对于每个master来说,写就写到master,然后读就从mater对应的slave去读

  • 高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master

  • redis cluster(多master + 读写分离 + 高可用)

redis cluster vs. replication + sentinal

  • 如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了

  • replication,一个mater,多个slave,要几个slave跟你的要求的读吞吐量有关系,然后自己搭建一个sentinal集群,去保证redis主从架构的高可用性,就可以了

  • redis cluster,主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster

redis cluster

(1)自动将数据进行分片,每个master上放一部分数据
(2)提供内置的高可用支持,部分master不可用时,还是可以继续工作的

在redis cluster架构下,每个redis要放开两个端口号,比如一个是6379,另外一个就是加10000的端口号,比如16379

16379端口号是用来进行节点间通信的,也就是cluster bus的东西,集群总线。cluster bus的通信,用来进行故障检测,配置更新,故障转移授权

cluster bus用了另外一种二进制的协议,主要用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间

哈希算法

  • 1、最老土的hash算法和弊端(大量缓存重建)

  • 2、一致性hash算法(自动缓存迁移)+虚拟节点(自动负载均衡)


    redis 集群讲解 (一 )安装 运行 基本 操作_第1张图片
    一致性hash算法的讲解和优点.png

    redis 集群讲解 (一 )安装 运行 基本 操作_第2张图片
    一致性hash算法的虚拟节点实现负载均衡.png
  • 3、redis cluster的hash slot算法
redis cluster有固定的16384个hash slot,对每个key计算CRC16值,然后对16384取模,可以获取key对应的hash slot

redis cluster中每个master都会持有部分slot,比如有3个master,那么可能每个master持有5000多个hash slot

hash slot让node的增加和移除很简单,增加一个master,就将其他master的hash slot移动部分过去,减少一个master,就将它的hash slot移动到其他master上去

移动hash slot的成本是非常低的

客户端的api,可以对指定的数据,让他们走同一个hash slot,通过hash tag来实现

redis cluster 搭建

单机集群

#创建redis 日志目录
 mkdir -p /var/log/redis/7001
 mkdir -p /var/log/redis/7002
 mkdir -p /var/log/redis/7003
 mkdir -p /var/log/redis/7004
 mkdir -p /var/log/redis/7005
 mkdir -p /var/log/redis/7006

#创建redis 集群 配置 目录
 mkdir -p /etc/redis-cluster
# redis目录
mkdir -p mkdir -p /var/redis/7001
mkdir -p mkdir -p /var/redis/7002
mkdir -p mkdir -p /var/redis/7003
mkdir -p mkdir -p /var/redis/7004
mkdir -p mkdir -p /var/redis/7005
mkdir -p mkdir -p /var/redis/7006

配置文件 主要配置 其他几分类似

port 7001
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7001.conf
cluster-node-timeout 15000
daemonize   yes                         
pidfile     /var/run/redis_7001.pid                         
dir         /var/redis/7001 
logfile /var/log/redis/7001.log
bind 0.0.0.0        
appendonly yes

安装必备软件

  • 步骤1 - 安装 RVM
    $ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
    
    $ curl -sSL https://get.rvm.io | bash -s stable
    
     如果上面的连接失败,可以尝试: 
    $   curl -L https://raw.githubusercontent.com/wayneeseguin/rvm/master/binscripts/rvm-installer | bash -s stable
    
    #成功之后
    source /usr/local/rvm/scripts/rvm
    rvm install 2.3.3
    rvm use 2.3.3
    gem install redis
    
    
    
    
启动集群

```shell
redis-trib.rb create --replicas 1  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 127.0.0.1:7006
out:
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
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
Adding replica 127.0.0.1:7006 to 127.0.0.1:7003
M: 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001
   slots:0-5460,5999,12706,14559 (5464 slots) master
M: 63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004
   replicates 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c
S: 3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005
   replicates 63035068bbbc1ee1df40a050d5d47b7779f86043
S: 65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006
   replicates be557259c0ea02517557931251df7120c00cd4c2
Can I set the above configuration? (type 'yes' to accept):

简单解释一下这个命令:调用 ruby 命令来进行创建集群,--replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。

目前来看,7001-7003 为主节点,7004-7006 为从节点,并向你确认是否同意这么配置。输入 yes 后,会开始集群创建。

集群搭建成功之后

验证一下:
依然是通过客户端命令连接上,通过集群命令看一下状态和节点信息等。

redis-cli -c -p 7001
cluster info
cluster nodes

可以看到

127.0.0.1:7001> 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_sent:372
cluster_stats_messages_received:372
127.0.0.1:7001> cluster nodes
65e578ed3fe7d5947a4f9c621c8157ab6c1251b5 127.0.0.1:7006 slave be557259c0ea02517557931251df7120c00cd4c2 0 1515656195286 6 connected
3cb4215cb614950f9e68be6a995bf98ea81d52a6 127.0.0.1:7005 slave 63035068bbbc1ee1df40a050d5d47b7779f86043 0 1515656197299 5 connected
5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 127.0.0.1:7001 myself,master - 0 0 1 connected 0-5460
210ae237bb73aa3c876eb9933a9926c575fba0cd 127.0.0.1:7004 slave 5f7f1ff4582dcd1a6cc66a9e636fe18bcacc7d4c 0 1515656193268 4 connected
63035068bbbc1ee1df40a050d5d47b7779f86043 127.0.0.1:7002 master - 0 1515656194275 2 connected 5461-10922
be557259c0ea02517557931251df7120c00cd4c2 127.0.0.1:7003 master - 0 1515656196295 3 connected 10923-16383

设置一个key

127.0.0.1:7001> set name mafly
-> Redirected to slot [5798] located at 127.0.0.1:7002
OK
127.0.0.1:7002>

你会发现,当我们 set name mafly 时,出现了 Redirected to slot 信息并自动连接到了7002节点。这也是集群的一个数据分配特性,这里不详细说了。

出现问题

1. 使用 ruby 创建集群 yes 之后 出现 in `call': ERR Slot 8579 is already busy (Redis::CommandError)

      用redis-cli 登录到每个节点执行  flushall  和 cluster reset  就可以了。

你可能感兴趣的:(redis 集群讲解 (一 )安装 运行 基本 操作)