koneksi database docker swarm direset oleh peer

12

Saya menjalankan aplikasi spring boot dengan buruh pelabuhan dan saya menggunakan postgres untuk database. Ketika saya menjalankan keduanya sebagai layanan buruh pelabuhan, koneksi basis data gagal secara konsisten dan acak (seperti yang Anda lihat di stempel waktu) seperti yang dikatakan oleh log:

2017-10-26T 17:14:15 .200415747Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: tidak dapat menerima data dari klien: Koneksi diatur ulang oleh rekan

2017-10-26T 17:43:36 .481718562Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: tidak dapat menerima data dari klien: Koneksi diatur ulang oleh rekan

2017-10-26T 17:43:56 .954152654Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: tidak dapat menerima data dari klien: Koneksi diatur ulang oleh rekan

2017-10-26T 17:44:17 .434171472Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: tidak dapat menerima data dari klien: Koneksi diatur ulang oleh rekan

2017-10-26T 17:49:04 .154174253Z app-db.1.1ayo6h8ro1og@scw-c2964a | LOG: tidak dapat menerima data dari klien: Koneksi diatur ulang oleh rekan

Saya tidak bisa mengerti atau menemukan alasan untuk ini. Saya menghargai ide apa pun.

edit:

kami menyadari bahwa, saat menguji aplikasi, ia juga menampilkan kesalahan seperti ini:

SQLTransientConnectionException: HikariPool-1 - Koneksi tidak tersedia, permintaan habis setelah 937517ms

Terima kasih.

Elifcan Çakmak
sumber

Jawaban:

10

Saya mendapatkan kesalahan yang sama dengan menggunakan tumpukan Docker dari aplikasi Spring Boot dan PostgreSQL. Setelah berjuang dengan ini selama sekitar satu minggu, saya sudah menemukan masalah yang ada di firewall menjatuhkan koneksi antara kontainer karena tidak aktif. Jawaban cepat, jalankan cmd berikut di mesin linux:

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

Selain itu, saya telah menyertakan properti kolam koneksi tomcat berikut:

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

Solusi datang dari blogpost ini: BERHUBUNGAN DENGAN PENGECUALIAN NODENOTAVAILABLE DI ELASTICSEARCH

Aleksandr Kravets
sumber
Saya akan mencoba ini sesegera mungkin. Terima kasih atas bantuan Anda!
Elifcan Çakmak
hai, saya mencoba solusinya dan saya hanya menerapkan bagian pertama. sudah sejak kemarin dan tidak gagal. saya kira itu bekerja :) terima kasih banyak!
Elifcan Çakmak
Kontainer yang menjalankan kernel 4.13 atau lebih baru tidak akan lagi mewarisi tcp_keepalive_timedari host (sumber: success.docker.com/article/ipvs-connection-timeout-issue ), sehingga pendekatan ini tidak lagi berfungsi dengan wadah yang lebih baru. Namun, pada Docker 19.03 ada sysctlopsi yang dapat disediakan untuk layanan (misalnya dalam file penulisan). Ini dapat digunakan untuk mengatur bendera di atas secara langsung dalam wadah tanpa mengacaukan tuan rumah. docs.docker.com/compose/compose-file/#sysctls
avejidah
2

Ada cara lain untuk mencegah penutupan koneksi idle. Masalahnya terkait dengan penemuan layanan swarm standar yang menutup koneksi idle setelah 15 menit.
Secara eksplisit menentukan dnsrr mode titik akhir menyelesaikan masalah, misalnya:

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
xxx konsep
sumber