У меня есть приложение весенней загрузки с базой данных MYSQL, и я кэширую данные в Redis на уровне сервера с помощью аннотации @Cacheable
@Cacheable(value= "employeeCache", key= "#customerId")
@Override
public Customer getEmployee(String customerId) {
Optional cust = customerRepository.findById(Long.parseLong(customerId));
if(cust.isPresent()) {
return cust.get();
}
return null;
}
Я использую 1 главный, 2 подчиненных и 2 дозорных узла, я развернул приложение в Docker-контейнерах, в экземпляре AWS ec2 ubuntu.
Приложение и настройка Redis Master/Slave работают нормально.
Когда главный контейнер Redis выходит из строя, один из подчиненных устройств становится главным, что также работает нормально
Но как только один из подчиненных устройств становится главным, Spring boot не может подключиться к Redis, у меня истекает время соединения, это работает, только если я перезапускаю контейнер.
Пожалуйста, проверьте, нет ли ошибок в конфигурации.
Журналы Java
2020-05-21 18:04:50.016 ERROR 1 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 minute(s)] with root cause
io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 minute(s)
at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) ~[lettuce-core-5.3.0.RELEASE.jar!/:5.3.0.RELEASE]
at io.lettuce.core.protocol.CommandExpiryWriter.lambda$potentiallyExpire$0(CommandExpiryWriter.java:167) ~[lettuce-core-5.3.0.RELEASE.jar!/:5.3.0.RELEASE]
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
Файлы загрузки Spring
application.yaml
spring:
datasource:
url: jdbc:mysql://docker-mysql:3306/customerdb
username: root
password: root
jpa:
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
cache:
type: redis
redis:
sentinel:
master: mymaster
nodes:
- redis-sentinel:26379
- redis-sentinel-1:26380
management:
endpoints:
web:
exposure:
include:
- "*"
server:
port: 8080
logging:
file:
name: customer.log
path: ../logs
Файлы для развертывания Redis и Spring Boot
Docker-compose.yaml
version: '3.5'
services:
redis-master:
container_name: redis-master
image: redis
volumes:
- "./data/redis-master:/data"
networks:
- backend
redis-slave:
container_name: redis-slave
image: redis
command: redis-server --slaveof redis-master 6379
volumes:
- "./data/redis-slave:/data"
depends_on:
- redis-master
networks:
- backend
redis-slave-1:
container_name: redis-slave-1
image: redis
command: redis-server --slaveof redis-master 6379
volumes:
- "./data/redis-slave:/data"
depends_on:
- redis-master
networks:
- backend
redis-sentinel:
container_name: redis-sentinel
ports:
- "26379:26379"
build: redis-sentinel
depends_on:
- redis-master
- redis-slave
networks:
- backend
redis-sentinel-1:
container_name: redis-sentinel-1
build: redis-sentinel
ports:
- "26380:26379"
depends_on:
- redis-master
- redis-slave
networks:
- backend
docker-mysql:
restart: always
container_name: docker-mysql
image: mysql:5.7
environment:
MYSQL_DATABASE: customerdb
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: "%"
volumes:
- db-data-new:/var/lib/mysql
ports:
- "3306:3306"
networks:
- backend
customer-app:
container_name: java-sentinel
restart: on-failure
image: kuldeep99/customer-sentinel:v10
expose:
- "8080"
volumes:
- /tmp:/logs
ports:
- 8080:8080
depends_on:
- docker-mysql
- redis-master
- redis-slave
- redis-sentinel
networks:
- backend
volumes:
db-data-new:
networks:
backend:
Dockerfile
FROM redis
EXPOSE 26379
ENV SENTINEL_QUORUM 2
ENV SENTINEL_DOWN_AFTER 3000
ENV SENTINEL_FAILOVER 3000
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
ADD sentinel-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
ENTRYPOINT ["sentinel-entrypoint.sh"]
sentinel-entrypoint.sh
#!/bin/sh
sed -i "s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /etc/redis/sentinel.conf
redis-server /etc/redis/sentinel.conf --sentinel
sentinel.conf
port 26379
protected-mode no
dir /tmp
sentinel monitor mymaster redis-master 6379 $SENTINEL_QUORUM
sentinel down-after-milliseconds mymaster $SENTINEL_DOWN_AFTER
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster $SENTINEL_FAILOVER
Подробнее здесь: https://stackoverflow.com/questions/619 ... tion-issue
Проблема с подключением Spring Data Redis Lettuce ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1770854665
Anonymous
У меня есть приложение весенней загрузки с базой данных MYSQL, и я кэширую данные в Redis на уровне сервера с помощью аннотации @Cacheable
@Cacheable(value= "employeeCache", key= "#customerId")
@Override
public Customer getEmployee(String customerId) {
Optional cust = customerRepository.findById(Long.parseLong(customerId));
if(cust.isPresent()) {
return cust.get();
}
return null;
}
Я использую 1 главный, 2 подчиненных и 2 дозорных узла, я развернул приложение в Docker-контейнерах, в экземпляре AWS ec2 ubuntu.
Приложение и настройка Redis Master/Slave работают нормально.
Когда главный контейнер Redis выходит из строя, один из подчиненных устройств становится главным, что также работает нормально
Но как только один из подчиненных устройств становится главным, Spring boot не может подключиться к Redis, у меня истекает время соединения, это работает, только если я перезапускаю контейнер.
Пожалуйста, проверьте, нет ли ошибок в конфигурации.
[b]Журналы Java[/b]
2020-05-21 18:04:50.016 ERROR 1 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.QueryTimeoutException: Redis command timed out; nested exception is io.lettuce.core.RedisCommandTimeoutException: io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 minute(s)] with root cause
io.lettuce.core.RedisCommandTimeoutException: Command timed out after 1 minute(s)
at io.lettuce.core.ExceptionFactory.createTimeoutException(ExceptionFactory.java:51) ~[lettuce-core-5.3.0.RELEASE.jar!/:5.3.0.RELEASE]
at io.lettuce.core.protocol.CommandExpiryWriter.lambda$potentiallyExpire$0(CommandExpiryWriter.java:167) ~[lettuce-core-5.3.0.RELEASE.jar!/:5.3.0.RELEASE]
at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:170) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.DefaultEventExecutor.run(DefaultEventExecutor.java:66) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:989) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-common-4.1.49.Final.jar!/:4.1.49.Final]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_111]
[b]Файлы загрузки Spring[/b]
application.yaml
spring:
datasource:
url: jdbc:mysql://docker-mysql:3306/customerdb
username: root
password: root
jpa:
show-sql: true
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
cache:
type: redis
redis:
sentinel:
master: mymaster
nodes:
- redis-sentinel:26379
- redis-sentinel-1:26380
management:
endpoints:
web:
exposure:
include:
- "*"
server:
port: 8080
logging:
file:
name: customer.log
path: ../logs
[b]Файлы для развертывания Redis и Spring Boot[/b]
Docker-compose.yaml
version: '3.5'
services:
redis-master:
container_name: redis-master
image: redis
volumes:
- "./data/redis-master:/data"
networks:
- backend
redis-slave:
container_name: redis-slave
image: redis
command: redis-server --slaveof redis-master 6379
volumes:
- "./data/redis-slave:/data"
depends_on:
- redis-master
networks:
- backend
redis-slave-1:
container_name: redis-slave-1
image: redis
command: redis-server --slaveof redis-master 6379
volumes:
- "./data/redis-slave:/data"
depends_on:
- redis-master
networks:
- backend
redis-sentinel:
container_name: redis-sentinel
ports:
- "26379:26379"
build: redis-sentinel
depends_on:
- redis-master
- redis-slave
networks:
- backend
redis-sentinel-1:
container_name: redis-sentinel-1
build: redis-sentinel
ports:
- "26380:26379"
depends_on:
- redis-master
- redis-slave
networks:
- backend
docker-mysql:
restart: always
container_name: docker-mysql
image: mysql:5.7
environment:
MYSQL_DATABASE: customerdb
MYSQL_ROOT_PASSWORD: root
MYSQL_ROOT_HOST: "%"
volumes:
- db-data-new:/var/lib/mysql
ports:
- "3306:3306"
networks:
- backend
customer-app:
container_name: java-sentinel
restart: on-failure
image: kuldeep99/customer-sentinel:v10
expose:
- "8080"
volumes:
- /tmp:/logs
ports:
- 8080:8080
depends_on:
- docker-mysql
- redis-master
- redis-slave
- redis-sentinel
networks:
- backend
volumes:
db-data-new:
networks:
backend:
Dockerfile
FROM redis
EXPOSE 26379
ENV SENTINEL_QUORUM 2
ENV SENTINEL_DOWN_AFTER 3000
ENV SENTINEL_FAILOVER 3000
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
ADD sentinel-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
ENTRYPOINT ["sentinel-entrypoint.sh"]
sentinel-entrypoint.sh
#!/bin/sh
sed -i "s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /etc/redis/sentinel.conf
sed -i "s/\$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /etc/redis/sentinel.conf
redis-server /etc/redis/sentinel.conf --sentinel
sentinel.conf
port 26379
protected-mode no
dir /tmp
sentinel monitor mymaster redis-master 6379 $SENTINEL_QUORUM
sentinel down-after-milliseconds mymaster $SENTINEL_DOWN_AFTER
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster $SENTINEL_FAILOVER
Подробнее здесь: [url]https://stackoverflow.com/questions/61941396/spring-data-redis-lettuce-connection-issue[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия