docker swarm kết nối cơ sở dữ liệu thiết lập lại bởi ngang hàng


12

Tôi đang chạy một ứng dụng khởi động mùa xuân với docker swarm và tôi sử dụng postgres cho cơ sở dữ liệu. Khi tôi chạy cả hai dưới dạng dịch vụ docker, kết nối cơ sở dữ liệu bị lỗi một cách nhất quán và ngẫu nhiên (như bạn có thể thấy trên dấu thời gian) như nhật ký cho biết:

2017-10-26T 17:14:15 .200415747Z ứng dụng-db.1.1ayo6h8ro1og@scw-c2964a | LOG: không thể nhận dữ liệu từ máy khách: Thiết lập lại kết nối theo ngang hàng

2017-10-26T 17:43:36 .481718562Z ứng dụng-db.1.1ayo6h8ro1og@scw-c2964a | LOG: không thể nhận dữ liệu từ máy khách: Thiết lập lại kết nối theo ngang hàng

2017-10-26T 17:43:56 .954152654Z ứng dụng-db.1.1ayo6h8ro1og@scw-c2964a | LOG: không thể nhận dữ liệu từ máy khách: Thiết lập lại kết nối theo ngang hàng

2017-10-26T 17:44:17 .434171472Z ứng dụng-db.1.1ayo6h8ro1og@scw-c2964a | LOG: không thể nhận dữ liệu từ máy khách: Thiết lập lại kết nối theo ngang hàng

2017-10-26T 17:49:04 .154174253Z ứng dụng-db.1.1ayo6h8ro1og@scw-c2964a | LOG: không thể nhận dữ liệu từ máy khách: Thiết lập lại kết nối theo ngang hàng

Tôi không thể hiểu hoặc khám phá lý do cho việc này. Tôi đánh giá cao bất kỳ ý tưởng.

biên tập:

chúng tôi nhận ra rằng, khi kiểm tra ứng dụng, nó cũng đưa ra lỗi như thế này:

SQLTransientConnectionException: HikariPool-1 - Kết nối không khả dụng, yêu cầu hết thời gian sau 937517ms

Cảm ơn.

Câu trả lời:


10

Tôi đã gặp lỗi tương tự khi triển khai ngăn xếp Docker Swarm của ứng dụng Spring Boot và PostgreSQL. Sau khi chiến đấu với điều này trong khoảng một tuần, tôi đã phát hiện ra rằng vấn đề là do tường lửa làm mất kết nối giữa các container vì không hoạt động. Trả lời nhanh, chạy cmd sau trên máy linux:

sudo sysctl -w \
net.ipv4.tcp_keepalive_time=600 \
net.ipv4.tcp_keepalive_intvl=60 \
net.ipv4.tcp_keepalive_probes=3

Đồng thời, tôi đã bao gồm các thuộc tính nhóm kết nối tomcat sau:

tomcat:
  max-active: 10
  initial-size: 5
  max-idle: 8
  min-idle: 5
  test-on-borrow: true
  test-while-idle: true
  test-on-return: false
  test-on-connect: true
  validation-query: SELECT 1
  validation-interval: 30000
  max-wait: 30000
  min-evictable-idle-time-millis: 60000
  time-between-eviction-runs-millis: 5000
  remove-abandoned: true
  remove-abandoned-timeout: 60

Giải pháp xuất phát từ blogpost này: GIẢI QUYẾT VỚI NGOẠI TRỪ NODENOTAVAILABLE TRONG ELASTICSEARCH


Tôi sẽ thử điều này càng sớm càng tốt. Cảm ơn sự giúp đỡ của bạn!
Elifcan Çakmak

xin chào, tôi đã thử giải pháp và tôi chỉ áp dụng phần đầu tiên. nó đã tăng từ hôm qua và không thất bại. tôi đoán nó hoạt động :) cảm ơn rất nhiều!
Elifcan Çakmak

Các container chạy kernel 4.13 trở lên sẽ không còn kế thừa tcp_keepalive_timetừ máy chủ (nguồn: thành công.docker.com / article / ipvs -connection-timeout- phát hành ), vì vậy phương pháp này sẽ không còn hoạt động với các container mới hơn. Tuy nhiên, kể từ Docker 19.03, có một sysctltùy chọn có thể được cung cấp cho các dịch vụ (ví dụ: trong tệp soạn thảo). Điều này có thể được sử dụng để đặt các cờ trên trực tiếp trong các thùng chứa mà không gây rối với máy chủ. docs.docker.com/compose/compose-file/#sysctls
avejidah

2

Có một cách khác để ngăn chặn kết nối nhàn rỗi. Vấn đề liên quan đến phát hiện dịch vụ swarm mặc định sẽ đóng kết nối nhàn rỗi sau 15 phút.
Rõ ràng đã chỉ định dnsrr chế độ điểm cuối giải quyết vấn đề, ví dụ:

version: '3.3'

services:
  foo-service:
    image: example/foo-service:latest
    hostname: foo-service
    networks:
      - foo_network
    deploy:
      endpoint_mode: dnsrr
      # ...

networks:
  foo_network:
    external: true
    driver: overlay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.