Gazelle — это высокопроизводительная протокольная стековая система в режиме пользователя. Она непосредственно читает и записывает пакеты сетевой карты в режиме пользователя, используя DPDK, передает пакеты за счет совместного использования огромной страницы памяти и использует легковесный стек протокола LwIP. Производительность сети I/O приложений значительно повышается. Основное внимание уделяется ускорению производительности баз данных в сети, таких как MySQL и Redis.
# Ядра Linux
redis-benchmark -h 192.168.1.127 -p 6379 -c 1000 -n 10000000 -r 10000000 -t set,get --threads 12
# set
Подведение итогов:
сводка производительности: 132402.98 запросов в секунду
сводка задержки (мс):
среднее минимальное p50 p95 p99 максимальное
7.474 1.376 7.207 9.399 14.255 30.879
# get
Подведение итогов:
сводка производительности: 142834.69 запросов в секунду
сводка задержки (мс):
среднее минимальное p50 p95 p99 максимальное
6.919 1.384 6.663 8.751 13.311 24.207
# Gazelle
redis-benchmark -h 192.168.1.127 -p 6379 -c 1000 -n 10000000 -r 10000000 -t set,get --threads 12
# set
Подведение итогов:
сводка производительности: 359389.03 запросов в секунду
сводка задержки (мс):
среднее минимальное p50 p95 p99 максимальное
2.736 0.240 2.735 2.895 3.127 9.471
# get
Подведение итогов:
``` Сводка производительности: 359401. 97 запросов в секунду
Сводка задержки (мс):
Среднее Минимальное P50 P95 P99 Максимальное
2. 752 0. 488 2. 751 2. 903 3. 135 16. 671
Отдельное тестирование: требуется один сервер и один клиент. <br>
Первичное/вторичное тестирование: минимум два сервера (основной сервер и резервный сервер) и один клиент. <br>
Режим Sentinel: минимум два сервера Redis (основной и резервный), два сервера Sentinel и один клиент. <br>
Режим Clustering: минимум шесть серверов Redis (три основных сервера и три резервных сервера) и один клиент. <br>
[Пакет программного обеспечения Redis](https://download. redis. io/releases/). Используется версия Redis 6. 2. 9 для тестирования.
# Отключение брандмауэра.
systemctl stop iptables
systemctl stop firewalld
tar zxvf redis-6. 2. 9.tar.gz
cd redis-6. 2. 9/
make clean
make -j 32
make install
yum -y install gazelle dpdk libconfig numactl libboundscheck libcap
``` - Изменение следующих параметров в файле конфигурации `/etc/gazelle/lstack.conf`. Сохраните значения по умолчанию для остальных параметров.
| Настройка | Значение | Описание |
| -------------------- | --------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| dpdk_args | ["--socket-mem", "2400,0,0,0", "--huge-dir", "/mnt/hugepages-lstack", "--proc-type", "primary"] | Конфигурирует NUMA, где расположены процессор и сетевой адаптер, чтобы использовать 2400 МБ памяти (которую можно уменьшить в зависимости от количества одновременно выполняемых задач). Если процессор и сетевой адаптер находятся не в одной NUMA, память должна быть настроена для каждой NUMA. Если используется сетевой адаптер MLX, необходимо настроить параметр "-d", "librte_net_mlx5.so". |
| num_cpus | "2" | Выберите процессор и привяжите его к lstack. |```markdown
|| mbuf_count_per_conn | 34 | Количество необходимых mbufs для каждого соединения |
| tcp_conn_count | 20000 | Максимальное количество одновременных соединений Redis |
``````sh
# Allocation of huge pages
mkdir -p /mnt/hugepages-lstack
chmod -R 700 /mnt/hugepages-lstack
mount -t hugetlbfs nodev /mnt/hugepages-lstack -o pagesize=2M # This operation cannot be repeated. Otherwise, the huge page will be occupied and cannot be freed.
echo 2048 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages # Select the size of the page based on site requirements.
cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/free_hugepages # Request available memory for hugepage on the corresponding node.
# Load the .ko file. (Skip this step if the NIC is an MLX NIC.)
modprobe vfio enable_unsafe_noiommu_mode=1
modprobe vfio-pci
# Bind network adapter to user mode. (Skip this step for MLX network adapters.)
ip link set enp4s0 down
dpdk-devbind -b vfio-pci enp4s0
# Gazelle is already installed, and the application should be deployed.
# Отключение режима защиты
protected-mode no
# Gazelle не поддерживает этот параметр для фонового выполнения.
daemonize no
# Настройка AOF устойчивости. Этот параметр является необязательным в односвязной системе Redis.
appendonly yes
Тест системы Redis с одним узлом включает сервер. После развертывания Gazelle и Redis сервис Gazelle+Redis можно запустить непосредственно.
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server /root/redis-6.2.9/redis.conf
Репликация основной/вторичной узлами указывает на то, что данные на сервере Redis реплицируются на другие серверы Redis. Первый называется главным узлом, а второй — вторичным узлом. Репликация данных односторонняя, и данные могут передаваться только от главного узла к вторичному узлу. Режим основной/вторичной узлами включает как минимум два сервера. Методы конфигурации следующие:- режим1<br>
Добавьте следующую конфигурацию в файл конфигурации redis.conf
на узле и запустите основной/вторичный узел Redis:
# 192.168.1.127 6379 — это адрес IP и номер порта основного узла.
slaveof 192.168.1.127 6379
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server /root/redis-6.2.9/redis.conf
<br>
После изменения общего конфигурационного файла основного/вторичного узла запустите основной/вторичный узел Redis. (На данный момент отношение основной/вторичной ещё не установлено.) Выполните следующую команду на клиенте:redis-cli -h 192.168.1.127 slaveof NO ONE # основной узел
redis-cli -h 192.168.1.128 slaveof 192.168.1.127 6379 # вторичный узел
<br>
[root@openEuler redis-6.2.9]# redis-cli -h 192.168.1.127 info Replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.1.128,port=6379,state=online,offset=780,lag=0
...
[root@openEuler redis-6.2.9]# redis-cli -h 192.168.1.128 info Replication
# Replication
role:slave
master_host:192.168.1.127
master_port:6379
master_link_status:up
...
Для решения проблемы основной/вторичной репликации используется механизм сентинела. Для тестирования режима работы сентинела требуется как минимум два сервера Redis и два сервера сентинела.
protected-mode no # Отключение режима защиты
daemonize yes # Запуск в фоновом режиме. Логи записываются в файл логов.
logfile "/var/log/sentinel.log" # Указание пути для хранения логов
sentinel monitor mymaster 192.168.1.127 6379 1 # Название узла-мастера — mymaster, который мониторит IP-адрес и порт узла-мастера. Необходимо наличие хотя бы одного узла сентинела для определения отказа узла-мастера и выполнения переключения.
sentinel down-after-milliseconds mymaster 30000 # Интервал для определения, что порт сервера вышел из строя. По умолчанию значение составляет 30000 мс (30 секунд). Другие порты не поддерживаются.
sentinel failover-timeout mymaster 50000 # Максимальное время ожидания для узла, находящегося в состоянии отказа, составляет 50000.
[root@openEuler redis-6.2.9]#redis-sentinel sentinel.conf
[root@openEuler redis-6.2.9]#ps -ef | grep redis-sentinel
root 5961 1 0 13:36 ? 00:00:00 redis-sentinel *:26379 [sentinel]
[root@openEuler redis-6.2.9]#redis-cli -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.1.127:6379,slaves=2,sentinels=3
```Примечания:
a. Сервер Redis и сервер sentinel не могут располагаться на одном узле. В противном случае переключение между активным и резервным серверами Redis будет невозможным.
b. Redis Sentinel не поддерживает запуск в режиме пользователя.
##### 2.3.4 Развертывание кластера Redis
Параллельная способность Redis на одном узле ограничена. Чтобы повысить параллельную способность Redis, необходимо создать кластер основной/вторичной, который обеспечивает сбор данных среди нескольких узлов Redis. Для тестирования кластера Redis требуется как минимум шесть серверов Redis.
- Установите Redis на шесть серверов Redis и отредактируйте конфигурационный файл `redis.conf`.
```sh
protected-mode no # Отключение режима защиты
daemonize yes # Работа в фоновом режиме
bind 0.0.0.0
port 6379 # Redis разворачивается на различных ВМ с различными IP-адресами. Можно использовать стандартный номер порта.
appendonly yes # Включение устойчивости AOF
cluster-enabled yes # Включение режима кластера.
cluster-config-file nodes.conf # Имя файла конфигурации в режиме кластера, который автоматически поддерживается кластером и не требует создания вручную.
cluster-node-timeout 5000 # Интервал времени ожидания пульса между узлами в кластере.
``````sh
LD_PRELOAD=/usr/lib64/liblstack.so GAZELLE_BIND_PROCNAME=redis-server redis-server /root/redis-6.2.9/redis.conf
[root@openEuler redis-6.2.9]# redis-cli --cluster create --cluster-replicas 1 192.168.1.127:6379 192.168.1.128:6379 192.168.1.129:6379 192.168.1.130:6379 192.168.1.131:6379 192.168.1.132:6379
>>> Распределение хэш-слотов среди 6 узлов выполняется...
... ...
Можно ли установить указанную конфигурацию? (введите 'да', чтобы принять): да
>>> Конфигурация узлов обновлена
>>> Присвоение различных эпох конфигураций каждому узлу
>>> Отправка сообщений CLUSTER MEET для присоединения кластера
Ожидание присоединения кластера
... ...
>>> Выполнение проверки кластера (используется узел 192.168.1.127:6379)
... ... ... ...
[OK] Все узлы согласны относительно распределения слотов.
>>> Проверка открытых слотов...
>>> Проверка охвата слотов...
[OK] Все 16384 слота охвачены. # Хэш-слоты. Если все слоты распределены, кластер успешно создан.
# redis-cli --cluster: указывает команду операции кластера. create: указывает создание кластера. --cluster-replicas 1: указывает количество реплик каждого мастера в кластере.
# Общее число узлов / (реплики + 1) = Число мастерских узлов. Поэтому первые n узлов в списке узлов являются мастерскими узлами. Другие узлы являются рабочими узлами и случайным образом распределяются между различными мастерскими узлами.
```- Запрос информации кластера `<br>`
Любой сервер, работающий правильно в кластере, может использоваться как точка входа.
```sh
# Просмотр информации о состоянии кластера
[root@openEuler redis-6.2.9]# redis-cli -h 192.168.1.127 cluster info
cluster_state:ok # Если состояние равно fail, проверьте, были ли слоты хэша распределены неправильно.
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
. . . . . .
```sh
# Проверка отношения основного/вторичного в кластере.
[root@openEuler redis-6.2.9]# redis-cli -h 192.168.1.128 cluster nodes
514b35aaa5035d489b60a0e8f8fb01d1c20734ce 192.168.1.129:6379@16379 slave 50aa44a1e4a6a0c75cf2f9b20055bfaa77d1b163 0 1724919619916 1 connected
50aa44a1e4a6a0c75cf2f9b20055bfaa77d1b163 192.168.1.127:6379@16379 master - 0 1724919617960 1 connected 0-5460
a94402ca747ead08e4b93ff975dfbe995068ecbf 192.168.1.130:6379@16379 slave 0a569e1ac4e373a22abcbf6ce6b8118fba3d4d6e 0 1724919618000 3 connected
8c4040a4fa8456044acad2518dc45b8236ba44c4 192.168.1.128:6379@16379 myself,slave 44a96161651c8383fb4966c6dde45d400fe2a203 0 1724919617000 2 connected
0a569e1ac4e373a22abcbf6ce6b8118fba3d4d6e 192.168.1.132:6379@16379 master - 0 1724919618975 3 connected 10923-16383
44a96161651c8383fb4966c6dde45d400fe2a203 192.168.1.131:6379@16379 master - 0 1724919619617 2 connected 5461-10922
# Узлы 127, 131 и 132 являются мастерами, а узлы 128, 129 и 130 — вторичными. Вы можете найти соответствующих мастеров по ID узлов вторичных.
# Одиночный сервер, режим основной/вторичной, режим Sentinel
# set,get
redis-benchmark -h 192.168.1.127 -p 6379 -c 1000 -n 10000000 -d 3 -r 10000000 -t set,get --threads 12
# -h: Указывает адрес сервера Redis. -p: Указывает порт сервера Redis. -c: Указывает количество одновременных соединений с клиентом. -n: Указывает общее число запросов. -t: Указывает команду тестирования. -d: Указывает размер данных пакета.
# В режимах <S0> <M0> <S1> основной/вторичной <S2> и Sentinel конфигурация команды slave-read-only по умолчанию установлена в "yes". Поэтому можно выполнить только команду get на базе данных вторичного узла Redis.
# Режим кластера
# set,get
redis-benchmark -h 192.168.1.127 -p 6379 -c 1000 -n 10000000 -d 3 -r 10000000 -t set,get --threads 12 --cluster
# -h: Указывает любой доступный узел в кластере.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )