【Redis】Linux部署redis 7集群部署三主三从、ACL新建用户及密码(图文教程)

发布于:2025-08-07 ⋅ 阅读:(23) ⋅ 点赞:(0)

在这里插入图片描述


更多相关内容可查看

环境准备

系统要求(此部分在工作中可以不执行)

  • CentOS 7+/Ubuntu 18.04+,GCC 4.9+(建议升级至devtoolset-9)
  • 安装依赖:
    # CentOS/RHEL
    sudo yum install -y gcc make tcl systemd-devel
    # Ubuntu/Debian
    sudo apt update && sudo apt install -y build-essential tcl libsystemd-dev
    

下载解压

下载地址:https://download.redis.io/releases/

选一个适合自己需求的版本即可

在这里插入图片描述

也可以联网下载

wget https://download.redis.io/releases/redis-7.2.0.tar.gz

解压安装包

tar -zxvf redis-7.x.x.tar.gz

在这里插入图片描述

cd redis-7.x.x

在这里插入图片描述

PREFIX 参数明确将Redis的可执行文件、库文件、配置文件等安装到/home/tangweilong/redis-7.4.5/redis 目录下

make && sudo make install PREFIX=/home/tangweilong/redis-7.4.5/redis

在这里插入图片描述

集群配置与启动

创建目录(6个节点:3主+3从)

mkdir -p /home/tangweilong/redis-7.4.5/redis-cluster/{7001,7002,7003,7004,7005,7006}/{conf,data,logs}

在这里插入图片描述

需要在上述的7001~7006/conf下都创建一个新的配置文件

cd /home/tangweilong/redis-7.4.5/redis-cluster/7001/conf/
touch redis.config

配置文件示例(以7001/conf/redis.conf为例,具体配置内容请看注释):

port 7001

# 后台运行
daemonize yes 

# 记录Redis进程ID的文件路径,用于服务管理
pidfile /home/tangweilong/redis-7.4.5/redis-cluster/7001/redis_7001.pid

#日志
logfile "/home/tangweilong/redis-7.4.5/redis-cluster/7001/logs/redis_7001.log"

#数据存储目录(RDB/AOF文件存放位置)
dir /home/tangweilong/redis-7.4.5/redis-cluster/7001/data

#启用集群模式
cluster-enabled yes
# 集群自动生成的配置文件路径,包含节点ID、槽分配等信息
cluster-config-file nodes-7001.conf
# 节点通信超时时间(毫秒)。超时后可能触发故障转移,建议15-30秒
cluster-node-timeout 15000
# 节点对外宣告的IP(云服务器需替换为公网IP),避免因NAT导致通信失败
cluster-announce-ip 192.168.xx.xx
# 节点对外宣告的客户端访问端口(需与port一致)
cluster-announce-port
# 集群总线端口(默认=端口+10000),用于节点间Gossip通信。需开放防火墙
cluster-announce-bus-port 17001  
# 客户端连接密码。集群所有节点需配置相同密码
requirepass xxx
# 主从节点间同步密码,需与requirepass一致。否则主从同步失败
masterauth xxx
# 启用AOF持久化,记录所有写操作。建议开启以提升数据安全性
appendonly yes
# 允许所有ip访问
bind 0.0.0.0
# 关闭保护模式
protected-mode no

启动所有节点

# 赋权 保证对config文件有读写权限
chmod -775 -R redis-cluster/
# 进入你自己的redis服务下面,保证下面有redis-server
cd /home/tangweilong/redis-7.4.5/redis/bin/
# 启动
for port in {7001..7006}; do
  ./redis-server /home/tangweilong/redis-7.4.5/redis-cluster/$port/conf/redis.config
done

在这里插入图片描述

验证进程

ps -ef | grep redis  # 应看到6个带[cluster]标志的进程

在这里插入图片描述

创建Redis集群

your_cluster_password 为你上述config下配置的密码,注意执行完别直接回车,输入yes再回车

redis-cli -a your_cluster_password --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
  • 参数说明
    • --cluster-replicas 1:每个主节点配1个从节点
    • 输入yes确认槽位分配(16384个槽均匀分配)

根据下面红框的编码即可确认主从是谁,命令中的 --cluster-replicas 1 表示每个主节点分配 ​​1个从节点​​,系统会自动按以下规则分配:

​​主节点​​:前 N 个节点(N=总节点数/(副本数+1))。 示例中 6 个节点(7001-7006),副本数为 1,因此前 3个节点(7001、7002、7003)会被选为主节点。
​​从节点​​:剩余节点(7004、7005、7006)自动分配给主节点,形成主从关系。通常分配逻辑为:
7004 复制 7001
7005 复制 7002
7006 复制 7003

在这里插入图片描述

主从验证

./redis-cli -a your_cluster_password -p 7001 cluster nodes

在这里插入图片描述

如果你无需通过用户及密码的方式去链接redis,那么下述内容可直接跳过即可

创建多用户并配置ACL权限(非持久化)

创建多用户(ACL功能),注意下面这种创建用户的方式需要对每一个端口都操作一遍,并且如果重启redis服务后这些用户即失效

# 创建管理员用户(全权限)
# 创建应用用户(仅限特定键和命令)
# 查看用户列表

# 1. 连接 Redis
./redis-cli -a your_cluster_password -p 7001

# 2. 在交互式环境中逐条执行(推荐)
127.0.0.1:7001> ACL SETUSER admin on >pufa1234 ~* +@all
127.0.0.1:7001> ACL SETUSER pufa on >pufa1234 ~cache:* +get +set
127.0.0.1:7001> ACL LIST

在这里插入图片描述

参数项 含义 示例值解析
flags 用户状态标志 on表示用户已启用;sanitize-payload表示启用输入清理(防止恶意参数注入)
passwords 用户密码列表 此处为SHA-256加密的密码哈希值f12295...,实际密码需通过><password>设置
commands 命令权限 -@all +get +set表示禁止所有命令,仅允许GETSET命令
keys 可访问的键模式 ~cache:*表示仅允许操作以cache:为前缀的键
channels Pub/Sub频道权限 空字符串表示未配置频道访问权限(无法使用Pub/Sub)
selectors 条件权限规则 空数组表示未设置细粒度条件权限(如基于键值的动态权限)

验证与测试

redis-cli -u appuser -a user_password -p 7001
> SET cache:key1 "test"  # 应成功
> KEYS *                 # 应报错(无权限)

创建多用户并配置ACL权限(持久化)

创建ACL文件并设置权限

mkdir -p /home/tangweilong/redis-7.4.5/redis-cluster/acl
touch /home/tangweilong/redis-7.4.5/redis-cluster/acl/users.acl

在这里插入图片描述

修改redis.config文件(7001~7006均需修改)

# 注释掉 
#requirepass参数
# 新增持久化用户配置
aclfile /home/tangweilong/redis-7.4.5/redis-cluster/acl/users.acl

Redis从6.0版本开始引入ACL功能后,requirepass实际上是为默认用户default设置密码的快捷方式。
若同时配置aclfile,Redis会优先使用ACL文件中的规则,导致requirepass失效
在这里插入图片描述

此时需要重启redis服务

# 有密码停止服务
./redis-cli -a 密码 -p 7001 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
#启动服务
for port in {7001..7006}; do
  ./redis-server /home/tangweilong/redis-7.4.5/redis-cluster/$port/conf/redis.config
done

在这里插入图片描述

连接redis,通过7001或者任意一个主节点去创建用户持久化到文件中即可,因为上述我们每一个端口的config都配置了同一个users.acl,所以这里做一次持久化写入到文件中就行

./redis-cli -a 密码 -p 7001
#分行执行
ACL SETUSER admin on >pufa1234 ~* +@all
#分行执行
ACL SETUSER pufa on >pufa1234 ~cache:* +get +set
#保存
ACL SAVE

在这里插入图片描述

再重启redis,就可以直接所有节点都读取持久化文件里的用户了

# 无密码停止服务
./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
#启动服务
for port in {7001..7006}; do
  ./redis-server /home/tangweilong/redis-7.4.5/redis-cluster/$port/conf/redis.config
done

在这里插入图片描述

测试可以直接连接,不会报无用户即可

./redis-cli -u redis://用户名:密码@localhost:7001

在这里插入图片描述

telnet/navicat 17连接redis

在本地windows使用telnet访问

telnet 192.168.xx.xx 7001

在这里插入图片描述

如果报如下,保护模式,则需要在7001~7006的redis.config下加入

# 允许所有ip访问
bind 0.0.0.0
# 关闭保护模式
protected-mode no

在这里插入图片描述

然后重启redis

# 无密码停止服务
./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
#启动服务
for port in {7001..7006}; do
  ./redis-server /home/tangweilong/redis-7.4.5/redis-cluster/$port/conf/redis.config
done

在这里插入图片描述

在本地windows使用telnet访问,此时应该发现可以ping通

telnet 192.168.xx.xx 7001

如果使用navicat链接redis需要将navicat升级到17版本,并且只能用上述文档中的admin用户,因为pufa用户权限较低,会导致链接失败

java连接redis配置文件,jar包版本

springboot版本2.7.x
commons-pool2 升级到 2.11.1
jedis 升级到 3.9.0(4版本及以上不行)
spring-data-redis 升级到 2.7.18

配置文件如下(当前版本仅支持以下写法,如果是不同版本请参考引用的class的构造函数以及是否有对应参数的get/set方法,其他内容请看注释):

    <bean id="clusterConfig" class="org.springframework.data.redis.connection.RedisClusterConfiguration" p:username="admin" p:password-ref="redisPassword">
        <property name="clusterNodes">
            <set>
           		 <!--集群及端口>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7001"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7002"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7003"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7004"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7005"></constructor-arg>
                </bean>
                <bean class="org.springframework.data.redis.connection.RedisClusterNode">
                    <constructor-arg name="host" value="192.168.xx.xx"></constructor-arg>
                    <constructor-arg name="port" value="7006"></constructor-arg>
                </bean>
            </set>
        </property>
    </bean>

    <bean id="redisPassword" class="org.springframework.data.redis.connection.RedisPassword" factory-method="of">
        <constructor-arg value="密码"/>
    </bean>

	<!-- p:use-pool="true代表使用jedis连接池,p:database="0"代表使用第一个索引库>
    <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true" p:database="0">
        <constructor-arg index="0" ref="clusterConfig"/>
        <constructor-arg index="1" ref="poolConfig"/>
    </bean>
    <bean id="dataCacheRedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:use-pool="true">
        <constructor-arg index="0" ref="clusterConfig"/>
        <constructor-arg index="1" ref="poolConfig"/>
    </bean>

    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="150"/> //最大连接数
        <property name="maxIdle" value="100"/> //最大空闲连接数
        <property name="minIdle" value="50"/> //最小空闲连接数
    </bean>

    <util:map id="dataCacheExpiresMap" scope="prototype"
              key-type="java.lang.String" value-type="java.lang.Long">
        <entry key="appInstances" value="3600"/>
        <entry key="devs" value="3600"/>
        <entry key="subCerts" value="3600"/>
        <entry key="subscribers" value="3600"/>
        <entry key="busSignInfos" value="600"/>
        <entry key="orgSubscribers" value="600"/>
    </util:map>

redis索引库(额外知识点)

Redis支持多个逻辑数据库(默认16个),索引从0到15。这里database="0"表示使用第1个数据库(索引为0),Redis的​​多个逻辑数据库​​是指在同一Redis实例中,通过索引编号(默认0-15)划分的多个独立键值存储空间。这些数据库在逻辑上完全隔离,但共享同一实例的内存和CPU资源

数据隔离性​​
每个数据库拥有独立的键空间,相同键名在不同数据库中互不影响。例如,database 0的键user:1与database 1的同名键存储不同的值。
​​轻量级设计​​
无需启动多个Redis进程,仅通过SELECT命令即可切换数据库(如SELECT 1切换到索引1的数据库)。
​​共享资源​​
所有数据库共用同一实例的内存和连接池,资源利用率高,但可能因高并发导致单实例性能瓶颈


网站公告

今日签到

点亮在社区的每一天
去签到