Играйте с Codis в кластере Redis

Redis задняя часть база данных сервер
Играйте с Codis в кластере Redis

В последние годы, с быстрым развитием Интернета, масштабы данных, которые нам, как программистам, необходимо обрабатывать, также расширяются. Если вы используете Redis в качестве базы данных, один экземпляр Redis будет бессилен при работе с большими данными и сценариями с высокой степенью параллелизма. В это время появилось кластерное решение Redis, которое интегрировало множество экземпляров Redis для совместной работы со сценариями больших данных и высокой параллелизма.

Codis — это кластерное решение Redis. Он разработан командой промежуточного программного обеспечения Wandoujia, поэтому имеет набор подробной китайской версии README, которую удобно изучать каждому.

Codis架构

Его архитектура показана на рисунке выше, а службы Redis предоставляются извне через codis-proxy. ZooKeeper используется для хранения таблицы маршрутизации данных и метаинформации узлов codis-proxy. codis-proxy будет отслеживать все кластеры Redis.Когда вычислительная мощность кластеров Redis достигает верхнего предела, экземпляры Redis могут быть динамически добавлены для удовлетворения потребностей расширения.

Введение компонента

  • Codis Proxy: как упоминалось ранее, он предоставляет услуги Redis для внешнего мира, за исключением некоторых неподдерживаемых команд (Список неподдерживаемых команд), производительность ничем не отличается от нативного Redis. Поскольку он не имеет состояния, мы можем развернуть несколько узлов, что гарантирует доступность.
  • Codis Dashboard: инструмент управления кластером, поддерживающий такие операции, как добавление и удаление Codis Proxy и перенос данных. Для кластера Codis Dashboard развертывает не более одного
  • Codis Admin: инструмент командной строки для управления кластером
  • Codis FE: интерфейс управления кластером, несколько кластеров Codis могут совместно использовать Codis FE и управлять серверной панелью управления codis с помощью файлов конфигурации.
  • Хранилище: обеспечивает внешнее хранилище для кластера, в настоящее время поддерживает ZooKeeper, Etcd и Fs.
  • Codis Server: на основе разработки ветки 3.2.8 добавлены дополнительные структуры данных для поддержки операций, связанных со слотами, и инструкций по переносу данных.

Принцип разделения Codis

Теперь мы знаем, что Codis перенаправит команду Redis с указанным ключом на базовый Redis. Так как же Codis узнает, на каком Redis находится ключ?

Codis использует технологию Pre-sharding для разделения данных, которое по умолчанию разделено на 1024 слота (0-1023). Когда Codis получает команду, она сначала выполняет ключcrc32операции, а затем взять остаток от 1024, и полученный результат является соответствующим слотом. Затем команду можно перенаправить экземпляру Redis, соответствующему слоту для обработки.

операция расширения

Возможность динамического расширения/уменьшения Codis является одним из его основных моментов. Это может быть прозрачно для клиентов Redis. При расширении Codis предоставляет команду SLOTSSCAN, которая может сканировать все ключи в указанном слоте, а затем переносить каждый ключ. В процессе расширения, если есть новый ключ, который необходимо перенаправить в слот миграции, codis определит, нужно ли перенести ключ.Новое в Redis.

Прочитав приведенное выше введение, вы думаете, что расширение - это очень хлопотная вещь? Codis принял это во внимание для нас. Он обеспечивает функцию автоматического баланса. Просто нажмите кнопку «Автоматическая перебалансировка» в интерфейсе, и вы можете автоматически реализовать миграцию слотов (можно сказать, очень интимную). Масштабирование также относительно простое: вам нужно только перенести слот инстанса, который должен быть отключен, на другие инстансы, а затем удалить группу.

Недостатки Кодиса

Когда ведущий Redis Group зависает, codis не будет автоматически обновлять ведомый сервер до главного.Codis предоставляет инструмент под названием codis-ha, который предоставляет RESTful API через панель инструментов для автоматического переключения ведущий-ведомый. Однако, когда codis повышает статус ведомого до ведущего, другие ведомые устройства не изменят своего состояния и по-прежнему будут синхронизировать данные со старого ведущего, что приводит к несогласованности данных ведущий-ведомый. Поэтому, когда происходит переключение ведущий-ведомый, администратору необходимо вручную создать новое действие синхронизации, чтобы завершить синхронизацию данных.

Кроме того, Codis также сталкивается с неловкой ситуацией. Поскольку он не «рожден» Redis, когда Redis выпускает новые функции, он всегда будет на шаг позади. Поэтому ему нужно быстро наверстать упущенное после того, как Redis выпустит новые функции. для того, чтобы оставаться конкурентоспособными.

Построить Кодис

  1. Установите среду выполнения Go

Пользователи Mac могутобратитесь к этому, пользователи других систем также могут видеть эторуководство.

После установки убедитесь, что установка прошла успешно

$ go version
go version go1.11.2 darwin/amd64
  1. Скачать исходный код Codis

Необходимо загрузить в указанный каталог: $GOPATH/src/github.com/CodisLabs/codis

$ mkdir -p $GOPATH/src/github.com/CodisLabs
$ cd $_ && git clone https://github.com/CodisLabs/codis.git -b release3.2
  1. Скомпилируйте исходный код

Войдите в каталог исходного кода codis и выполните команду make напрямую. После завершения компиляции структура каталога bin должна быть такой

$ ll bin 
total 178584
drwxr-xr-x  8 jackey  staff   256B 11 13 10:57 assets
-rwxr-xr-x  1 jackey  staff    17M 11 13 10:57 codis-admin
-rwxr-xr-x  1 jackey  staff    18M 11 13 10:56 codis-dashboard
-rw-r--r--  1 jackey  staff     5B 11 21 18:06 codis-dashboard.pid
-rwxr-xr-x  1 jackey  staff    16M 11 13 10:57 codis-fe
-rw-r--r--  1 jackey  staff     5B 11 21 18:24 codis-fe.pid
-rwxr-xr-x  1 jackey  staff    15M 11 13 10:57 codis-ha
-rwxr-xr-x  1 jackey  staff    19M 11 13 10:57 codis-proxy
-rw-r--r--  1 jackey  staff     5B 11 21 18:08 codis-proxy.pid
-rwxr-xr-x  1 jackey  staff   1.1M 11 13 10:56 codis-server
-rwxr-xr-x  1 jackey  staff    98K 11 13 10:56 redis-benchmark
-rwxr-xr-x  1 jackey  staff   161K 11 13 10:56 redis-cli
-rwxr-xr-x  1 jackey  staff   1.1M 11 13 10:56 redis-sentinel
-rw-r--r--  1 jackey  staff   170B 11 13 10:56 version

На данный момент наши приготовления завершены. Далее рассмотрим, как запустить тестовый кластер в автономной среде.

  1. Запустить панель инструментов codis

Войдите в каталог admin и выполните скрипт codis-dashboard-admin.sh.

$ ./codis-dashboard-admin.sh start
/Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/admin/../config/dashboard.toml
starting codis-dashboard ... 

Затем проверьте журнал, чтобы убедиться, что запуск прошел успешно.

$ tail -100 ../log/codis-dashboard.log.2018-11-21
2018/11/21 18:06:57 main.go:155: [WARN] option --pidfile = /Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/bin/codis-dashboard.pid
2018/11/21 18:06:57 topom.go:429: [WARN] admin start service on [::]:18080
2018/11/21 18:06:57 fsclient.go:195: [INFO] fsclient - create /codis3/codis-demo/topom OK
2018/11/21 18:06:58 topom_sentinel.go:169: [WARN] rewatch sentinels = []
2018/11/21 18:06:58 main.go:179: [WARN] [0xc000374120] dashboard is working ...
  1. стартовые коды-прокси

Выполните скрипт codis-proxy-admin.sh

$ ./codis-proxy-admin.sh start                   
/Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/admin/../config/proxy.toml
starting codis-proxy ...

Проверить успешность запуска

$ tail -100 ../log/codis-proxy.log.2018-11-21
2018/11/21 18:08:34 proxy_api.go:44: [WARN] [0xc0003262c0] API call /api/proxy/start/212d13827c84455d487036d4bb07ce15 from 10.1.201.43:58800 []
2018/11/21 18:08:34 proxy_api.go:44: [WARN] [0xc0003262c0] API call /api/proxy/sentinels/212d13827c84455d487036d4bb07ce15 from 10.1.201.43:58800 []
2018/11/21 18:08:34 proxy.go:293: [WARN] [0xc0003262c0] set sentinels = []
2018/11/21 18:08:34 main.go:343: [WARN] rpc online proxy seems OK
2018/11/21 18:08:35 main.go:233: [WARN] [0xc0003262c0] proxy is working ...
  1. запустить codis-сервер

Выполните скрипт codis-server-admin.sh

$ ./codis-server-admin.sh start
/Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/admin/../config/redis.conf
starting codis-server ... 

Проверить успешность запуска

$ tail -100 /tmp/redis_6379.log
12854:M 21 Nov 18:09:29.172 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.11 (de1ad026/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 12854
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

12854:M 21 Nov 18:09:29.187 # Server started, Redis version 3.2.11
12854:M 21 Nov 18:09:29.187 * The server is now ready to accept connections on port 6379

Если сообщается об ошибке, проверьте, есть ли у используемого вами пользователя права на чтение и запись в файл /tmp/redis_6379.log.

Здесь я запустил два экземпляра, чтобы протестировать функцию автоматической перебалансировки Codis. Метод очень прост, просто скопируйте два файла admin/codis-server-admin.sh и config/redis.conf соответственно, измените порт и другую информацию в файле, а затем таким же образом выполните новый скрипт.

  1. начать кодис-фе

Выполните скрипт codis-fe-admin.sh

$ ./codis-fe-admin.sh start

starting codis-fe ... 

Проверить успешность выполнения

$ tail -100 ../log/codis-fe.log.2018-11-21 
2018/11/21 18:24:33 main.go:101: [WARN] set ncpu = 4
2018/11/21 18:24:33 main.go:104: [WARN] set listen = 0.0.0.0:9090
2018/11/21 18:24:33 main.go:120: [WARN] set assets = /Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/bin/assets
2018/11/21 18:24:33 main.go:162: [WARN] set --filesystem = /tmp/codis
2018/11/21 18:24:33 main.go:216: [WARN] option --pidfile = /Users/jackey/Documents/go_workspace/src/github.com/CodisLabs/codis/bin/codis-fe.pid

После того, как все запуски будут успешными, вы можете посетить http://127.0.0.1:9090, чтобы начать настройку кластера.

  1. Добавить группу

Мы только что запустили два сервера codis, поэтому мы можем создать две новые группы, а затем добавить серверы codis в две группы соответственно.

codis-group

  1. Инициализировать слот

В начале все слоты отключены.

codis-slot-init

Нажмите кнопку «Перебалансировать все слоты» ниже, и codis автоматически назначит 1024 слота двум группам (по 512 для каждой).

codis-slot

Конечно, слоты можно назначать и вручную, например, мы назначаем 10 слотов группы-1 группе-2, просто нажимаем кнопку Migrate Some.

codis-slot-manual

резюме

Возможность динамического расширения Codis проста в использовании, но все еще есть некоторые проблемы (мы также представили ее ранее). Таким образом, необходимость использования Codis в вашем кластере зависит от конкретных требований. В конце хотелось бы похвалить команду разработчиков Codis, а еще они разработали распределенную базу данных——TiDB. Заинтересованные студенты могут учиться.