• redis学习-集群模式cluster


    前言

    前面学习了redis的主从复制和哨兵模式,提高了redis可用性。但是也存在一定的问题,哨兵模式下,主节点若突然卡顿或下线,可能会有几秒钟的写操作丢失。一般解决办法是在调用方捕捉到写失败时,通过代码控制重试。

    这里介绍另一种主从复制的高可用方案,从3.0开始redis已经支持集群的容错功能。

    redis集群模式是一种去中心化的模式,数据才存储时redis会根据算法(crc16)计算出一个结果,再拿这个结果对总槽数(16384)取余,得到的结果即要存储的槽数,随后切换至该槽所对应的节点进行数据的存取操作

    集群搭建

    redis集群至少需要3个主节点,因为redis集群有投票机制,超过半数的节点认为某个节点挂了,才能确认该节点挂了,很明显2个主节点无法投出超过半数的(挂)票。下面为具体搭建步骤:

    1. 复制6分配置文件模拟6台服务器(因为我只有一台云主机,电脑内存也不支持开6台虚拟机……)。

    2. 分别将端口配置为7001-7006。

    3. 6台服务器配置为3主3从,即每台master挂一个slave。

    4. 安装ruby(5.0已不需要安装ruby)

    5. 创建集群

    配置cluster

    1. 创建文件夹存放cluster节点。

      [root@VM-0-4-centos local]# mkdir -p redis-cluster/7001
      [root@VM-0-4-centos local]# cd redis-cluster/7001/
      
    2. 将redis.conf文件copy至7001目录

      [root@VM-0-4-centos 7001]# cp ../../redis-5.0.5/redis.conf ./
      
    3. 配置redis.conf文件的以下项目

      bind 0.0.0.0 #bind修改为0.0.0.0或本机IP。
      port 7001	#port修改为7001-7006。
      daemonize yes #守护打开,运行方式改为后台运行。
      dir /usr/local/redis-cluster/7001/ #指定数据文件存放位置
      appendonly yes #持久化使用aof方式
      cluster-enabled yes #打开集群模式
      cluster-config-file nodes-7001.conf #指定节点的conf文件
      cluster-node-timeout 15000 #指定节点超时
      
    4. 循环上述操作,分别配置7002-7006节点

      过程略。

    5. 安装ruby(5.0版本可跳过本步骤)

      redis集群需要使用ruby指令,所以需要安装ruby,分别执行以下指令安装ruby。

      PS:centos7支持ruby至2.0.0,建立redis连接时会报错,需要升级ruby版本。参考连接:解决redis requires ruby version 2.3.0

      [root@VM-0-4-centos redis-cluster]# yum install ruby
      [root@VM-0-4-centos redis-cluster]# yum install rubygems
      [root@VM-0-4-centos redis-cluster]# gem install redis
      
    6. 分别启动6台redis

      [root@VM-0-4-centos redis-cluster]# redis-server 7001/redis.conf 
      [root@VM-0-4-centos redis-cluster]# redis-server 7002/redis.conf 
      [root@VM-0-4-centos redis-cluster]# redis-server 7003/redis.conf 
      [root@VM-0-4-centos redis-cluster]# redis-server 7004/redis.conf 
      [root@VM-0-4-centos redis-cluster]# redis-server 7005/redis.conf 
      [root@VM-0-4-centos redis-cluster]# redis-server 7006/redis.conf 
      [root@VM-0-4-centos redis-cluster]# ps -ef| grep redis
      root     21251     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7001 [cluster]
      root     21258     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7002 [cluster]
      root     21263     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7003 [cluster]
      root     21268     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7004 [cluster]
      root     21275     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7005 [cluster]
      root     21280     1  0 20:21 ?        00:00:00 redis-server 0.0.0.0:7006 [cluster]
      
    7. 执行redis-trid.rb创建集群

      • 5.0以下版本执行redis-trid.rb创建集群

        # create:创建
        # replicas:每个主节点下挂在几个子节点,1即 主节点数:从节点数 = 1:1
        [root@VM-0-4-centos src]# ./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
        
      • 5.0版本执行redis-cli --cluster创建集群

        [root@VM-0-4-centos src]# redis-cli --cluster create 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 --cluster-replicas 1>>> Performing hash slots allocation on 6 nodes...
        Master[0] -> Slots 0 - 5460
        Master[1] -> Slots 5461 - 10922
        Master[2] -> Slots 10923 - 16383
        Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
        Adding replica 127.0.0.1:7006 to 127.0.0.1:7002
        Adding replica 127.0.0.1:7004 to 127.0.0.1:7003
        >>> Trying to optimize slaves allocation for anti-affinity
        [WARNING] Some slaves are in the same host as their master
        M: 27799119db44ff70c9c0249bc68303fa163f46fc 127.0.0.1:7001
           slots:[0-5460] (5461 slots) master
        M: 090839249a4993d5f63333622a19ba29aadd2be4 127.0.0.1:7002
           slots:[5461-10922] (5462 slots) master
        M: da56283c9e47c44514a297e9c684ef23fd2b367f 127.0.0.1:7003
           slots:[10923-16383] (5461 slots) master
        S: 70d0b084ed68e5ee5988cd50d62154f7e5124459 127.0.0.1:7004
           replicates 090839249a4993d5f63333622a19ba29aadd2be4
        S: dd44407bf6cfc543a7b59603ae6b7164c3bf3299 127.0.0.1:7005
           replicates da56283c9e47c44514a297e9c684ef23fd2b367f
        S: 1f73e3d6bd5ed45c4a046b2de6943ef9c23f98d3 127.0.0.1:7006
           replicates 27799119db44ff70c9c0249bc68303fa163f46fc
        Can I set the above configuration? (type 'yes' to accept):
        ==========================>这里打印了IP的角色分配,及每个节点的hash槽分配1、2、3为主节点,4、5、6为从节点,确认无误后输入yes保存配置
        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 127.0.0.1:7001)
        M: 27799119db44ff70c9c0249bc68303fa163f46fc 127.0.0.1:7001
           slots:[0-5460] (5461 slots) master
           1 additional replica(s)
        M: da56283c9e47c44514a297e9c684ef23fd2b367f 127.0.0.1:7003
           slots:[10923-16383] (5461 slots) master
           1 additional replica(s)
        M: 090839249a4993d5f63333622a19ba29aadd2be4 127.0.0.1:7002
           slots:[5461-10922] (5462 slots) master
           1 additional replica(s)
        S: 1f73e3d6bd5ed45c4a046b2de6943ef9c23f98d3 127.0.0.1:7006
           slots: (0 slots) slave
           replicates 27799119db44ff70c9c0249bc68303fa163f46fc
        S: dd44407bf6cfc543a7b59603ae6b7164c3bf3299 127.0.0.1:7005
           slots: (0 slots) slave
           replicates da56283c9e47c44514a297e9c684ef23fd2b367f
        S: 70d0b084ed68e5ee5988cd50d62154f7e5124459 127.0.0.1:7004
           slots: (0 slots) slave
           replicates 090839249a4993d5f63333622a19ba29aadd2be4
        [OK] All nodes agree about slots configuration.
        >>> Check for open slots...
        >>> Check slots coverage...
        [OK] All 16384 slots covered.
        ============================[OK]到此全部16384个槽已经分配完毕,集群配置已保存至node.conf文件
        
      1. 登录客户端查看

        redis-cli -c -h 127.0.0.1 -p 7001

        • -c:集群
        • -h:host
        • -p:port

        cluster info

        • info :查看集群信息
        • nodes:查看节点信息
        # 查看集群信息
        [root@VM-0-4-centos src]# redis-cli -c -h 127.0.0.1 -p 7001
        127.0.0.1:7001> cluster info
        cluster_state:ok
        cluster_slots_assigned:16384
        cluster_slots_ok:16384		<==  16384个槽OK
        cluster_slots_pfail:0
        cluster_slots_fail:0
        cluster_known_nodes:6		<== 共计6个节点
        cluster_size:3				<== 3主从集群
        cluster_current_epoch:6
        cluster_my_epoch:1
        cluster_stats_messages_ping_sent:667
        cluster_stats_messages_pong_sent:657
        cluster_stats_messages_sent:1324
        cluster_stats_messages_ping_received:652
        cluster_stats_messages_pong_received:667
        cluster_stats_messages_meet_received:5
        cluster_stats_messages_received:1324
        ===============================================================================================
        127.0.0.1:7001> cluster nodes 
        da56283c9e47c44514a297e9c684ef23fd2b367f 127.0.0.1:7003@17003 master - 0 1597425171850 3 connected 10923-16383 		<======节点信息,ip、端口、角色、槽数、连接数等
        090839249a4993d5f63333622a19ba29aadd2be4 127.0.0.1:7002@17002 master - 0 1597425171000 2 connected 5461-10922
        1f73e3d6bd5ed45c4a046b2de6943ef9c23f98d3 127.0.0.1:7006@17006 slave 27799119db44ff70c9c0249bc68303fa163f46fc 0 1597425170830 6 connected
        dd44407bf6cfc543a7b59603ae6b7164c3bf3299 127.0.0.1:7005@17005 slave da56283c9e47c44514a297e9c684ef23fd2b367f 0 1597425169000 5 connected
        70d0b084ed68e5ee5988cd50d62154f7e5124459 127.0.0.1:7004@17004 slave 090839249a4993d5f63333622a19ba29aadd2be4 0 1597425169810 4 connected
        27799119db44ff70c9c0249bc68303fa163f46fc 127.0.0.1:7001@17001 myself,master - 0 1597425170000 1 connected 0-5460
        

      使用集群

      使用集群登录主节点客户端进行数据操作

      127.0.0.1:7001> keys *
      (empty list or set)						<==== 其实为空
      127.0.0.1:7001> set name zmc
      -> Redirected to slot [5798] located at 127.0.0.1:7002
      OK										<==== 设定值时重定向到[5798]槽存储,而5798槽位于7002节点
      127.0.0.1:7002> set age 18
      -> Redirected to slot [741] located at 127.0.0.1:7001
      OK										<==== 重定向到7001节点
      127.0.0.1:7001> set sex male
      OK										<==== 未进行重定向,扔存储于7001节点
      127.0.0.1:7001> set addr1 sz
      -> Redirected to slot [12108] located at 127.0.0.1:7003
      OK										<==== 重定向至7003节点
      127.0.0.1:7003>
      

      分析上述打印信息可得知:

      • 7001主节点下存储两个key:age和sex
      • 7002主节点下存储一个key:name
      • 7003主节点下存储一个key addr1

      我们分别登陆三个节点查看keys

      127.0.0.1:7001> keys *
      1) "sex"
      2) "age"
      
      127.0.0.1:7002> keys *
      1) "name"
      
      127.0.0.1:7003> keys *
      1) "addr1"
      

      查看结果与预测一致,redis集群模式是一种去中心化的模式,数据才存储时redis会根据算法(crc16)计算出一个结果,再拿这个结果对总槽数(16384)取余,得到的结果即要存储的槽数,随后切换至该槽所对应的节点进行数据的存取操作

  • 相关阅读:
    [日常摸鱼]bzoj1470[noi2002]Savage
    [日常摸鱼][POI2000]病毒-Tire图(AC自动机)+dfs
    [日常摸鱼]luogu3398仓鼠找sugar-树链剖分
    [日常摸鱼]luogu1613跑路
    [日常摸鱼]bzoj4802 欧拉函数-PollardRho大整数分解算法
    [日常摸鱼]bzoj1444 [JSOI2009]有趣的游戏——AC自动机+矩阵
    [日常摸鱼]bzoj1038 [ZJOI2008]瞭望塔-模拟退火/几何
    [日常摸鱼]poj2420 A Star not a Tree?
    [日常摸鱼]字符串相关
    图论-拓扑排序-应用
  • 原文地址:https://www.cnblogs.com/bcomll/p/13507295.html
Copyright © 2020-2023  润新知