Создал кластер Redis — сверхдетальная конфигурация

Redis

Связанная статья: springboot создает клиент redis-cluster, подключается и использует кластер redis, созданный в нашей статье.

1. Подготовить 6 серверов

адрес сервера роль сервера
192.168.1.1 master
192.168.1.2 master
192.168.1.3 master
192.168.1.4 slave
192.168.1.5 slave
192.168.1.6 slave

Кластер Redis имеет не менее 6 узлов (три мастера и три раба). Если только 4 узла запускаются, он подскажет, что: Redis Cluster требует как минимум 3 мастера, и для 4 машин невозможно удовлетворить, что каждый мастер имеет реплику (реплика, рабский узел)

2. Скачать Redis (Стабильная версия: 5.0.4)

wget http://download.redis.io/releases/redis-5.0.4.tar.gz

tar xzf redis-5.0.4.tar.gz

cd redis-5.0.4

make

Если при создании появляется запрос cc: команда не найдена, это связано с тем, что на виртуальной машине не установлен gcc, просто установите его: yum install -y gcc

3. Отредактируйте redis.conf

port 6379
daemonize yes   # 以后台模式运行
protected-mode no   # 集群模式下要设置成no,设置为yes的时候需要配合bind参数,只有被bind的ip能访问我们的redis

dir /data/redis # 日记、aof、rdb文件都会保存到这里 所以这个路径要是机器磁盘空间最大的(可通过df –h来获取磁盘信息)
logfile redis-6379.log  # 产生的日记名
loglevel notice #日记级别(用于生产环境)

timeout 1800    # 在客户端空闲多久后关闭连接,单位为秒。0表示永不关闭,这里的值必须大于客户端设置的连接池的最小空闲时间
tcp-keepalive 0 # 0表示在没有通信的情况下,不会向客户端发送TCP ACK来检测客户端是否被关闭,因为在客户端有空闲检测,所以服务端没必要去检测客户端的状态

maxmemory 4gb   # redis最多能用多少内存,如果不设置的话,redis会一直消耗完系统所有的内存
maxmemory-policy volatile-lfu    # redis达到maxmemory后的内存回收策略,lfu比lru性能更好
lfu-log-factor 10
lfu-decay-time 1

dbfilename redis-6379.rdb # 产生的rdb文件名
rdbcompression yes  # 开启rdb文件压缩
stop-writes-on-bgsave-error yes  # bgsave错误的时候停止写操作来保证bgsave成功
rdbchecksum yes # 检测rdb文件的完整性

appendonly yes  # 开启aof,建议主节点关闭,从节点开启
appendfsync everysec    # aof刷盘策略
auto-aof-rewrite-min-size 64mb  # 当aof文件多大的时候才进行重写
auto-aof-rewrite-percentage 100 # aof增长率
no-appendfsync-on-rewrite yes   # 在aof重写的时候时候不进行正常的aof
appendfilename redis-6379.aof    # 产生的aof文件名

# 当hash的大小小于512个,并且每个值都小于64byte时,就使用ziplist存储
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2    # redis的list结构是quickList,每个quickList由多个quicklistNode组成,每个quicklistNode有个指针指向实际存储的zipList。这里的-2是指zipList的长度8kb,超出了这个字节数,就会新起一个ziplist
list-compress-depth 0   # 压缩深度为0,表示zipList不压缩,不压缩的话,push/pop会快;深度为1时,表示quicklist首尾两个ziplist不压缩,其他的都压缩;如果深度为2,就表示quicklist的首尾第一个ziplist 以及首尾第二个ziplist都不压缩,其他的都压缩;以此类推
set-max-intset-entries 512  # 当intset的元素个数达到512个后,intset升级成dict
zset-max-ziplist-entries 128    # 与hash同理,因为set是hash的特殊情况,set的value都是null
zset-max-ziplist-value 64
# hll-sparse-max-bytes 3000

slowlog-max-len 1000    # 慢查询队列的长度
slowlog-log-slower-than 1000   # 多少时间定义为慢查询 单位微秒

cluster-enabled yes # 是否以集群的形式启动
cluster-config-file redis-nodes.conf
cluster-require-full-coverage no    # 集群中是否16384个槽都可用或所有master节点都没有问题才对外提供服务,保证集群的完整性 
cluster-node-timeout 15000    # 各个节点相互发送消息的频率,单位为毫秒。某节点发现与其他节点最后通信时间超过cluster-node-timeout/2时会发送ping命令,同时带上slots槽数组(2KB)和整个集群1/10的状态数据(10个节点的状态数据约1KB),该参数也会影响故障转移时间

client-output-buffer-limit normal 0 0 0 # 不限制普通客户端缓冲区
client-output-buffer-limit replica 512mb 128mb 60   # slave同步主节点的数据,当slave缓冲区超过512m或者缓冲区在60s秒一直处于128m以上,slave节点会被挂掉
client-output-buffer-limit pubsub 32mb 8mb 60

replica-lazy-flush yes  # 从库接收完rdb文件后的 flush操作
lazyfree-lazy-eviction yes  # 内存达到 maxmemory时进行淘汰
lazyfree-lazy-expire yes    # key过期删除
lazyfree-lazy-server-del yes    # rename指令删除destKey

4. Создайте путь к каталогу, настроенный в redis.conf.

mkdir -p /data/redis

5. Запустите Redis на шести узлах соответственно.

src/redis-server redis.conf

6. Настройка Linux перед запуском кластера (пропустить)

sudo sysctl vm.overcommit_memory=1

sudo sysctl vm.swappiness=0

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo 511 > /proc/sys/net/core/somaxconn

7. Запустите кластер

src/redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 --cluster-replicas 1

# 查看集群命令
src/redis-cli --cluster help
src/redis-cli cluster nodes
src/redis-cli cluster info
Описание параметров конфигурации Linux перед запуском кластера

overcommit_memory

0: указывает, что ядро ​​проверит, достаточно ли доступной памяти для использования процессом приложения; если доступной памяти достаточно, приложение памяти разрешено; в противном случае приложение памяти завершается сбоем, и процессу приложения возвращается ошибка

1: указывает, что ядро ​​допускает чрезмерное выделение всей физической памяти, независимо от текущего состояния памяти.

cat /proc/sys/vm/overcommit_memory

sudo sysctl vm.overcommit_memory=1

Нам нужно установить это значение равным 1, а затем установить разумный maxmemory для Redis, чтобы гарантировать, что машина имеет 20%-30% свободной памяти, и гарантировать, что fork, bgsave и aof rewrite не будут блокировать основной поток.

swappiness

0: Я бы предпочел быть убитым OOM, чем поменяться местами. Когда физической памяти недостаточно, избегайте смерти redis (если текущий redis высокодоступен, смерть лучше, чем блокировка, вызванная вызовом swap)

cat /proc/sys/vm/swappiness

立即生效:echo 0 > /proc/sys/vm/swappiness

永久生效:echo vm.swappiness=0 >> /etc/sysctl.conf

或者:sysctl vm.swappiness=0

THP

Ускорить форк; рекомендуется отключить, иначе это может привести к увеличению накладных расходов на память.

echo never > /sys/kernel/mm/transparent_hugepage/enabled

TCP backlog

Значение разблокировки TCP по умолчанию Redis redis составляет 511, который можно отрегулировать путем изменения конфигурации TCP-backlog. Если TCP-отставание Linux меньше, чем TCP-backlog, установленное Redis, необходимо сделать следующие модификации

echo 511 > /proc/sys/net/core/somaxconn