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