机器准备
my_middleware-dev_10.12.3.40
my_middleware-dev_10.12.3.41
my_middleware-dev_10.12.3.42
创建 redis 专属用户组和用户
groupadd -g 1012 redis
useradd -M -g redis -u 1012 redis -s /sbin/nologin
# 创建 redis 需要的一些目录
mkdir -p /data/logs/redis/
mkdir -p /usr/local/redis6/nodes
mkdir -p /usr/local/redis6/etc
mkdir -p /data/database/redis/redis6001
mkdir -p /data/database/redis/redis6002
# 创建需要的配置文件
touch /usr/local/redis6/etc/redis6001.conf
touch /usr/local/redis6/etc/redis6002.conf
# 授权文件和目录
chown -R redis:redis /usr/local/redis6/nodes
chown -R redis:redis /usr/local/redis6/etc
chown -R redis:redis /data/database/redis
chown -R redis:redis /data/logs/redis/
下载并编译安装
# 下载软件包
mkdir -p /data/downloads && cd /data/downloads
wget https://mirrors.huaweicloud.com/redis/redis-6.2.11.tar.gz
tar zxvf redis-6.2.11.tar.gz
# 编译安装
cd redis-6.2.11
make -j 8
make install PREFIX=/usr/local/redis6
mkdir /usr/local/redis6/conf
cp sentinel.conf redis.conf /usr/local/redis6/conf/
Redis 配置项说明
参数 | 说明 |
---|---|
daemonize | 是否以守护进程的形式运行 Redis,默认为 no 。如果设置为 yes ,则 Redis 在后台运行。 |
bind | Redis 绑定的IP地址,默认为 127.0.0.1 。可以设置为 0.0.0.0 来让Redis监听所有的IP地址。 |
port | Redis 监听的端口号,默认为 6379 。 |
timeout | 客户端连接超时时间,单位为秒,默认为 0 ,表示永不超时 |
loglevel | Redis 的日志级别,包括debug 、verbose 、notice 、warning ,默认为 notice 。 |
logfile | Redis 的日志文件名,默认为 stdout ,表示输出到控制台。如果指定了日志文件名,则日志信息将输出到该文件中。 |
databases | Redis 可以创建的数据库数,默认为 16 。可以通过 SELECT 命令切换数据库 (集群模式不支持)。 |
maxclients | 最大客户端连接数,即同时连接Redis的最大客户端数量。默认情况下,该选项为 0 ,表示不限制客户端连接数。 |
save | 指定Redis数据持久化的条件。可以指定多个条件,每个条件由两个数字组成,第一个数字表示多少秒内至少有一个键被修改,第二个数字表示修改了多少个键。例如,save 900 1 表示如果 900 秒内至少有一个键被修改,则进行持久化。 |
rdbcompression | 是否使用 RDB 文件压缩,默认为 yes 。如果设置为 no ,则不压缩 RDB 文件,可以加快持久化的速度。 |
appendonly | 是否开启 AOF 持久化,默认为 no 。如果设置为 yes ,则 Redis 将把每个写操作追加到一个 AOF 文件中,以便在Redis 重启后恢复数据。 |
appendfilename | AOF 持久化文件名,默认为 appendonly.aof 。 |
appendfsync | AOF 持久化的同步策略,包括 always 、everysec 、no ,默认为 everysec 。always 表示每次写操作都同步到磁盘,保证数据完整性;everysec 表示每秒同步一次,可以提高性能;no 表示不同步,性能最高,但有数据丢失的风险。 |
maxmemory | Redis 最大使用内存量,默认为 0 ,表示不限制内存使用量。可以通过 maxmemory-policy 配置项指定数据淘汰策略。 |
maxmemory-policy | Redis 数据淘汰策略,包括 volatile-lru 、volatile-ttl 、volatile-random 、allkeys-lru 、allkeys-random 、noeviction ,默认为 noeviction 。请细看下面的明细讲解 |
active-defrag-threshold-lower | Redis 内存碎片整理的相关配置项,用于控制碎片整理的触发阈值。默认情况下,Redis 会自动触发碎片整理,当内存碎片率超过 25% 时,会启动主动内存碎片整理机制;该配置项表示碎片率低于这个阈值时停止主动内存碎片整理机制 |
active-defrag-threshold-upper | 表示碎片率超过这个阈值时强制触发主动内存碎片整理机制。 |
aof-use-rdb-preamble | 是否在每个 AOF 文件的开头添加一个 RDB 文件的头部,该头部包含了 RDB 文件的版本、创建时间等信息,可以用于 AOF 文件的自我修复和版本控制。默认情况下,该选项为开启状态。 |
cluster-replica-validity-factor | Redis Cluster 中,主节点下线时,需要选取一个从节点升为主节点。cluster-replica-validity-factor 表示从节点复制主节点数据的有效性因子,即只有复制数据的时长大于等于主节点下线时长乘以有效性因子,才能选取该从节点升为主节点。默认情况下,该因子为 10 ,即复制时长要大于等于主节点下线时长的10倍。 |
stream-node-max-bytes | Redis Stream中,一个节点可以存放多少字节的数据,该配置项用于控制每个节点的最大存储字节数。默认情况下,该值为4KB。 |
tls-cert-file 和 tls-key-file | Redis支持TLS/SSL加密连接,这两个配置项分别表示TLS证书文件和私钥文件的路径。 |
protected-mode | 是否开启保护模式,当开启保护模式时,Redis 只能在本地进行访问,不能通过网络访问。默认情况下,该选项为开启状态。 |
slave-read-only | 是否将从节点设置为只读模式,即从节点不能执行写操作。默认情况下,该选项为开启状态。 |
notify-keyspace-events | Redis 可以监听Key空间的事件,如Key过期、Key被删除等事件,该配置项用于设置要监听的事件类型。例如,设置为Ex表示监听Key过期事件 |
requirepass | Redis 访问密码,如果设置了该选项,则需要在连接Redis时输入密码才能进行访问。 |
maxmemory | Redis 使用的最大内存量,可以是一个整数值,也可以是一个带有单位的字符串,例如 maxmemory 4G 表示使用4GB的内存。默认情况下,该选项为0,表示不限制内存使用量。 |
appendonly | 是否开启AOF持久化模式,即将写操作记录到AOF文件中。默认情况下,该选项为关闭状态。 |
maxmemory-policy 明细配置:
策略 | 说明 |
---|---|
noeviction | 当达到最大内存限制后,新的写操作将会被拒绝,并向客户端返回错误信息。 |
allkeys-lru | 当达到最大内存限制后,Redis 会优先删除最近最少使用(LRU)的键,直到腾出足够的空间来存储新的数据。 |
volatile-lru | 当达到最大内存限制后,Redis 会优先删除过期键中最近最少使用(LRU)的键,直到腾出足够的空间来存储新的数据。 |
allkeys-random | 当达到最大内存限制后,Redis 会从所有的键中随机选择一部分键并删除,直到腾出足够的空间来存储新的数据。 |
volatile-random | 当达到最大内存限制后,Redis 会从过期键中随机选择一部分键并删除,直到腾出足够的空间来存储新的数据。 |
volatile-ttl | 当达到最大内存限制后,Redis 会优先删除过期键中TTL值较小的键,直到腾出足够的空间来存储新的数据。 |
noeviction | 不允许删除任何数据 |
volatile-lru | 删除过期键中最近最少使用(LRU)的键 |
需要注意的是,
maxmemory-policy
只在 Redis 达到最大内存限制时才会生效,如果 Redis 未达到最大内存限制,写操作将不受该配置项的影响。因此,合理设置maxmemory
和maxmemory-policy
是保证Redis正常运行的重要措施之一。
配置文件处理
目前我们将 6001 当成主节点, 6002 当成从节点!
/usr/local/redis6/etc/redis6001.conf
的配置参考如下
注意:其中的 bind 和 cluster-announce-ip 需要更改为宿主的 IP ,比如 10.12.3.40
#GENERAL
daemonize yes
pidfile /var/run/redis/redis6001.pid
port 6001
tcp-backlog 1024
bind 0.0.0.0
tcp-keepalive 120
timeout 0
loglevel notice
logfile /data/logs/redis/redis6001.log
databases 16
#SNAPSHOTTING
stop-writes-on-bgsave-error no
dbfilename redis6001.rdb
dir /data/database/redis/redis6001
appendfilename redis6001.aof
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000
#REPLICATION
repl-diskless-sync no
repl-ping-slave-period 10
repl-timeout 60
repl-backlog-size 100mb
repl-backlog-ttl 3600
#LIMITS
maxmemory 512MB
maxmemory-policy volatile-lru
#SECURITY
requirepass aFTiSsUIm7PgsPGY
#rename-command FLUSHALL ""
#APPEND ONLY MODE
no-appendfsync-on-rewrite no
#LUA SCRIPTING
lua-time-limit 5000
#SLOW LOG
#slowlog-log-slower-than 10000
#slowlog-max-len 128
#ADVANCED CONFIG
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#cluster
cluster-enabled yes
cluster-config-file "/usr/local/redis6/nodes/nodes6001.conf"
cluster-node-timeout 5000
cluster-announce-ip 10.12.3.40
cluster-announce-port 6001
cluster-announce-bus-port 16001
/usr/local/redis6/etc/redis6002.conf
的配置如下(其中 masterauth 声明了当前是从节点):
#GENERAL
daemonize yes
pidfile /var/run/redis/redis6002.pid
port 6002
tcp-backlog 1024
bind 10.12.3.40 127.0.0.1
tcp-keepalive 120
timeout 0
loglevel notice
logfile /data/logs/redis/redis6002.log
databases 16
#SNAPSHOTTING
stop-writes-on-bgsave-error no
dbfilename redis6002.rdb
dir /data/database/redis/redis6002
appendfilename redis6002.aof
appendonly yes
appendfsync everysec
save 900 1
save 300 10
save 60 10000
#REPLICATION
repl-diskless-sync no
repl-ping-slave-period 10
repl-timeout 60
repl-backlog-size 100mb
repl-backlog-ttl 3600
#LIMITS
maxmemory 512MB
maxmemory-policy volatile-lru
#SECURITY
requirepass aFTiSsUIm7PgsPGY
#rename-command FLUSHALL ""
#APPEND ONLY MODE
no-appendfsync-on-rewrite no
#LUA SCRIPTING
lua-time-limit 5000
#SLOW LOG
#slowlog-log-slower-than 10000
#slowlog-max-len 128
#ADVANCED CONFIG
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
#cluster
cluster-enabled yes
cluster-config-file "/usr/local/redis6/nodes/nodes6002.conf"
cluster-node-timeout 5000
cluster-announce-ip 10.12.3.40
cluster-announce-port 6002
cluster-announce-bus-port 16002
masterauth aFTiSsUIm7PgsPGY
放行服务器之间的通讯
服务器目前使用了 iptables 来做防火墙管理,如果是其他的请自行配置!
iptables -A INPUT -s 10.12.3.0/24 -p tcp -i eth0 -m multiport --dports 6001,6002,16001,16002 -j ACCEPT
# 办公网段开放
iptables -A INPUT -s 10.4.0.0/16 -p tcp -i eth0 -m multiport --dports 6001,6002 -j ACCEPT
iptables -A INPUT -s 10.3.0.0/16 -p tcp -i eth0 -m multiport --dports 6001,6002 -j ACCEPT
# 放行 VPN 网段
iptables -A INPUT -s 192.168.41.0/16 -p tcp -i eth0 -m multiport --dports 6001,6002 -j ACCEPT
系统参数调优
# vim /etc/sysctl.conf 增加如下两个配置
net.core.somaxconn = 2048
vm.overcommit_memory = 1
# 保存后使其立即生效
sysctl -p
如果不调优会碰到如下告警
9727:M 17 Mar 2023 11:11:26.707 # WARNING: The TCP backlog setting of 1024 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
10722:M 17 Mar 2023 11:18:19.941 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
创建启动脚本方便后续管理
touch /usr/local/redis6/start-cluster.sh && chmod +x /usr/local/redis6/start-cluster.sh
# 在脚本里面输入如下 包含 #!/bin/sh
#!/bin/sh
# start the master redis node
sudo -u redis /usr/local/redis6/bin/redis-server /usr/local/redis6/etc/redis6001.conf
# start the slave redis node
sudo -u redis /usr/local/redis6/bin/redis-server /usr/local/redis6/etc/redis6002.conf
# 保存
执行创建集群的命令
/usr/local/redis6/bin/redis-cli -a aFTiSsUIm7PgsPGY --cluster create 10.12.3.40:6001 10.12.3.41:6001 10.12.3.42:6001 10.12.3.40:6002 10.12.3.41:6002 10.12.3.42:6002 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.12.3.41:6002 to 10.12.3.40:6001
Adding replica 10.12.3.42:6002 to 10.12.3.41:6001
Adding replica 10.12.3.40:6002 to 10.12.3.42:6001
M: b3c898eb19f5da4a5517d887c04701045205e09e 10.12.3.40:6001
slots:[0-5460] (5461 slots) master
M: 4d4a2eb4e0ab22c3f5044bd470dc6fb9134c7245 10.12.3.41:6001
slots:[5461-10922] (5462 slots) master
M: b6f135c4fcb778fed9cd8d2147132df9809fdd7a 10.12.3.42:6001
slots:[10923-16383] (5461 slots) master
S: 18681125232333399b38aca111f2a58bb4225ec7 10.12.3.40:6002
replicates b6f135c4fcb778fed9cd8d2147132df9809fdd7a
S: 8859cc0529ade49f72e8209dbd5e6581560c6ab5 10.12.3.41:6002
replicates b3c898eb19f5da4a5517d887c04701045205e09e
S: 113f1dc844d722feb89611bb25da392b562c38cd 10.12.3.42:6002
replicates 4d4a2eb4e0ab22c3f5044bd470dc6fb9134c7245
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 10.12.3.40:6001)
M: b3c898eb19f5da4a5517d887c04701045205e09e 10.12.3.40:6001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: b6f135c4fcb778fed9cd8d2147132df9809fdd7a 10.12.3.42:6001
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 113f1dc844d722feb89611bb25da392b562c38cd 10.12.3.42:6002
slots: (0 slots) slave
replicates 4d4a2eb4e0ab22c3f5044bd470dc6fb9134c7245
S: 18681125232333399b38aca111f2a58bb4225ec7 10.12.3.40:6002
slots: (0 slots) slave
replicates b6f135c4fcb778fed9cd8d2147132df9809fdd7a
S: 8859cc0529ade49f72e8209dbd5e6581560c6ab5 10.12.3.41:6002
slots: (0 slots) slave
replicates b3c898eb19f5da4a5517d887c04701045205e09e
M: 4d4a2eb4e0ab22c3f5044bd470dc6fb9134c7245 10.12.3.41:6001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.