Установка Redis(Ubuntu настройки подойдут и для FreeBSD) важно (версии должны быть одинаковы)
Сначала нужно установить Redis на оба сервера.
sudo apt-add-repository ppa:chris-lea/redis-server
Нажмите Enter, чтобы продолжить.
Обновите индекс пакетов сервера и установите сервер Redis:
sudo apt-get update
sudo apt-get install redis-server
Эта команда установит сервер Redis и запустит сервис.
Проверьте состояние Redis:
redis-cli ping
Если установка и запуск Redis прошли успешно, вы увидите ответ:
PONG
Защита трафика между двумя серверами
Примечание: Данный раздел нужно выполнить на всех серверах.
По умолчанию Redis не предоставляет шифрования, поскольку предполагает развёртывание в изолированной сети заведомо безопасных серверов. Следовательно, чтобы все внешние соединения были безопасными, оба сервера должны находиться в изолированной сети, либо же вы должны защитить трафик между серверами при помощи специальных инструментов шифрования.
Изолированная сеть
Если серверы находятся в изолированной сети, достаточно просто отредактировать конфигурационный файл Redis и добавить IP-адрес сети.
Откройте конфигурационный файл Redis:
vim /etc/redis/redis.conf
Найдите строку bind и вставьте IP-адрес изолированной сети.
bind 127.0.0.1 isolated_IP_address
Сохраните и закройте файл. Перезапустите сервис:
sudo systemctl restart redis-server.service
Откройте порт Redis в брандмауэре:
sudo ufw allow 6379
Теперь серверы могут взаимодействовать друг с другом. Чтобы убедиться в этом, используйте командную строку redis-cli. Запустите:
redis-cli -h isolated_IP_address ping
PONG
Теперь сервер Redis может принимать внешние соединения в изолированной сети.
Инструменты шифрования
Если сервер развёрнут вне изолированной среды, обязательно нужно защитить трафик между серверами. Существует несколько способов сделать это:
- Инструмент stunnel – инструмент для туннелирования. Позволяет настроить входящий туннель на сервере redis и исходящий туннель на сервере web. Сервер web будет подключаться к локальному порту для связи с удаленным сервисом Redis.
- Инструмент spiped: сервер web будет использоваться в качестве клиента spiped.на каждом сервере нужно создать юнит-файл system. Сервер web будет подключаться к локальному порту для связи с удаленным сервисом Redis.
- PeerVPN: оба сервера будут помещены в VPN. Сервер web будет подключаться к серверу redis с помощью IP-адреса VPN.
Выберите один из предложенных методов и зашифруйте трафик между серверами.
Настройка master-сервера Redis
Теперь все готово к настройке ведущего сервера Redis.
Откройте /etc/redis/redis.conf в текстовом редакторе:
vim /etc/redis/redis.conf
Найдите параметр tcp-keepalive и установите значение 60. Так Redis сможет определять сбои сети или сервиса.
tcp-keepalive 60
Затем найдите директиву requirepass. Выберите сложный пароль и введите его в эту строку. Ранее вы защитили трафик Redis от постороннего вмешательства, а теперь, с помощью директивы requirepass, вы настроили аутентификацию Redis. Redis не ограничивает количество попыток ввода пароля, потому пароль должен быть очень сложным – иначе его могут подобрать с помощью brute force атаки.
requirepass your_redis_master_password
Теперь нужно установить несколько опциональных параметров. Эти настройки зависят от целей сервера.
Если вы не хотите, чтобы Redis автоматически сбрасывал старые и менее используемые ключи по мере заполнения, отключите автоматический сброс ключей:
maxmemory-policy noeviction
Также вы можете настроить длительное хранение данных. Это позволяет минимизировать потерю данных в случае сбоя системы, но может замедлить производительность.
appendonly yes
appendfilename "redis-staging-ao.aof"
Сохраните и закройте файл.
Перезапустите сервис Redis.
sudo systemctl restart redis-server.service
Теперь master-сервер нужно протестировать.
Тестирование master-сервера Redis
Убедитесь, что вы можете пройти аутентификацию при помощи установленного пароля. Запустите клиент Redis:
redis-cli
Попробуйте запустить команду, не проходя аутентификацию:
info replication
Сервер должен ответить:
NOAUTH Authentication required.
Если сервер требует авторизоваться, значит, настройка прошла успешно.
Чтобы пройти аутентификацию, введите команду auth и пароль:
auth your_redis_master_password
Сервер ответит:
OK
Теперь снова попробуйте запустить команду:
info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
Создайте тестовый ключ для проверки репликации данных. Например:
set test 'this key was defined on the master server'
Вернитесь в оболочку операционной системы:
exit
Настройка slave-сервера Redis
Теперь нужно подготовить ведомый сервер к взаимодействию с master-сервером.
Перейдите на slave-сервер и откройте файл /etc/redis/redis.conf.
vim /etc/redis/redis.conf
Найдите строку slaveof и через пробел укажите в ней IP-адрес и порт для безопасного подключения к master-серверу Redis. По умолчанию сервер Redis прослушивает порт 6379 локального интерфейса, однако при настройке шифрования порт может измениться.
Значения зависят от метода защиты трафика (раздел 2).
Если серверы работают в изолированной сети, вам нужно использовать IP-адрес этой сети и стандартный порт 6379.
slaveof isolated_IP_address 6379
Если вы используете stunnel или spiped, укажите локальный интерфейс (127.0.0.1) и номер локального порта, который используется в качестве туннеля. Например:
slaveof 127.0.0.1 8000
Если вы используете PeerVPN, укажите IP-адрес VPN и стандартный порт Redis. Например:
slaveof 10.8.0.1 6379
Общий синтаксис директивы slaveof имеет такой вид:
slaveof ip_to_contact_master port_to_contact_master
Раскомментируйте строку masterauth и укажите в ней пароль master-сервера Redis.
masterauth your_redis_master_password
Чтобы предотвратить несанкционированный доступ, установите пароль для slave-сервера.
requirepass your_redis_slave_password
Сохраните и закройте файл.
Тестирование slave-сервера и обновление настроек
Прежде чем перезапустить сервис, чтобы обновить настройки, попробуйте подключиться к локальному экземпляру Redis на slave-машине и убедитесь, что у неё нет доступа к тестовому ключу.
redis-cli
Запросите тестовый ключ:
get test
На экране появится:
(nil)
Это значит, что в локальном экземпляре Redis ведомого сервера нет такого ключа. Вернитесь в оболочку системы:
exit
Перезапустите Redis на сервере slave:
sudo systemctl restart redis-server.service
Это обновит настройки сервиса.
Попробуйте снова подключиться к локальному экземпляру Redis:
redis-cli
Как и в случае с master-сервером Redis, неавторизованному пользователю будет отказано в доступе к данным.
get test
(error) NOAUTH Authentication required.
Пройдите аутентификацию:
auth your_redis_slave_password
OK
Попробуйте ещё раз получить доступ к тестовому ключу. Теперь данные будут доступны:
get test
"this key was defined on the master server"
Репликация данных запустилась сразу же после обновления настроек сервиса Redis.
Чтобы убедиться в этом, используйте команду info, которая выводит сведения о репликации.
Info by
https://www.8host.com/blog/replikaciya-dannyx-redis-v-ubuntu-16-04/
server slave config
daemonize yes
pidfile /var/run/redis/redis-server.pid
port 6379
tcp-backlog 511
bind 127.0.0.1
timeout 0
tcp-keepalive 60
loglevel notice
logfile /var/log/redis/redis-server.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
slaveof ip_master_server 6379
masterauth 9yW1weBIin9KDUZ
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
requirepass password
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
server master config
bind ip_server
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis/redis.pid
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/db/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
requirepass 9yW1weBIin9KDUZ
maxmemory 64mb
maxmemory-policy volatile-lru
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-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 no
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