نزدیک به ۱ هفته است با مشکل عجیبی در سرورهای عملیاتیام برخورد کردم که بهتر دیدم مشکل را به صورت عمومی مستند کنم
APPLIES TO
- دیتاسنتر: Hetzner - Germany
- نسخه مجازیساز: Proxmox Virtual Environment 5.2
- نسخه سیستم عامل: Oracle Linux Server release 7.5
- نسخه پایگاهداده : Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
- نسخه JDK اوراکل: Java SE Development Kit 8u181
- نسخه APEX (دولوپ): Oracle Application Express 18.1
- نسخه ORDS (دولوپ): Oracle REST Data Services 18.2.0.r1831332
PURPOSE
سناریو مد نظر ما تست اتصال ORDS 18.2 به پایگاه داده 12.2.0.1.0 است. قبل از شروع عملیات نصب و راهاندازی در محیط آزمایشگاه سناریوهای زیر را با موفقیت انجام دادم:
OEL 6.8 + Oracle Database 12.2.0.1.0 + ORDS 18.2
OEL 7.5 + Oracle Database 12.2.0.1.0 + ORDS 18.2
SYMPTOMS
بعد از نصب و راهاندازی Oracle Database 12.2.0.1.0 بر روی ماشین مجازی و هنگام پیکربندی ORDS با دستور زیر برای اتصال به پایگاهداده localhost:
java -jar ords.war
بعد از یک Wait طولانی به Timeout و خطای زیر برخورد خواهید کرد:
[oracle@static ords-18.2.0]$ java -jar ords.war validate
Enter the name of the database server [localhost]:localhost
Enter the database listen port [1521]:
Enter the database service name [APEX51_PDB]:
Requires SYS AS SYSDBA to verify Oracle REST Data Services schema.
Enter the database password for SYS AS SYSDBA:
Confirm password:
Sep 10, 2018 8:59:24 PM oracle.dbtools.rt.config.setup.SchemaSetup verifyDBAUserConnection
WARNING: Failed to connect to user SYS AS SYSDBA jdbc:oracle:thin:@//localhost:1521/APEX51_PDB
IO Error: Connection reset by peer, Authentication lapse 245400 ms.
CAUSE
این خطا به دلیل عدم برقرای اتصال صحیح از طرف اپلیکیشن به پایگاهداده در پروتکل JDBC رخ میدهد. دلیل Timeout میتواند به خاطر مشکلات شبکه/ فایروال و یا تنظیمات کلاینت (سیستمعامل) در اتصال به شبکه باشد.
DETAILS
ابتدا اتصال به پایگاهداده را از طریق پروتکل Oracle Net به صورت local و remote چک کنید. در صورت نبود مشکل در اتصال با پروتکل Oracle Net لاگ Listener را پاک کنید و دوباره با ORDS کانکشن بزنید. همچنین میتوانید از اسکریپت زیر:
https://github.com/mghaffari94/TestConnectionJDBC
برای اتصال به پایگاه داده از طریق پروتکل JDBC استفاده کنید. برای استفاده از این اسکریپت یکبار فایل را با javac همانند زیر کامپایل کنید:
[oracle@static ~]$ javac TestConnectionJDBC.java
[oracle@static ~]$ java -cp .:/home/oracle/ojdbc8-12.2.0.1.jar TestConnectionJDBC
Connecting to database...
java.sql.SQLRecoverableException: IO Error: Connection reset by peer, Authentication lapse 306377 ms.
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:794)
at oracle.jdbc.driver.PhysicalConnection.connect(PhysicalConnection.java:688)
at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:39)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:691)
at java.sql.DriverManager.getConnection(DriverManager.java:664)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
at TestConnectionJDBC.main(TestConnectionJDBC.java:12)
Caused by: java.io.IOException: Connection reset by peer, Authentication lapse 306377 ms.
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:790)
... 6 more
Caused by: java.io.IOException: Connection reset by peer
at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
at sun.nio.ch.IOUtil.write(IOUtil.java:65)
at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
at oracle.net.nt.TimeoutSocketChannel.write(TimeoutSocketChannel.java:215)
at oracle.net.ns.NIOPacket.writeToSocketChannel(NIOPacket.java:211)
at oracle.net.ns.NIONSDataChannel.writeDataToSocketChannel(NIONSDataChannel.java:181)
at oracle.net.ns.NIONSDataChannel.writeDataToSocketChannel(NIONSDataChannel.java:132)
at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:96)
at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:499)
at oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:1279)
at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:663)
... 6 more
connection to database not ok
دقت کنید برای شبیهسازی تست اتصال همانند ORDS 18.2 شما باید JDBC نسخه ojdbc8-12.2.0.1 را دانلود کنید برای دانلود به صفحه زیر مراجعه کنید:
https://www.oracle.com/technetwork/database/features/jdbc/jdbc-ucp-122-3110062.html
حالا لاگ Listener رو بازبینی میکنیم:
[oracle@static ~]$ cat /u02/app/oracle/diag/tnslsnr/iraninsurance1/listener/trace/listener.log
2018-09-10T21:47:45.933429-04:00
10-SEP-2018 21:47:45 * (CONNECT_DATA=(CID=(PROGRAM=JDBC Thin Client)(HOST=__jdbc__)(USER=oracle))(SERVICE_NAME=CDB)) * (ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=24004)) * establish * CDB * 0
10-SEP-2018 21:47:46 * service_update * orairap * 0
همانطور که میبیند کانکشن JDBC وارد Listener شده و داینامیک پورت به آن تخصیص داده شده اما کانکشن برقرار نشده پس نتیجه میگیریم در پکتهای برگشتی اختلالی وجود دارد. در این شرایط فایروالها و شبکه را بازرسی کنید اگر همه چیز بدون مشکل بود شما درگیر Hits Outage شدهاید.
حال به بررسی تغییرات آخرین نسخه Oracle JDBC میپردازیم:
با چک کردن فایل Readme-JDBC.txt آخرین نسخه کنونی JDBC - نسخه 18c/18.3 در قسمت Known Problems Fixed in This Patch Release توضیحات زیر را مشاهده خواهید کرد:
Known Problems Fixed in This Patch Release (on top of 18c/18.1)
---------------------------------------------------------------
27021716 - SSL connection gets handshake_failure with Cipher
SSL_RSA_WITH_3DES_EDE_CBC_SHA
27453225 - Driver calculates wrong value of ORA-hash for a sharding key
26898279 - Application Continuity (AC) support for when endRequest one-way
hits outage
دریافت
حجم: 5.57 کیلوبایت
همانطور که مشاهده میکنید این مشکل با شماره پچ 26898279 در آخرین نسخه برطرف شده است.
اما چرا hits outage اتفاق میافتد؟ در انجمن زیر اشارههایی به وجود مشکلات مشابه در Network مجازیساز Proxmox شده است
https://forum.proxmox.com/threads/proxmox-network-config-on-hetzner.36245/
به طور خلاصه فایل ISO ای که دیتاسنتر Hetzner برای نصب Proxmox استفاده میکند شخصیسازی شده است و پیکربندیهای پیشفرضی در شبکه برای ماشینها لحاظ شده است. در نسخه 7.x خانواده RHEL این مشکل دیده شده که تنظیمات پیشفرض دیتاسنتر Hetzner برای Broadcast باعث وجود response های طولانی شده است. توصیه شده برای نصب مجازیساز Proxmox از ISO خام وبسایت Proxmox استفاده شود. همچنین این مشکل در نسخههای پیشین RHEL و Debian دیده نشده است.
SOLUTION
برای حل این مشکل ۲ راهکار کلی وجود دارد:
راهکار اول
آپدیت نسخه OJDBC ابزار ORDS
راهکار دوم
نصب و راهاندازی OEL 6.x