Redis jest bardzo znanym sklepem typu klucz-wartość, bardzo szybkim i stabilnym. Są jednak sytuacje, w których potrzebujemy aplikacji czasu rzeczywistego i skalujemy naszą aplikację w niektórych momentach dużego ruchu.
Poniżej wklejam mój ostateczny plik docker-compose i wyjaśniam kilka ważnych części. W takim przypadku moja aplikacja jest zbudowana na NodeJS z MariaDb.
version: '3.5'
services:
app:
build:
context: ./
dockerfile: Dockerfile
ports:
- 3000:3000
environment:
REDIS_NODE_1: redis-node-1:6373
REDIS_NODE_2: redis-node-2:6374
REDIS_NODE_3: redis-node-3:6375
REDIS_NODE_4: redis-node-4:6376
REDIS_NODE_5: redis-node-5:6377
REDIS_NODE_6: redis-node-6:6378
volumes:
- '.:/usr/src/app'
- nodemodules:/usr/local/app/node_modules
networks:
app_subnet:
ipv4_address: 172.20.0.10
depends_on:
- db
- redis-cluster
db:
image: mariadb
restart: always
environment:
MYSQL_ROOT_PASSWORD: feedback
MYSQL_DATABASE: feedback
MYSQL_USER: feedback
MYSQL_PASSWORD: feedback
volumes:
- db-data:/var/lib/mysql
ports:
- 3306:3306
networks:
app_subnet:
ipv4_address: 172.20.0.20
redis-cluster:
image: 'redis:6.0-alpine'
command: redis-cli --cluster create 172.20.0.31:6373 172.20.0.32:6374 172.20.0.33:6375 172.20.0.34:6376 172.20.0.35:6377 172.20.0.36:6378 --cluster-replicas 1 --cluster-yes
networks:
app_subnet:
ipv4_address: 172.20.0.30
depends_on:
- redis-node-1
- redis-node-2
- redis-node-3
- redis-node-4
- redis-node-5
- redis-node-6
redis-node-1:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6373:6373'
volumes:
- redis-node-1-data:/var/lib/redis
- ./docker/redis-node-1.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.31
redis-node-2:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6374:6374'
volumes:
- redis-node-2-data:/var/lib/redis
- ./docker/redis-node-2.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.32
redis-node-3:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6375:6375'
volumes:
- redis-node-3-data:/var/lib/redis
- ./docker/redis-node-3.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.33
redis-node-4:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6376:6376'
volumes:
- redis-node-4-data:/var/lib/redis
- ./docker/redis-node-4.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.34
redis-node-5:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6377:6377'
volumes:
- redis-node-5-data:/var/lib/redis
- ./docker/redis-node-5.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.35
redis-node-6:
image: 'redis:6.0-alpine'
command: redis-server /usr/local/etc/redis/redis.conf
ports:
- '6378:6378'
volumes:
- redis-node-6-data:/var/lib/redis
- ./docker/redis-node-6.conf:/usr/local/etc/redis/redis.conf
networks:
app_subnet:
ipv4_address: 172.20.0.36
volumes:
db-data:
redis-node-1-data:
redis-node-2-data:
redis-node-3-data:
redis-node-4-data:
redis-node-5-data:
redis-node-6-data:
nodemodules:
networks:
app_subnet:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/24
Statyczny adres IP jest wymagany, ponieważ klaster redis nie działa z domenami. W takim przypadku muszę utworzyć sieć podsieci dockera, aby wszystkie węzły redis znalazły się w tej samej sieci
Ponadto muszę ustawić port dla każdego węzła redis, aby uniknąć kolizji portów w sieci dockera.
Co więcej, ten sam port określony w portsargumencie docker-compose musi być tym samym portem określonym w redis.confpliku
Rzućmy okiem na redis.confplik
port 6373
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
Jedyną różnicą między wszystkimi redis.confplikami jest numer portu. Zwróć uwagę, aby numer portu był taki sam w redis.confpliku wewnętrznym i portsargumentach wdocker-compose.yml
Udostępnia dane całemu klastrowi i aplikacji, gdy kontenery zaczynają się od nowa
Kiedy wszystkie węzły redis działają, muszę połączyć je w klaster. Aby to osiągnąć, tworzę redis-clusterusługę do uruchamiania redis-cli clusterpolecenia.
Pamiętaj, jak powiedziałem wcześniej, redis-cli clusterdziała tylko ze statycznym IP, więc kiedy muszę zwracać uwagę na wartości IP i portów.
Celem usługi jest wyłącznie uruchomienie klastra redis-cli. Nie ma problemu, że usługa umiera po zakończeniu polecenia has
Mój artykuł koncentruje się na klastrze Redis, więc nie wyjaśniam nic na temat usług NodeJs i Mariadb.
Możesz jednak poprosić mnie o informacje na ten temat. Z przyjemnością Ci pomożemy :)
Bibliografia:
Dzisiaj kontynuuję serię pytań do wywiadów w Node JS. Ta seria będzie oparta na 5 częściach obejmujących ważne pytania zadawane podczas wywiadów od podstawowego do zaawansowanego przed rozpoczęciem.
W tym artykule postaramy się zadokować prostą aplikację golang CRUD z bazą danych PostgreSQL. Najpierw stwórzmy naszą aplikację.
Autor: Alyson Lee, doradca zarządzający ds. spraw rządowych Coroczny proces przyznawania środków przez rząd federalny ma kluczowe znaczenie dla naszych wysiłków na rzecz sfinansowania usuwania dwutlenku węgla (CDR). Każdego roku Carbon180 przesyła prośby do różnych biur kongresowych, aby pomóc wskazać, gdzie będą płynąć dolary w przyszłym roku.
[Ostrzeżenie: ten esej zawiera zrzuty ekranowe ludzi wychwalających mordercę Jordana Neely'ego.] Funkcjonariusze organów ścigania w końcu - i być może niechętnie - oskarżyli Daniela Penny'ego, człowieka, który dusił Jordana Neely'ego aż do śmierci, o to zabójstwo.
Hej, cyberentuzjaści! Witamy ponownie w serii OSINT poświęconej polowaniu na zagrożenia. W pierwszym artykule przedstawiłem przegląd OSINT i jego znaczenie w polowaniu na zagrożenia.
W dzisiejszym dynamicznym i konkurencyjnym świecie kariera odgrywa znaczącą rolę w rozwoju osobistym, stabilności finansowej i ogólnej satysfakcji z życia. Jednak wiele osób wpada w nieustający cykl stagnacji i niezadowolenia, stopniowo marnując swoje życie zawodowe.