• Redis(十三)【集群基础搭建】


    十三、Redis集群基础搭建

    13.1 集群细节

    • 所有redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度何宽带
    • 节点的 fail 是通过集群中超过半数的节点检测失效时才生效的
    • 客户端与 redis 节点直连,不需要中间 proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
    • redis-cluster 把所有的物理节点映射到[0-16383]的slot槽上,cluster 负责维护 node<->slot<->value

    在这里插入图片描述

    13.2 集群搭建

    环境准备

    • redis-6.2.6(下面会有安装教程)
    • 由CentOS7作为镜像的Linux虚拟机
    • yum命令

    1)集群整体规划:

    IP端口号节点
    192.168.159.1007000master
    192.168.159.1007001master
    192.168.159.1007002master
    192.168.159.1007003slave—>master为7001
    192.168.159.1007004slave—>master为7002
    192.168.159.1007005slave—>master为7000

    2)开启防火墙端口

    # 开启防火墙端口7000、7001、7002、7003、7004、7005
    firewall-cmd --zone=public --add-port=7000/tcp --permanent
    firewall-cmd --zone=public --add-port=7001/tcp --permanent
    firewall-cmd --zone=public --add-port=7002/tcp --permanent
    firewall-cmd --zone=public --add-port=7003/tcp --permanent
    firewall-cmd --zone=public --add-port=7004/tcp --permanent
    firewall-cmd --zone=public --add-port=7005/tcp --permanent
    # 重新启动防火墙
    service firewalld restart
    # 查看开放的端口
    firewall-cmd --list-ports
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    3)首先要在Linux虚拟机上安装redis

    # 安装包存放目录
    cd /usr/local/redis
    # 下载最新稳定版
    wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    # 解压
    tar -zxvf redis-6.2.6.tar.gz
    # 进入解压后的目录
    cd /usr/local/redis/redis-6.2.6/
    # 编译
    make
    # 执行 "make install" 默认会安装到 /usr/local/bin,可通过PREFIX指定安装路径
    make install PREFIX=/usr/local/redis
    # 测试是否安装成功,执行下面命令
    /usr/local/redis/bin/redis-server
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    在这里插入图片描述

    1. 创建集群

    判断集群中的一个节点是否可用,是集群中的所用主节点选举过程,如果半数以上的节点认为当前节点挂掉,那么当前节点就是挂掉了,所以搭建 redis 集群时建议节点数最好是奇数,搭建集群至少需要三个主节点、三个从节点,至少需要6个节点

    # 安装ruby和依赖的包
    yum install -y ruby rubygems
    
    • 1
    • 2

    🌈 3.3.5.gem安装http://rubygems.org/downloads/redis-3.3.5.gem

    • 从官网下载redis-3.3.5.gem后,使用 xftp 上传到linux虚拟机中,运行以下命令
    gem install redis-3.3.5.gem 
    
    • 1
    • /usr/local/redis/redis-6.2.6目录下拷贝一份redis.conf文件到/usr/local/redis/目录下,修改以下内容
    bind 0.0.0.0				# 绑定的IP,默认为本机127.0.0.1
    port 7000				    # 运行的端口号,默认为6379
    pidfile /var/run/redis_7000.pid		    # PID进程文件
    daemonize yes				# 以守护进程的方式运行,默认是no,需要我们自己开启yes(实质上就是是否开启后台运行,不占用窗口)
    dbfilename dump-7000.rdb	 # 设置rdb快照文件名字
    appendonly yes				# 默认是不开启aof模式的,默认是使用rdb方式持久化,大部分所有的情况下,rdb完全够用
    appendfilename "appendonly-7000.aof"	# 持久化的名字的文件
    cluster-enabled yes			# 开启集群模式,默认关闭
    cluster-config-file nodes-7000.conf		# 集群各节点配置文件
    cluster-node-timeout 5000    # 集群超时时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 修改如下图所示

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    • /usr/local/redis/目录下创建redis-cluster-upgrade文件夹,并在该文件夹创建7000~7007文件夹
    mkdir redis-cluster-upgrade
    mkdir 7000 7001 7002 7003 7004 7005 7006 7007
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    在这里插入图片描述

    • 将修改后的redis.conf文件复制到7000~7007文件夹下

    在这里插入图片描述

    • 复制完后,对每个redis.conf文件修改对应的端口号

    • 回到/usr/local/redis/bin目录,根据配置文件分别启动redis-server服务

    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7000/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7001/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7002/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7003/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7004/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7005/redis.conf 
    [root@vinjcent bin]# ./redis-server ../redis-cluster-upgrade/7006/redis.conf 
    
    ### 停止节点
    #!/bin/bash
    ./redis-cli -p 7000 shutdown
    ./redis-cli -p 7001 shutdown
    ./redis-cli -p 7002 shutdown
    ./redis-cli -p 7003 shutdown
    ./redis-cli -p 7004 shutdown
    ./redis-cli -p 7005 shutdown
    ./redis-cli -p 7006 shutdown
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    # 查看redis进程
    ps aux|grep redis
    
    • 1
    • 2

    在这里插入图片描述

    redis-trib.rb文件复制到/usr/local/redis/bin/目录下(旧版本才需要

    [root@vinjcent src]# pwd
    /usr/local/redis/redis-6.2.6/src
    # 旧版本需要拷贝
    [root@vinjcent src]# cp ./redis-trib.rb /usr/local/redis/bin/
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    创建集群命令,在/usr/local/redis/bin目录下

    # (旧版本命令)
    ./redis-trib.rb create --replicas 1 192.168.159.100:7000 192.168.159.100:7001 192.168.159.100:7002 192.168.159.100:7003 192.168.159.100:7004 192.168.159.100:7005
    
    # 个人使用的是redis-6.2.6版本,命令如下
    ./redis-cli --cluster create 192.168.159.100:7000 192.168.159.100:7001 \
    192.168.159.100:7002 192.168.159.100:7003 192.168.159.100:7004 192.168.159.100:7005 \
    --cluster-replicas 1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    在这里插入图片描述

    从节点没有hash槽,只有当主节点宕机之后,从节点选举成为新的主节点才有slot槽

    在这里插入图片描述

    • 出现如上信息,说明16284个哈希槽已经全部分配完毕,此时集群搭建成功
    2. 查看集群状态
    ### 1.查看集群状态 check [原始集群中任意节点]
    # 旧版本
    [root@vinjcent bin]# ./redis-trib.rb check 192.168.159.100:7000
    # 新版本 -c 代表集群,没加 -c 代表单机
    ./redis-cli -c -p 7000 -a [密码]
    ./redis-cli -c -p 7000
    
    ### 2.主节点状态说明
    - 主节点
    	主节点存在hash slots,且主节点的hash slots 没有交叉
    	主节点不能删除
    	一个主节点可以有多个从节点
    	主节点宕机时,多个副本之间自动选举主节点
    	
    - 从节点
    	从节点没有hash slots
    	从节点可以删除
    	从节点不负责数据的写,只负责数据的同步
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    在这里插入图片描述

    3. 集群操作

    1)帮助命令

    ### 查看帮助命令
    [root@vinjcent bin]# ./redis-cli --cluster help
    Cluster Manager Commands:
      create         host1:port1 ... hostN:portN
                     --cluster-replicas <arg>
      check          host:port
                     --cluster-search-multiple-owners
      info           host:port
      fix            host:port
                     --cluster-search-multiple-owners
                     --cluster-fix-with-unreachable-masters
      reshard        host:port
                     --cluster-from <arg>
                     --cluster-to <arg>
                     --cluster-slots <arg>
                     --cluster-yes
                     --cluster-timeout <arg>
                     --cluster-pipeline <arg>
                     --cluster-replace
      rebalance      host:port
                     --cluster-weight <node1=w1...nodeN=wN>
                     --cluster-use-empty-masters
                     --cluster-timeout <arg>
                     --cluster-simulate
                     --cluster-pipeline <arg>
                     --cluster-threshold <arg>
                     --cluster-replace
      add-node       new_host:new_port existing_host:existing_port
                     --cluster-slave
                     --cluster-master-id <arg>
      del-node       host:port node_id
      call           host:port command arg arg .. arg
                     --cluster-only-masters
                     --cluster-only-replicas
      set-timeout    host:port milliseconds
      import         host:port
                     --cluster-from <arg>
                     --cluster-from-user <arg>
                     --cluster-from-pass <arg>
                     --cluster-from-askpass
                     --cluster-copy
                     --cluster-replace
      backup         host:port backup_directory
      help           
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45

    2)添加主节点

    ### 1.添加主节点 --cluster add-node [新加入节点] [原始集群中任意节点]
    ./redis-cli --cluster add-node 192.168.159.100:7006 192.168.159.100:7000
    - 注意
    	该节点必须以集群模式启动
    	默认情况下,该节点就是以master节点形式添加
    # 查看集群节点./redis-cli --cluster check [ip]:[port]
    ./redis-cli --cluster check 192.168.159.100:7006
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述

    在这里插入图片描述
    新添加的主节点没有solts槽,需要用到reshard命令进行分片

    3)添加从节点

    ### 1.添加从节点 --cluster add-node --cluster-slave [新加入节点] [集群中任意节点]
    ./redis-cli --cluster add-node --cluster-slave 192.168.159.100:7006 192.168.159.100:7000
    
    - 注意
    	当添加副本节点时,没有指定主节点,redis会随机给该副本节点分配到较少副本节点的主节点
    ### 2.为确定的master节点添加主节点  --cluster add-node --cluster-slave --cluster-master-id [master节点id] [新加入节点] [集群任意节点]
    ./redis-cli --cluster add-node --cluster-slave --cluster-master-id 4ca0a36684446afe069ef575c3ca7d0f60c1186c 192.168.159.100:7006 192.168.159.100:7000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 添加从某个从节点

    在这里插入图片描述

    在这里插入图片描述

    • 为确定的master节点添加主节点

    在这里插入图片描述

    在这里插入图片描述

    4)删除副本节点

    ### 1.删节节点 --cluster del-node [集群中任意节点] [删除节点id]
    ./redis-cli --cluster del-node 192.168.159.100:7005 bb3d941a437c52d98caf993b6a92c3e271bc0435
    
    • 1
    • 2

    在这里插入图片描述

    5)集群在线分片

    ### 1.在线分片 --cluster reshard [集群中任意节点]
      reshard        host:port
                     --cluster-from <arg>
                     --cluster-to <arg>
                     --cluster-slots <arg>
                     --cluster-yes
                     --cluster-timeout <arg>
                     --cluster-pipeline <arg>
                     --cluster-replace
    ./redis-cli --cluster reshard 192.168.159.100:7000
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    13.3 在springboot项目中的配置方式

    • application.yml
    # 端口
    server:
      port: 3035
      servlet:
        context-path: /redisSession
    # 应用名称
    spring:
      application:
        name: redis-session-manager
      # redis集群(建议将所有节点都添加,该集群方式不需要配置主从复制以及哨兵模式,在配置集群中已经具备这些功能)
      redis:
        cluster:
          nodes: 192.168.159.100:7000,192.168.159.100:7001,192.168.159.100:7002,192.168.159.100:7003,192.168.159.100:7004,192.168.159.100:7005
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
  • 相关阅读:
    生成拼图游戏
    汇编语言之源程序
    轻松使用TomCat、Maven和Servlet
    Ansible与Ansible部署
    C++ 炼气期之数据是主角
    STM8S系列基于STVD开发,标准外设库函数开发环境搭建
    端到端的基于深度学习的网络入侵检测方法
    iconfont使用
    聚丙烯微孔膜的等离子体改性及DNA|有机自由基改性DNA-阳离子脂质复合体的应用
    C++程序员入门需要怎么学?(InsCode AI 创作助手)
  • 原文地址:https://blog.csdn.net/Wei_Naijia/article/details/126643757