【Redis】Linux部署redis 7集群部署三主三从、ACL新建用户及密码(图文教程)
文章目录
- 环境准备
- 下载解压
- 集群配置与启动
- 创建Redis集群
- 创建多用户并配置ACL权限(非持久化)
- 创建多用户并配置ACL权限(持久化)
- telnet/navicat 17连接redis
- java连接redis配置文件,jar包版本
更多相关内容可查看
环境准备
系统要求(此部分在工作中可以不执行)
- 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 表示禁止所有命令,仅允许GET 和SET 命令 |
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的数据库)。
共享资源
所有数据库共用同一实例的内存和连接池,资源利用率高,但可能因高并发导致单实例性能瓶颈