redis集群配置

ACL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
127.0.0.1:9736> ACL WHOAMI
"default"

127.0.0.1:9736> ACL SETUSER cs +@read +@write on allkeys
OK

127.0.0.1:9736> acl setuser cs +ping on allkeys
OK

127.0.0.1:9736> acl users
1) "cs"
2) "default"
3) "logs"

127.0.0.1:9736> acl list
1) "user cs on sanitize-payload #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels -@all +@read +@write +ping"
2) "user default on sanitize-payload #bbdac2e00dec531c592e9ee501cc64fde0a4a1795bb164f156982a50a4774170 ~* &* +@all"
3) "user logs on sanitize-payload #bbdac2e00dec531c592e9ee501cc64fde0a4a1795bb164f156982a50a4774170 ~* resetchannels +@all"


读写特定的键

1
2
3
127.0.0.1:6379> ACL SETUSER cs +@read +@write on mykey
#~code、~name 和 ~school 分别表示匹配键
127.0.0.1:6379> ACL SETUSER cs +@read ~code ~name ~school on db1 >mypassword
1
2
3
127.0.0.1:9736> ACL SETUSER test +@read +@write ~db:1 on allkeys >mypassword
127.0.0.1:9736> ACL SETUSER test +@read +@write ~db:9 on allkeys >test9
127.0.0.1:9736> CONFIG REWRITE

保存规则

如果使用 config 模式,将 ACL 权限持久化到 redis.conf 文件中使用下面的命令

1
2
127.0.0.1:9736> CONFIG REWRITE
OK

如果使用 aclfile 模式,将 ACL 权限持久化到 users.acl 文件中使用下面的命令

acl save

backup

RDB

将 Redis 数据库的快照保存到磁盘文件中来实现

1
2
3
save 900 1   # 900秒内至少有1个键被改变则进行快照保存
save 300 10 # 300秒内至少有10个键被改变则进行快照保存
save 60 10000 # 60秒内至少有10000个键被改变则进行快照保存

AOF

每个写操作追加到一个文件中。通过重放这些写操作,可以完全恢复数据集的状态

混合备份

同时使用 RDB 和 AOF 备份

定时备份+实时备份

1
2
3
4
5
6
7
8


#AOF
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

init

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/sh

arr=($(kubectl get pods -l app=redis -o jsonpath='{range.items[*]}{.status.podIP}:6379 '))
echo ${arr[@]}

master=$(echo ${arr[@]}|awk '{print $1" "$2" "$3}')
echo "指定主节点:$master"
echo "yes" | kubectl exec -it redis-app-2 -- redis-cli --cluster create $master

for i in $(seq 3 +1 5); do
echo "添加从节点:"${arr[i]} ${arr[0]}
echo "yes" | kubectl exec -it redis-app-2 -- redis-cli --cluster add-node ${arr[i]} ${arr[0]} --cluster-slave
done

====echo ${arr[@]}|tr -s ‘ ‘|cut -d’ ‘ -f2
==tr
-s 即将重复出现字符串,只保留第一个
==cut
-d 以什么为分割符
-f 第几个
组合等于 awk ‘{print $2}’

=====jsonpath=’{range.items[:3]}{.status.podIP}:6379 ‘
items[:3] 取前3
=====jsonpath=”{range.items[$i,0]}{.status.podIP}:6379 “
双引号传变量

故障

内存问题

设置合理的maxmemory参数

配置合适的数据淘汰策略 LRU(Least Recently Used,最近最少使用)

网络问题

设置超时时间

大key问题

主备切换

业务重试机制

某些慢查询导致time out。执行slowlog查看慢查询语句

连接数 tcp连接:netstat -nat|grep -i “6379”|wc -l

无法获取连接 设置config 参数 timeouttcp-keepalive来清理失效的连接

优化策略

  1. 内存管理

    • maxmemory: 设置 Redis 使用的最大内存量。
    • maxmemory-policy: 定义达到内存上限时的处理策略,如 allkeys-lruvolatile-lruallkeys-random 等。
  2. 持久化

    • appendonly: 是否使用追加文件(AOF)持久化。
    • appendfsync: AOF 持久化的同步频率,可以是 everysecalwaysno
  3. 网络连接

    • tcp-backlog: 设置 TCP 连接的 backlog,影响并发连接数。
    • timeout: 客户端空闲连接的超时时间。
  4. 性能调优

    • databases: 设置数据库的数量,默认为 16。
    • rdbcompression: 是否对 RDB 快照文件进行压缩。
    • hash-max-ziplist-entrieslist-max-ziplist-size 等:调整数据结构的内存优化配置。
  5. 日志记录

    • loglevel: 日志级别,如 debugverbosenoticewarning
    • logfile: 日志文件的路径。
  6. 安全性

    • protected-mode: 是否启用保护模式,防止未授权访问。
    • requirepass: 设置密码保护。
  7. 客户端输出缓冲区限制

    • client-output-buffer-limit: 设置不同类别客户端的输出缓冲区限制。
  8. LRU 缓存淘汰

    • active-expire-cycles: 设置 LRU 缓存淘汰的周期。
  9. 超时和Keepalive

    • tcp-keepalive: 设置 TCP 保活参数。
  10. 主从复制

    • slave-read-only: 设置从服务器是否只读。
    • min-slaves-to-write: 设置至少需要多少个从服务器在线,主服务器才接受写入。
  11. 集群配置(如果使用 Redis 集群):

    • cluster-enabled: 是否启用集群模式。
    • cluster-config-file: 集群配置文件的位置。

solt槽位

方案一: 直接在集群内执行rebalance

1
2
redis-cli -a <password> --cluster rebalance 192.168.33.147:6379
该操作较为花费时间,建议在晚上8 9点之后进行。1.2.

方案二: 手动进行Reshared

1
2
redis-cli -a <password> --cluster reshard 192.168.33.151:6379 --cluster-from fd9d994b67b91xasdff293b363dadcfe617a19gs1 --cluster-to 01981f970cfe668e1bfedfasb35175f85axde --cluster-slots 50 --cluster-yes
from后边跟 从哪个节点移出来的ID, to后边跟想移到哪个节点的ID, cluster-slots后边填多少个槽位 每次迁移。1.2.

方案三: 单个槽位迁移

登录后复制

1
2
3
4
redis-cli -h 192.168.33.34 -p 6379 -a <password> CLUSTER SETSLOT 2209 IMPORTING fd9d994b67b9193ba9f293b363dadcfe617a191d  某个槽位归属于某个节点
redis-cli -a <password> CLUSTER SETSLOT 2209 MIGRATING fd9d994b67b9193ba9f293b363dadcfe617a191d 槽位迁移于某个节点
redis-cli -a <password> CLUSTER SETSLOT 2209 NODE 8ee0a098c32642388b79912ba94c2e45f1d8af98
2209 是槽位号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash

# 替换端口号为 Redis 集群的任意节点的端口
PORT=6379

# 获取集群节点信息
nodes_info=$(redis-cli -p $PORT CLUSTER NODES)

# 提取所有 node ID
echo "$nodes_info" | grep 'id=' | sed -e 's/.*id=\([^ ]*\) .*/\1/'

# 打印结果
echo "Node IDs in the cluster:"
echo "$node_ids"
reshard_move_slots.sh
reshard
#!/bin/bash
for i in `seq 0 10`;do
mapfile -t ips < "node.txt"
for node in "${ips[@]}"; do
        redis-cli -a '' --cluster reshard 192.168.33.98:6379 --cluster-from fd9d994b67b9193ba9f293b363dadcfe617a191d --cluster-to $node --cluster-slots 50 --cluster-yes
        #这里的from是填那个槽位最多的节点ID
        echo "上次迁移的返回值为:$?"
        if [ $? -eq 1 ]; then
        echo "上一个命令返回值为1,中断脚本执行。"

exit 1 else echo "上一个命令返回值不为1,继续执行脚本。" fi echo "节点$node执行迁移完毕,正在迁移下一个节点,3s后开始,。。。。" echo "当前是第$i个循环!" sleep 3 done echo "第$i遍执行完毕,,正在sleep 3s。。。。。。" sleep 3 done
点击打赏
文章目录
  1. 1. ACL
  2. 2. backup
    1. 2.1. RDB
    2. 2.2. AOF
    3. 2.3. 混合备份
  3. 3. init
  4. 4. 故障
    1. 4.1. 内存问题
    2. 4.2. 网络问题
    3. 4.3. 优化策略
  5. 5. solt槽位
载入天数...载入时分秒... ,