高可用 redis 集群搭建

机器准备

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 在后台运行。
bindRedis 绑定的IP地址,默认为 127.0.0.1。可以设置为 0.0.0.0 来让Redis监听所有的IP地址。
portRedis 监听的端口号,默认为 6379
timeout客户端连接超时时间,单位为秒,默认为 0,表示永不超时
loglevelRedis 的日志级别,包括debugverbosenoticewarning,默认为 notice
logfileRedis 的日志文件名,默认为 stdout,表示输出到控制台。如果指定了日志文件名,则日志信息将输出到该文件中。
databasesRedis 可以创建的数据库数,默认为 16。可以通过 SELECT 命令切换数据库 (集群模式不支持)。
maxclients最大客户端连接数,即同时连接Redis的最大客户端数量。默认情况下,该选项为 0,表示不限制客户端连接数。
save指定Redis数据持久化的条件。可以指定多个条件,每个条件由两个数字组成,第一个数字表示多少秒内至少有一个键被修改,第二个数字表示修改了多少个键。例如,save 900 1 表示如果 900 秒内至少有一个键被修改,则进行持久化。
rdbcompression是否使用 RDB 文件压缩,默认为 yes。如果设置为 no,则不压缩 RDB文件,可以加快持久化的速度。
appendonly是否开启 AOF 持久化,默认为 no。如果设置为 yes,则 Redis 将把每个写操作追加到一个 AOF 文件中,以便在Redis 重启后恢复数据。
appendfilenameAOF 持久化文件名,默认为 appendonly.aof
appendfsyncAOF 持久化的同步策略,包括 alwayseverysecno,默认为 everysecalways 表示每次写操作都同步到磁盘,保证数据完整性;everysec 表示每秒同步一次,可以提高性能;no 表示不同步,性能最高,但有数据丢失的风险。
maxmemoryRedis 最大使用内存量,默认为 0,表示不限制内存使用量。可以通过 maxmemory-policy 配置项指定数据淘汰策略。
maxmemory-policyRedis 数据淘汰策略,包括 volatile-lruvolatile-ttlvolatile-randomallkeys-lruallkeys-randomnoeviction,默认为 noeviction。请细看下面的明细讲解
active-defrag-threshold-lowerRedis 内存碎片整理的相关配置项,用于控制碎片整理的触发阈值。默认情况下,Redis 会自动触发碎片整理,当内存碎片率超过 25% 时,会启动主动内存碎片整理机制;该配置项表示碎片率低于这个阈值时停止主动内存碎片整理机制
active-defrag-threshold-upper表示碎片率超过这个阈值时强制触发主动内存碎片整理机制。
aof-use-rdb-preamble是否在每个 AOF 文件的开头添加一个 RDB 文件的头部,该头部包含了 RDB 文件的版本、创建时间等信息,可以用于 AOF 文件的自我修复和版本控制。默认情况下,该选项为开启状态。
cluster-replica-validity-factorRedis Cluster 中,主节点下线时,需要选取一个从节点升为主节点。cluster-replica-validity-factor 表示从节点复制主节点数据的有效性因子,即只有复制数据的时长大于等于主节点下线时长乘以有效性因子,才能选取该从节点升为主节点。默认情况下,该因子为 10,即复制时长要大于等于主节点下线时长的10倍。
stream-node-max-bytesRedis Stream中,一个节点可以存放多少字节的数据,该配置项用于控制每个节点的最大存储字节数。默认情况下,该值为4KB。
tls-cert-file 和 tls-key-fileRedis支持TLS/SSL加密连接,这两个配置项分别表示TLS证书文件和私钥文件的路径。
protected-mode是否开启保护模式,当开启保护模式时,Redis 只能在本地进行访问,不能通过网络访问。默认情况下,该选项为开启状态。
slave-read-only是否将从节点设置为只读模式,即从节点不能执行写操作。默认情况下,该选项为开启状态。
notify-keyspace-eventsRedis 可以监听Key空间的事件,如Key过期、Key被删除等事件,该配置项用于设置要监听的事件类型。例如,设置为Ex表示监听Key过期事件
requirepassRedis 访问密码,如果设置了该选项,则需要在连接Redis时输入密码才能进行访问。
maxmemoryRedis 使用的最大内存量,可以是一个整数值,也可以是一个带有单位的字符串,例如 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 未达到最大内存限制,写操作将不受该配置项的影响。因此,合理设置 maxmemorymaxmemory-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.
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不认输的猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值