Thank you for reading this post, don't forget to subscribe!
Redis - сетевое журналируемое хранилище данных типа key-value, данные хранятся в опертивной памяти, переодически записываются на диск.
Redis широко используется для хранения данных в популярных фреймворках, а также имеется поддержка с помощью плагинов CMS WordPress, в которой Redis выступает системой для хранения кеша.
Способ 1
Для установки нужно подключить репозиторий EPEL, после чего
yum install redis -y
Способ 2
Чтобы поставить последнюю версию из исходников выполним следующее:
yum install make gcc* wget tcl -y
выкачиваем последнюю и стабильную версию редиса:
cd /usr/local/src && wget http://download.redis.io/releases/redis-stable.tar.gz
Распаковываем скачанный архив:
tar xzf redis-stable.tar.gz
Переходим в папку и собираем сборку:
cd redis-stable && make
запустите «make test», чтобы проверить, все ли в порядке
make install
Redis установлен. Чтобы настроить redis для запуска в фоновом режиме, запустите скрипт:
bash /usr/local/src/redis-stable/utils/install_server.sh
This script will help you easily set up a running redis serverPlease select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service…
Success!
/var/run/redis_6379.pid exists, process is already running or crashed
Installation successful!
Вам будет предложено ввести различные значения для создания конфигурации, но вы можете просто нажать клавишу «enter», чтобы принять значения по умолчанию.
Проверим версию редиски:
redis-server --version
Запустить сервис, можно:
service redis_6379 start
Перезапустить сервис, можно:
service redis_6379 restart
Для использования редиса, запустите:
redis-cli
Чтобы добавить службу в автозагрузку, используем:
chkconfig --add redis_6379
Меня в такой конфигурации, раздражает то, что он называется redis-server. Для меня логично было бы использовать «redis_6379» из-за того, что на сервере могут иметься еще экземпляры с редисом. По этому, если нужно изменить это, то приступим…
Нас интересует 2 файла:
/usr/local/bin/redis-server
/usr/local/bin/redis-cli
Берем и переименовываем их:
mv /usr/local/bin/redis-server /usr/local/bin/redis_6379
mv /usr/local/bin/redis-cli /usr/local/bin/redis_6379-cli
После этого, стоит поменять путь к данным файлам, для этого открываем:
vim /etc/init.d/redis_6379
Находим:
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
Меняем, на:
EXEC=/usr/local/bin/redis_6379
CLIEXEC=/usr/local/bin/redis_6379-cli
И перезапускаем редиску:
service redis_6379 restart
/etc/init.d/redis_6379 restart
Настройка Redis в Unix/Linux
vim /etc/redis/6379.conf
У меня он выглядит следующим образом:
bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis_6379.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis/6379
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
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
hz 10
aof-rewrite-incremental-fsync yes
И так, у меня редис висит на локалхосте ( 127.0.0.1 ), вот строка:
bind 127.0.0.1
Вообще, можно изменить данную строку на «0.0.0.0» или на конкретный IP адрес.
Строка:
protected-mode yes
Говорит что включен мод-защиты. Это означает, что никто из вне, не сможет подключится к данному редис-серверу. Если хотите чтобы клиенты с других хостов подключались к Redis, то установить в «no».
Сервер использует 6379-й порт. Можно повесить на сокет при необходимости.
Это стандартная конфигурация и она не идеальная, т.к она может «сожрать» всю RAM. Для того чтобы этого не произошло, стоит добавить:
maxmemory 2147483648
И так, я для редиса, ограничил использования виртуальной памяти до 2 Гб. Так же, можно защитить редиску-сервис и установить пароль, для этого — находим строку:
#requirepass foobared
И приводим к виду:
requirepass Your_PASSWORD_here
Иногда, бывает полезным — запретить использование команд, находим:
#rename-command CONFIG ""
И прописываем:
rename-command CONFIG ""
Это запретит использования CONFIG команды в редис. Но можно и переименовать некоторую команду, например:
rename-command CONFIG rename_CONFIG
Данное выражение, заменит использование CONFIG на rename_CONFIG.
Чтобы проверить бенчмарк (нагрузку на редис-сервер), используйте команду:
redis-benchmark
________________________________________________________________________
1.Увеличиваем количество входящих соединений
Прроверяем текущее значение
1
|
# cat /proc/sys/net/core/somaxconn
|
1
|
128
|
1
|
# nano /etc/redis.conf
|
1
|
tcp-backlog 511
|
Выставим somaxconn больше,чем tcp-backlog
1
|
# sysctl -w net.core.somaxconn=1024
|
Для автозагрузки используем
1
|
# nano /etc/sysctl.conf
|
1
|
net.core.somaxconn=1024
|
2.Настройка переменной ядра для работы с памятью vm.overcommit_memory
Определяет условия разрешения и отказа запросов больших объемов памяти.
При установки значения этого параметра в 1 ядро не обрабатывает перерасход памяти. При этом вероятность превышения нагрузки на память возрастает, но в то же время увеличивается производительность задач, активно использующих память
1
|
# sysctl -w vm.overcommit_memory=1
|
Для автозагрузки используем
1
|
# nano /etc/sysctl.conf
|
1
|
vm.overcommit_memory=1
|
3. Отключение функции ядра Transparent HugePages
1
|
# echo never > /sys/kernel/mm/transparent_hugepage/enabled
|
1
|
# cat /sys/kernel/mm/transparent_hugepage/enabled
|
1
|
always madvise [never]
|
Для автозагрузки добавляем в /etc/rc.local (перед строкой выхода exit 0)
1
|
# nano /etc/rc.local
|
1
2
3
|
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
|
4.Использование Unix-сокета вместо порта
Если сервер и клиент Redis находятся на одном хосте, то для ускорения работы Redis можно использовать Unix-сокет вместо порта(где используется TCP/IP-стек)
1
|
# nano /etc/sysctl.conf
|
1
2
|
unixsocket /var/run/redis/redis.sock
unixsocketperm 777
|
Если необходимо отключить работу Редиса через TCP/IP-стек
1
2
|
# port 6379
port 0
|
Подключение с консоли производится путем указания сокет-файла
1
|
# redis-cli -s /var/run/redis/redis.sock
|
5.Определение количества одновременно подключенных клиентов
Значение этого параметра должно быть согласована со значением количества одновременно открытых файлов для пользователя, под которым запущен процесс redis
1
|
maxclients 10000
|
Увеличим количество одновременно открытых файлов для пользователя redis(например, до 10240)
1
|
# nano /etc/security/limits.d/95-redis.conf
|
1
2
|
redis soft nofile 10240
redis hard nofile 10240
|
Проверяем
1
|
# su -l redis -s /bin/bash -c "ulimit -n"
|
1
|
10240
|
6.Определение размера оперативной памяти выделяемой для кэширования
В случае дефолтного значения(нулевого значения), будет использована вся доступная оперативную память.
1
|
maxmemory 512mb
|
При достижении установленного лимита памяти Redis будет пытаться удалять ключи из кеша согласно политике,указанной параметром maxmemory-policy.
Если Redis не может удалить ключи согласно политике либо установлена политика ‘noeviction'(политика,при которой ничего не удаляется из кеша, а отдается ошибка при операции записи), то Redis будет отдавать ошибку командам, которые пытались использовать больше памяти (SET,LPUSH и т.д.) и при этом корректно выполнять команды на чтение (GET и т.д.)
7.Определение политики работы с памятью
При данной политике, во время нехватки памяти, будут удаляться наиболее старые и наименее используемые ключи, чтобы освободить место для новых.
1
|
maxmemory-policy allkeys-lru
|
Возможные политики
1
2
3
4
5
6
|
volatile-lru - удаляет ключи, удаляя наименее используемые, если установлен срок истечения
allkeys-lru - удаляет ключи, убирая наименее используемые ключи (least recently used (LRU)
volatile-random - удаляет ключи в случайном порядке, если установлен срок истечения
allkeys-random - удаляет ключи в случайном порядке
volatile-ttl - в первую очередь удаляет ключи c наименьшим сроком истечения
noeviction -> ничего не удаляет, только возвращает ошибку при попытке использовать памяти больше лимита
|
Бекапы
В Redis реализовано два persistence-режима: RDB и AOF.
Первый режим(RDB)
По умолчанию используется режим RDB
При включении RDB система создает компактные снэпшоты данных в заданные интервалы времени. Это хороший подход для восстановления информации в случае сбоя. Бэкапы пишутся в параллельном процессе при помощи команды fork(), который в случае большой БД затратен по ресурсам и времени. Кроме этого, в случае неожиданного выключения сервера, все данные, которые не были записаны или находились в процессе создания резервной копии, будут утеряны.
По умолчанию установлены параметры:
1
2
3
|
save 900 1
save 300 10
save 60 10000
|
Создать копию, если было хотя бы одно изменение в течение 15 минут (900 секунд);
Создать копию, если в течение 5 минут (300 секунд) было хотя бы 10 изменений;
Создать копию, если за минуту было 10 000 изменений.
Второй режим(AOF)
Append Only File(AOF) представляет собой лог операций, которые выполняют клиенты. то есть все новые данные добавляются к уже имеющимся данным, причем, каждую секунду по умолчания.
Так что в случае сбоя потери будут минимальны. Но подход немного медленнее RDB, лог-файл существенно больше, производительность зависит от параметров fsync.
Включение логирование команд,выполнение которых превышает указанное кол-во микросекунд
Установка отрицательного значения выключает логирование, а установка нулевого значения – включает логирование каждой команды
1
|
slowlog-log-slower-than 10000
|
Длина slow log. Когда новая команда записывается,самая старая – удаляется с очереди логируемых команд
1
|
slowlog-max-len 128
|
Конфигурационный файл редис имеет вид
1
|
# grep -vE '^$|^#' /etc/redis.conf
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
daemonize yes
pidfile /var/run/redis.pid
port 0
tcp-backlog 511
bind 127.0.0.1
unixsocket /var/run/redis/redis.sock
unixsocketperm 777
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxclients 10000
maxmemory 64mb
maxmemory-policy allkeys-lru
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
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
hll-sparse-max-bytes 3000
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
hz 10
aof-rewrite-incremental-fsync yes
|
Получение полной информации о Redis
1
|
# redis-cli info
|
Получение статистики
1
|
# redis-cli info stats
|
Мониторинг скорости кеширования
1
|
# redis-cli info stats | grep keyspace
|
1
2
|
keyspace_hits:2927
keyspace_misses:150
|
Мониторинг лимита доступной памяти maxmemory через eviction ключей:
1
|
# redis-cli info stats | grep evicted_keys
|
1
|
evicted_keys:0
|