sysmerge IT

22 июл. 2018 г.

Настройка twemproxy (nutcracker) на Debian 8

twemproxy (или как он еще называется nutcracker) - разработка Twitter, представляет из себя прокси для Memcached или Redis. В данном примере мы будет проксировать именно к нескольким Redis-серверам. Особенностью twemproxy является встроенный шардинг (шардинг, по простому, когда данные, хранящиеся на редиса-бекендах, распределены между каждым бекендом, распределение выполняется по выбранному алгоритму). Шардинг позволит сократить запросы к Redis-бекендам, тем самым решая проблемы горизонтального масштабирования.

Кстати, на данный момент сам Redis уже вполне неплохо умеет в Redis-cluster, который сам делает шардинг, умеет в замену слотов, перемещение хеш-слотов, реплики и тд. Но речь не об этом сейчас.

Итак, изначально нам нужно установить несколько Redis серверов.
Качаем свежий релиз отсюда. Распковываем и идем в /redis-stable/utils:
root@test:~/redis-stable/utils# bash install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please 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!
Starting Redis server...
Installation successful!
root@test:~/redis-stable/utils# systemctl start redis_6379
root@test:~/redis-stable/utils# systemctl enable redis_6379
Synchronizing state for redis_6379.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d redis_6379 defaults
Executing /usr/sbin/update-rc.d redis_6379 enable
root@test:~/redis-stable/utils# bash install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 6380
Please select the redis config file name [/etc/redis/6380.conf]
Selected default - /etc/redis/6380.conf
Please select the redis log file name [/var/log/redis_6380.log]
Selected default - /var/log/redis_6380.log
Please select the data directory for this instance [/var/lib/redis/6380]
Selected default - /var/lib/redis/6380
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port           : 6380
Config file    : /etc/redis/6380.conf
Log file       : /var/log/redis_6380.log
Data dir       : /var/lib/redis/6380
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/6380.conf => /etc/init.d/redis_6380
Installing service...
Success!
Starting Redis server...
Installation successful!
root@test:~/redis-stable/utils#
root@test:~/redis-stable/utils# systemctl start redis_6380
root@test:~/redis-stable/utils# systemctl enable redis_6380
Synchronizing state for redis_6380.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d redis_6380 defaults
Executing /usr/sbin/update-rc.d redis_6380 enable
root@test:~/redis-stable/utils# netstat -ln | grep redis
root@test:~/redis-stable/utils# netstat -apln | grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      9214/redis-server 1
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      9291/redis-server 1

На примере выше мы подняли 2 редис сервера, можно больше.

Устанавливаем  twemproxy:
root@test:~/# apt-get install nutcracker
В конфиг /etc/nutcracker/nutcracker.yml добавляем следующее:
redisserver:
  listen: 10.10.10.10:65123
  hash: fnv1a_64
  hash_tag: "{}"
  distribution: ketama
  auto_eject_hosts: false
  timeout: 400
  redis: true
  servers:
   - 127.0.0.1:6379:1 redis1
   - 127.0.0.1:6380:1 redis2

Запускаем
service nutcracker start
Итак, наш прокси слушает внешний IP 10.10.10.10 порт 65123, проксируя соединения к двум редис серверам, которые не имеют доступа наружу. У обоих одинаковый приоритет. Автоматическое извлечение редис-сервера в случае ошибок отключено.

Статистику twemproxy  выдает на 22222 порту в формате JSON.