Hết thời gian chờ / Giữ máy khách của Linux Linux


7

Có cách nào để thiết lập một trình giữ trong máy khách MySQL dòng lệnh trên Linux không?

Mạng của chúng tôi gần đây đã chuyển sang thiết lập Vlan và bộ phận hệ thống của chúng tôi không còn kiểm soát tường lửa nữa. Các quyền hạn được quyết định đặt quy tắc trong tường lửa của họ để hủy tất cả các kết nối sau 30 phút nếu không có dữ liệu nào đi qua (điều gì đó về việc phải theo dõi các kết nối và tài nguyên bị giới hạn). Tôi không có quyền kiểm soát này.

Là một quản trị viên và lập trình viên máy chủ, vấn đề của tôi là điều này có nghĩa là tôi không thể có một máy khách dòng lệnh mysql chạy trong nền trong khi tôi lập trình. Nếu tôi không gửi truy vấn (hoặc nếu không gửi dữ liệu), khi tôi thử 35 phút sau, khách hàng phát hiện ra nó không còn kết nối. Tôi phải kết nối lại mỗi lần.

Trong SSH, tôi có thể thiết lập chế độ giữ để tôi có thể giữ kết nối mở suốt cả ngày. Có một tùy chọn cấu hình tương tự cho máy khách dòng lệnh mysql không? Tôi gặp khó khăn khi tìm kiếm bất cứ điều gì, bởi vì "Mysql Keepalive" và các tìm kiếm tương tự đều trả về kết quả cho kết nối phụ trợ trong ngôn ngữ lập trình.

Câu trả lời:


4

Bạn có thể thiết lập các thủ tục TCP chung, tôi nghĩ rằng có một cài đặt kernel cho điều đó. Nhưng chúng thường ít thường xuyên hơn (giờ). Có một TCP Keepalive HOWTO dường như có chi tiết.

Ngoài ra, tại sao không chỉ đường hầm kết nối MySQL qua SSH, sau đó bạn có thể sử dụng các thủ tục SSH?

$ ssh -L1234:127.0.0.1:3306 -o ServerAliveInterval=300 user@mysql-server
... (in another terminal)
$ mysql -u user -p -h 127.0.0.1 -P 1234

Tùy chọn thứ ba sẽ là thiết lập một đường hầm (ví dụ: OpenVPN) đến máy chủ của bạn và sau đó sẽ xử lý việc giữ lại (và kết nối lại trong suốt, v.v.).

PS: Đối số "tài nguyên quý giá" của chúng tôi để hết hạn kết nối TCP được thiết lập sau 30 phút là BS. Thật không may, tôi đã ở trong đôi giày của họ trước khi một số thiết bị cũng là BS. Ví dụ: BCP 142 / RFC 5382 cho thời gian tối thiểu là 2 giờ 4 phút (và chỉ khi tường lửa không thể xác định liệu máy chủ có còn hoạt động không).


Tôi cũng đã nghĩ đến việc sử dụng SSH đường hầm và tôi đã lên kế hoạch sử dụng nó. Nó yêu cầu tôi phải có người dùng trên máy chủ (tôi cũng vậy, nhưng không phải lúc nào cũng như vậy). Và tôi nghĩ rằng nó giới hạn bạn trong một kết nối sql (trừ khi bạn chuyển tiếp nhiều cổng và chỉ định chúng trong lệnh mysql).
Stephen Schrauger

Tôi thực sự thích ý tưởng thay đổi bộ giữ TCP trong kernel của tôi. Bạn có biết nơi tôi có thể đặt nó? Điều này sẽ giải quyết vấn đề giữ cho bất kỳ dịch vụ nào khác mà tôi sử dụng.
Stephen Schrauger

@dymutaos không, bạn có thể chuyển tiếp nhiều kết nối qua cùng một kết nối ssh. Chỉ cần chạy một máy khách mysql khác, kết nối với cùng một cổng. Và bạn không cần một tài khoản trên máy chủ MySQL, chỉ cần một tài khoản bên ngoài tường lửa của bạn. Tôi sẽ phải tìm cách thiết lập TCP keepalive.
derobert

1
@dymutaos đã thêm liên kết đến một hướng dẫn giải thích cách thiết lập thủ tục. Nó hơi cũ, vì vậy tên của các tệp / Proc có thể đã thay đổi một chút ...
derobert

3

Máy khách MySQL CLI mặc định có kết nối tự động, nếu mất kết nối trong một phiên. Tài liệu: Mẹo MySQL & Kiểm soát hành vi kết nối lại tự động .

Các giải pháp thực sự sẽ là làm việc với các cường quốc, và tìm ra một giải pháp hiệu quả cho các thành viên nhóm phát triển.

Đương nhiên sẽ mất một thời gian, vì vậy một giải pháp tạm thời có thể cần phải được chế tạo. Tôi khuyên bạn nên tắt tự động kết nối ( --skip-reconnect) của MySQL và tạo một tập lệnh bash đơn giản để xử lý kết nối lại. Không phải là một ý tưởng tốt, nhưng có thể giúp đỡ.

#!/bin/bash

PROGRAM="/path/to/mysql"
ARGS="--skip-reconnect"

while [ 1 ]; do
 $PROGRAM $ARGS
 sleep 1
 echo -n "Lost Connection... Reconnect[Y]"
 read USER_INPUT
 case x$USER_INPUT in
  x)
   echo "Reconnecting..."
   ;;
  x[yY])
   echo "Reconnecting..."
   ;;
  *)
   echo "Stopping..."
   break
   ;;
 esac
done

3

Bạn có thể sử dụng libkeepalive để tải trước một cuộc gọi libkeepalive.sosẽ chặn socket()các cuộc gọi và tự động gọi setsockopt()với các cài đặt giữ lại ưa thích của bạn trên ổ cắm trước khi trả lại.

Cái này không yêu cầu bạn biên dịch lại ứng dụng (trong trường hợp này là MySQL), nó hoàn toàn minh bạch.

Đồng thời xem TCP Keepalive HOWTO .

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.