Phiên Oracle bị rớt qua VPN? Kiểm tra các lớp keepalive
Công việc cơ sở dữ liệu lặng lẽ có thể sống lâu hơn một luồng mạng không hoạt động. Hãy đi qua công tắc socket, các giá trị mặc định của hạt nhân và thiết lập Oracle Net theo đúng thứ tự.
Hai mươi lăm phút làm việc hữu ích trên cơ sở dữ liệu gần như không tạo ra đầu ra nào, và từ mọi thiết bị trên đường đi luồng đó trông như không hoạt động. Chính trạng thái không hoạt động là thứ được thu gom. Báo cáo về sau luôn có cùng một dạng: truy vấn đang chạy, rồi phiên biến mất, và kết quả không bao giờ đến.
Bốn kiểm tra quyết định một phiên yên tĩnh có sống sót hay không, và chúng đi từ socket ra ngoài. Hãy làm theo thứ tự, vì mỗi kiểm tra giả định lớp trước đang làm tốt việc của nó.
Luồng nào trở nên yên tĩnh
Kết nối quan trọng là kết nối chở lưu lượng cơ sở dữ liệu, được nhận diện bằng địa chỉ và cổng của chính nó. Không có gì khác làm mới nó. Ping tới cổng vào, kết nối SQL thứ hai từ cùng máy chủ và nhịp tim của chính đường hầm là những luồng riêng biệt với trạng thái riêng trên mỗi thiết bị theo dõi chúng.
ss -tio dst 10.60.4.20
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
Danh sách socket hiển thị bộ hẹn giờ và trạng thái hàng đợi của kết nối đang sống, điều này cho biết nhiều hơn một bài kiểm tra khả năng tiếp cận. Các giá trị sysctl là giá trị mặc định của hạt nhân cho hành vi keepalive, và phần tiếp theo giải thích vì sao chúng có thể không bao giờ áp dụng cho phiên của bạn. Một giá trị mặc định không bao giờ kích hoạt thì không thể phân biệt với việc hoàn toàn không có giá trị mặc định.
Hãy ghi lại địa chỉ, cổng và giao diện mà kết nối sử dụng. Khi một phiên chết, chính những chi tiết đó cho phép bạn hỏi đúng thiết bị rằng nó đã làm gì, thay vì hỏi mạng có hoạt động hay không.
Chính sách nhàn rỗi hết hạn hay giới hạn
Hai chính sách tạo ra cùng một triệu chứng và cần những phản ứng trái ngược. Thời gian chờ nhàn rỗi loại bỏ trạng thái mà lưu lượng đủ điều kiện có thể đã làm mới, và keepalive có thể ngăn điều đó. Giới hạn phiên tuyệt đối loại bỏ luồng sau một khoảng thời gian cố định bất kể hoạt động, và không keepalive nào thay đổi được điều đó.
Hãy hỏi chủ sở hữu của từng thiết bị trung gian xem nó thực hiện chính sách nào. Tường lửa, thiết bị NAT, bộ cân bằng tải và cổng đám mây đều có thể giữ trạng thái, và chúng không nhất thiết phải đồng ý với nhau. Cái hẹp nhất đặt ra thời hạn mà bạn phải vượt qua.
Sự khác biệt đó cũng cho biết khi nào nên ngừng tinh chỉnh. Nếu chính sách là giới hạn tuyệt đối, cách sửa đúng là một đơn vị công việc ngắn hơn, một tác vụ có thể tiếp tục hoặc một ngoại lệ đã được phê duyệt, và phần kiểm tra bên dưới sẽ chỉ xác nhận rằng keepalive không thay đổi gì.
Công tắc socket đằng sau các giá trị mặc định của Linux
keepalive là tùy chọn cho từng socket. Các giá trị mặc định của hạt nhân mô tả cách các phép dò hoạt động sau khi socket đã bật cơ chế, và chúng không bật cơ chế cho các kết nối đang tồn tại. Một ứng dụng không bao giờ yêu cầu sẽ không nhận được phép dò nào, bất kể giá trị sysctl nói gì.
Vì vậy chỉ tăng các con số không thay đổi gì cho một ứng dụng khách cơ sở dữ liệu. Thư viện khách hoặc ứng dụng phải bật cơ chế, và ở nơi ngăn xếp cung cấp điều khiển theo từng kết nối, một thiết lập giới hạn tốt hơn thay đổi cho toàn bộ máy chủ vốn ảnh hưởng tới các dịch vụ không liên quan.
Khoảng tới phép dò đầu tiên cũng không phải thời gian chờ truy vấn. Một kết nối khỏe mạnh vẫn yên tĩnh giữa các phép dò, và một đối tác đã chết được nhận ra theo khoảng và số lần dò. Đọc ba giá trị đó như một thời gian chờ duy nhất dẫn tới các thiết lập phát hiện sự cố hoặc quá muộn hoặc quá vội. Chúng điều khiển việc phát hiện, không phải sự kiên nhẫn của ứng dụng.
EXPIRE_TIME là thiết lập cơ sở dữ liệu, không phải bản sửa mạng
Oracle Net cung cấp cơ chế sống còn riêng của nó, được cấu hình trong hồ sơ hiệu lực cho tiến trình chứ không phải trong một tệp tùy ý tình cờ có tên tương tự. Giá trị được biểu thị bằng phút.
SQLNET.EXPIRE_TIME = 5
Mục đích chính của nó là phát hiện các kết nối đã chết ở phía máy chủ, và trên các nền tảng hỗ trợ mô hình nâng cao nó cũng tinh chỉnh hành vi TCP keepalive cho những kết nối đó. Đó là một tính chất hữu ích: tầng cơ sở dữ liệu có thể bố trí các phép dò mà không cần yêu cầu ứng dụng khách thay đổi.
Giá trị ví dụ ở trên là một lựa chọn phối hợp đối với một thời hạn giả định, không phải khuyến nghị. Hướng dẫn chung đã được ghi chép là khoảng dài hơn, và con số đúng phụ thuộc vào bản triển khai đã cài, chi phí dò mà bạn chấp nhận và các quy tắc làm mới thực tế trên đường đi. Hãy đặt thiết lập trong hồ sơ mà tiến trình liên quan đọc, và xác nhận rằng tiến trình đã nhận nó. Oracle ghi chép vị trí hồ sơ và hành vi phát hiện trong tài liệu tham chiếu tham số của mình.
Hãy thử khoảng yên tĩnh, rồi lập kế hoạch phục hồi
Cho một kết nối mới được phép đi qua một khoảng yên tĩnh dài hơn thời hạn bạn đang cố vượt qua, và quan sát lưu lượng sống còn cùng kết quả của ứng dụng. Đừng bắt nội dung tải trọng mà bạn không cần; bộ hẹn giờ và trạng thái kết nối trả lời câu hỏi đó.
ss -tio dst 10.60.4.20
# after the quiet interval, same command
ls -l "$ORACLE_HOME/network/admin/sqlnet.ora"
Nếu phiên vẫn biến mất, thời hạn thuộc về một thiết bị mà bạn chưa hỏi, hoặc chính sách là giới hạn tuyệt đối. Nếu nó sống sót, hãy ghi lại lớp nào đã thay đổi để thao tác yên tĩnh tiếp theo không lặp lại cuộc điều tra.
Cuối cùng, hãy quyết định điều gì xảy ra khi kết nối thực sự rớt, vì các kiểm tra sống còn làm giảm tần suất và không bao giờ loại bỏ khả năng. Hãy xác lập kết quả đã ghi của thao tác cơ sở dữ liệu trước khi gửi lại: mất câu trả lời không chứng minh được gì về việc công việc đã được xác nhận hay chưa. Với mọi thứ phải chịu được việc gập laptop hoặc khởi động lại đường hầm, một tác vụ thuộc về máy chủ với kết quả bền vững là thiết kế mạnh hơn, và keepalive không phải bộ lập lịch.