[笔记]Redis5.0集群搭建及测试
阅读原文时间:2021年04月22日阅读:1

Redis-Cluster集群

简介

集群模式是实际使用最多的模式
  Redis Cluster是社区推出的Redis分布式集群解决方案,主要解决redis分布式需求
  比如:遇到单机内存,并发和流量等瓶颈的时候,Redis Cluster能起到很好的负载均衡目的

  使用redis-cluster为了在大流量访问下提供稳定业务,集群化是存储的必然形态,未来的发展趋势是云计算和大数据结合只有分布式结构能满足要求。

集群描述

  Twitter开发的twemproxy
  豌豆荚开发的codis
  redis官方的redis-cluster

  至少需要3Master+3Slave才能集群。Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点链接。其Redis-Cluster架构图(3主3从互相链接)。
  redis-cluster架构图:

  Redis Cluster集群节点最小配置6个节点以上 其中主节点提供读写操作,从节点作为备用节点不提供请求,只作为故障转移使用。

Redis-Cluster集群特点

1.所有的redis节点批次互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
2.节点的fail是通过集群中超过半数的节点检测失效时才生效
3.客户端redis节点直连。不需要中间proxy层,客户端不需要连接集群所有节点,链接集群中任意一个可用节点即可
4.redis-cluster把所有的物理节点映射到[0-16383]slot上(不是平均分配)cluster负责维护
5.Redis集群预分好16384哈希槽,当需要在Redis集群中放置key-value时 Redis先对key使用crc16算法算出一个结果, 然后把结果对16384求余数,这样每个key都会对应一个编号在0-16383之间的哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同的节点

Redis Cluster容错

  容错性:是指软件检测应用程序所运行的软件或硬件中发生错误并从错误中恢复的能力,通常可以从系统的可靠性,可用性,可测性几个方面来衡量

redis-cluster选举容错:

1.什么时候判断master不可用:
  投票机制,投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时,认为当期master节点挂掉
2.什么时候整个集群不可用(cluster_state:fial):
  如果集群任意master挂掉,且当前master没有slave集群进入fail状态,也可以理解集群slot映射[0-16383]不完整时进入fail状态 如果集群超过半数以上的master挂掉 无论是否有slave 集群进入fail状态

Redis Cluster节点分配

  Redis Cluster采用虚拟槽分区,所有的根据哈希函数映射0-16383的整个槽内,每个节点负责维护一部分所映射的键值数据
三个主点分别为 A B C三个节点 他们可以是一台机器上的三个端口 也可以是 三台不同的服务器 那么采用哈希槽的方式来分配
  A:覆盖0-5460
  B:覆盖5461-10922
  C:覆盖10923-16383

Redis Cluster集群搭建

1.准备redis5.0安装包,我的安装路径:/usr/local/redis/
2.创建节点安装目录:
  mkdir -p /usr/local/redis_cluster
3.进入redis_cluster创建7000-7005,并将redis.conf复制每个文件夹里
  mkdir 7000 7001 7002 7003 7004 7005
4.修改配置文件内容(以7000为例其他一样):
  #关闭保护模式
  protected-mode no
  port 7000
  #开启聚群模式
  cluster-enable yes
  cluster-config-file nodes-7000.conf
  cluster-node-timeout 5000
  #后台启动
  daemonize yes

  pidfile /var/run/redis-7000.pid
  logfile ‘7000.log’

  #dir /redis/data
  #bind 127.0.0.1
  masterauth 密码
  requirepass 密码

  用vim打开/usr/local/redis_cluster/7000/redis.conf ,’:wq’保存退出

5.修改其中一个文件其他文件配置用vim进入命令行模式替换即可
  :%s/7000/7001/g
6.修改完后进入7000目录下(/usr/local/redis_cluster/7000/)启动服务
  (1)将redis目录下的src/文件夹复制到redis_cluster/中:
     #当前所在目录/usr/local/redis
    cp -r src/ …/redis_cluster/
    #当前所在目录/usr/local/redis_cluster/启动服务
    ./src/redis-server ./7000/redis.conf

  (2)查看redis服务
    ps -ef | grep redis

  (3)创建集群(当前所在目录:/usr/local/redis_cluster/)
    #记得把密码带上
    #命令参考(http://www.redis.cn/commands/cluster-replicas.html)
    # create创建一个集群;-a:密码
    # --cluster-replicas 1我们要为每创建一个主机都带有一个从机

    ./src/redis-cli --cluster create -a 密码 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 --cluster-replicas 1
    #redis-cli提出配置 yes接收建议的配置。集群将配置并加入,这意味着实例将被引导彼此对话,[OK] All 16384 slots covered.配置成功
    #输入yes后,开始做节点的构建和更新,分配节点
    [OK] All 16384 slots covered.

集群测试

  #当前所在目录/usr/local/redis_cluster/

  1.登录客户端

./src/redis-cli -p 7000 -a 密码    //只登陆自己的节点
info replication    //查看当前集群状态

# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7005,state=online,offset=1778,lag=0
master_replid:33e4230e24b48e70b8c67c3b52f7a2652d785842
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1778
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1778

#查看整个集群信息
cluster nodes

#可以看出来myself,master当前连接的主节点是7000,7000主从是7005,7001主从是7003, 7002主从是7004
9cb3367ec0929d8bbcf37db9b91048b933753ab7 127.0.0.1:7004@17004 slave 5b80d39d6afb076e83c8afe504867aacdd5565eb 0 1592530759911 5 connected

980c4adfbe72b025b438c20bcda874f9823b19a2 127.0.0.1:7001@17001 master - 0 1592530761000 2 connected 5461-10922

47ea315781efcc18ce200b25865bb69416ee8447 127.0.0.1:7000@17000 myself,master - 0 1592530758000 1 connected 0-5460

5b80d39d6afb076e83c8afe504867aacdd5565eb 127.0.0.1:7002@17002 master - 0 1592530761000 3 connected 10923-16383

4db4307b5c0e5bcf8ebf27abb0fd2456c7e2de45 127.0.0.1:7005@17005 slave 47ea315781efcc18ce200b25865bb69416ee8447 0 1592530760000 6 connected

aaf9fb9d18183d5c12cc3d7c9d7cc8cb4a3dbf06 127.0.0.1:7003@17003 slave 980c4adfbe72b025b438c20bcda874f9823b19a2 0 1592530761934 4 connected

  每个redis的节点都有一个ID值,此ID将被此特定redis实例永久使用,以便实例在集群上下文中具有唯一名称每个节点都会记住使用此ID的每个其他节点,而不是IP或端口,IP或端口可能发生变化,但唯一节点标识符在节点的整个生命周期内不会发生改变,我们简单称这个标识符为节点ID
  redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是集群中的每个节点都是平等关系,都对等的,每个集群都保存各自的数据和整个集群状态 每个节点都和其他节点相连接(连接保持活跃),这样就保证我们只需要连接集群中的任意一个节点,就可以获取其他节点的数据

127.0.0.1:7000> set aa 99
            OK
            127.0.0.1:7000> keys *
            1) "aa"
            127.0.0.1:7000> get aa
            "99"
            # 赋值bb报错因为这里我连接自己的节点,没有连接集群
            127.0.0.1:7000> set bb 123
            (error) MOVED 8620 127.0.0.1:7001

  (2)连接集群(当前目录/usr/local/redis_cluster/):
    ./src/redis-cli -c -p 7001 -a 密码

127.0.0.1:7000> get aa
"99"
127.0.0.1:7000> set bb 90
-> Redirected to slot [8620] located at 127.0.0.1:7001
OK
127.0.0.1:7001> mget aa bb
(error) CROSSSLOT Keys in request don't hash to the same slot
127.0.0.1:7001> get bb
"90"
127.0.0.1:7001> mget aa bb
(error) CROSSSLOT Keys in request don't hash to the same slot
127.0.0.1:7001> set aa 99
-> Redirected to slot [1180] located at 127.0.0.1:7000
OK
127.0.0.1:7000> set bb 123
-> Redirected to slot [8620] located at 127.0.0.1:7001
OK
127.0.0.1:7001> get aa
-> Redirected to slot [1180] located at 127.0.0.1:7000
"99"
127.0.0.1:7000> get bb
-> Redirected to slot [8620] located at 127.0.0.1:7001
"123"
127.0.0.1:7000> keys bb
1) "bb"

Redis集群总结

  Redis cluster为了保证数据高可用性,加入了主从模式 一个主节点对应一个或多个从节点,主节点拉取数据存储,从节点则是从主节点提取数据备份,当这个主节点挂掉后,从节点就会选取一个充当主节点,从而保证集群不会挂掉

  集群有ABC三个主节点,如果这三个主节点没有加入从节点,如果B挂掉了,我们就无法访问整个集群,A和C的slot也无法访问

  所以在搭建集群建立的时候,一定要为每个主节点都添加从节点 比如主节点A,B,C,从节点A1,B1, C1,那么B挂掉了系统也可以
正常运行

  B1节点替代B节点,所以Redis集群将会选择B1节点作为主节点,集群将会正确的提供服务,当B从新开启后,成为B1的从节点
如果B和B1同时挂掉了,那么集群无法正确提供服务了

Redis集群关闭

  #在/usr/local/redis_cluster/创建并编写脚本 vim shutdown.sh

1/usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7000 -a '你的密码' shutdown
2 /usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7001 -a '你的密码' shutdown
3 /usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7002 -a '你的密码' shutdown
4 /usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7003 -a '你的密码' shutdown
5 /usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7004 -a '你的密码' shutdown
6 /usr/local/redis_cluster/src/redis-cli -c -h 127.0.0.1 -p 7005 -a '你的密码' shutdown
:wq
#记得修改权限
chmod u+x shutdown.sh
./shutdown.sh

Redis集群启动

  #在/usr/local/redis_cluster/创建并编写脚本 vim redistart.sh

1 /usr/local/redis_cluster/src/redis-server ./7000/redis.conf
2 /usr/local/redis_cluster/src/redis-server ./7001/redis.conf
3 /usr/local/redis_cluster/src/redis-server ./7002/redis.conf
4 /usr/local/redis_cluster/src/redis-server ./7003/redis.conf
5 /usr/local/redis_cluster/src/redis-server ./7004/redis.conf
6 /usr/local/redis_cluster/src/redis-server ./7005/redis.conf
:wq
#记得修改权限
chmod u+x redistart.sh
./redistart.sh

  测试一下:

./src/redis-cli -c -p 7000 -a 密码

127.0.0.1:7000> keys *
1) "aa"
127.0.0.1:7000> set bb 123
-> Redirected to slot [8620] located at 127.0.0.1:7001
OK
127.0.0.1:7001> set cc 87
-> Redirected to slot [700] located at 127.0.0.1:7000
OK
127.0.0.1:7000> keys *
1) "cc"
2) "aa"
127.0.0.1:7000> get aa
"99"
127.0.0.1:7000> get bb
-> Redirected to slot [8620] located at 127.0.0.1:7001
"123"
127.0.0.1:7001> get cc
-> Redirected to slot [700] located at 127.0.0.1:7000
"87"
127.0.0.1:7000> 

以上是关于redis集群配置