Установка Redis средствами Docker
В этой статье представлена информация об установке Redis средствами Docker на примере Ubuntu 20.04.1 LTS. Все действия производятся в консоли Linux-окружения.
В сравнении с установкой через пакетный менеджер Ubuntu, которая описана в статье "Использование кэша Redis в ELMA", различаются места хранения файла конфигурации и способы запуска служб.
Перед установкой проверьте, что выполнены следующие условия:
- установлена Linux или Linux-окружение: code.visualstudio.com/blogs/2020/03/02/docker-in-wsl2;
- у пользователя username есть полномочия для запуска Docker: docker ps -a;
- есть утилиты docker-compose: docker-compose ps;
- установлен образ Redis. Скачать можно командой docker pull redis:5.0.8.
Если нет Docker (утилит, прав на работу Docker)
В этом случае пользователю с правами суперпользователя (root) нужно выполнить следующие действия:
1. Установить сам Docker: sudo apt-get install docker.
2. Установить утилиты docker-compose для работы с Docker: sudo install docker-compose.
3. Создать группу docker для выдачи полномочий для работы с Docker: sudo groupadd docker.
4. Добавить пользователя username (под этим login происходит создание и запуск Docker) в группу docker: sudo gpasswd -ausernamedocker.
5. Чтобы применились настройки, перезагрузить сервер.
Если на целевой машине нет доступа в Интернет
В этом случае нужно выполнить следующие действия:
1. Установить образ на машине с выходом в интернет: docker pull redis:5.0.8.
2. Сохранить образ: docker save -o redis-5.0.8.tar redis:5.0.8.
3. Скопировать образ на целевую машину.
4. Установить образ: docker image import redis-5.0.8.tar redis:5.0.8.
Место хранения файлов настроек Redis и Docker
Чтобы создать место хранения файлов настроек Redis и Docker, нужно выполнить следующие действия:
1. Создать место хранения файлов конфигурации: sudo mkdir /home/test && sudo chownusername:username/home/test.
2. Войти под пользователем username или su - username.
3. Создать переменную с информацией о пользователе, от которого будет работать контейнер: export redis_user=$(id -u).
4. Создать переменную с информацией о группе, от которой будет работать контейнер: export redis_group=$(id -g).
5. Перейти в место хранения файлов конфигурации: cd /home/test.
6. Создать папку для хранения файлов конфигурации Redis: mkdir conf.
7. Создать папку для хранения журналов работы Redis: mkdir logs.
Файл настроек создания контейнера
Создайте файл конфигрурации docker-compose.yml: touch /home/test/docker-compose.yml.
1. В начале файла указывается версия спецификации файла конфигурации.
version: '3'
services:
2. В зависимости от роли сервера в файле описываются различные контейнеры.
Роль master (для сервера с ролью master).
master:
image: redis:5.0.8
user: $redis_user:$redis_group
volumes: - ./logs:/log - ./conf:/conf
command: redis-server /conf/master.conf
network_mode: host
ports: - 6379:6379
Роль replica (для сервера с ролью replica).
replica:
image: redis:5.0.8
user: $redis_user:$redis_group
volumes: - ./logs:/log - ./conf:/conf
command: redis-server /conf/replica.conf
network_mode: host
ports: - 6379:6379
Роль sentinel (для сервера с ролью master, replica или только sentinel).
entinel:
image: redis:5.0.8
user: $redis_user:$redis_group
volumes: - ./logs:/log - ./conf:/conf
command: redis-server /conf/sentinel.conf --sentinel
network_mode: host
ports: - 26379:26379
Если необходим автозапуск контейнера, в его описание нужно добавить директиву restart: always
.
sentinel:
image: redis:5.0.8
user: $redis_user:$redis_group
restart: always
volumes: - ./logs:/log - ./conf:/conf
command: redis-server /conf/sentinel.conf --sentinel
network_mode: host
ports: - 26379:26379
Файлы настройки Redis
Создайте файлы конфигурации для Redis в зависимости от роли, которую описали в docker-compose.yml.
touch ./conf/master.conf
Содержимое файла можно отредактировать через mcedit ./conf/master.conf или любой удобный редактор.
masterauth "redispassword"
requirepass "redispassword"
bind 0.0.0.0
protected-mode yes
dir "/tmp"
port 6379
logfile "/log/redis-master.log"
maxmemory 512mb
maxmemory-policy volatile-lru
tcp-backlog 511
timeout 0
tcp-keepalive 60
daemonize no
supervised no
pidfile "/var/run/redis/redis-server.pid"
loglevel notice
databases 16
always-show-logo yes
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble 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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
touch ./conf/replica.conf
Содержимое файла можно отредактировать через mcedit ./conf/replica.conf или любой удобный редактор.
replicaof ip_мастер_сервер_redis 6379
masterauth "redispassword"
requirepass "redispassword"
bind 0.0.0.0
protected-mode yes
dir "/tmp"
port 6379
logfile "/log/redis-replica.log"
maxmemory 512mb
maxmemory-policy volatile-lru
tcp-backlog 511
timeout 0
tcp-keepalive 60
daemonize no
supervised no
pidfile "/var/run/redis/redis-server.pid"
loglevel notice
databases 16
always-show-logo yes
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble 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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
touch ./conf/sentinel.conf
Содержимое файла можно отредактировать через mcedit ./conf/sentinel.conf или любой удобный редактор.
port 26379
dir /tmp
sentinel monitor elma-redis ip_мастер_сервер_redis 6379 2
sentinel down-after-milliseconds elma-redis 30000
sentinel parallel-syncs elma-redis 1
sentinel failover-timeout elma-redis 30000
logfile /log/sentinel.log
sentinel auth-pass elma-redis redispassword
После этого проверьте правильность docker-compose.yml: docker-compose config.
Создайте, запустите контейнеры: docker-compose up -d.
Состояние контейнера можно посмотреть с помощью команды docker-compose ps.
Чтобы проверить службу, подключитесь к контейнеру: docker exec -it имя_контейнера_редис bash.
redis-cli
auth redispassword
Если после создания контейнеров в файлы конфигурации были внесены изменения, перезапустите контейнеры: docker-compose restart.
Если были внесены изменения в файлы конфигурации docker-compose.yml, контейнеры нужно пересоздать: docker-compose up -d.
Перед созданием и пересозданием контейнера нужно объявлять переменные redis_user, redis_group:
- создайте переменную с информацией о пользователе, от которого будет работать контейнер: export redis_user=$(id -u);
- создайте переменную с информацией о группе, от которой будет работать контейнер: export redis_group=$(id -g).