JobSchedulerがdatabase problemで落ちる場合、JDBCドライバを変えると理由が分かるかもしれない

久しぶりにJobScheduler関連の記事を一つ。

JobSchedulerが定期的にdatabase problemで落ちる

毎日、2〜3時間かかるジョブをJobSchedulerで動かしているのですが、数週間ほど動かしていると、突然、下記のようなメールが来て、JobSchedulerが落ちてしまうという事態に遭遇しました。
で、一旦落ち始めると、毎日のように落ちるんですね。困った・・・。

SCHEDULER-306 Error when updating table SCHEDULER_ORDERS: Z-JAVA-105 Java exception java.sql.SQLNonTransientConnectionException: Could not send query: Broken pipe – caused by – org.mariadb.jdbc.internal.common.QueryException: Could not send query: Broken pipe – caused by – java.net.SocketException: Broken pipe, method=executeUpdate []

理由は分からないけど、とにかくMySQLとのコネクションが切れてしまったと。
このWarningメールが最後の断末魔のようなもので、あとは数分後にJobSchedulerが落ちて、今度はJobSchedulerを監視しているNagiosからエラーメールが来る。

しかも、落ちるタイミングが、その時に動作させているジョブの動作中ではなく、ジョブが終わったであろうタイミングなのです。なので、処理的にはジョブそのものというより、JobSchedulerの方が怪しいのではないか・・・。

DBドライバをMariaDBからMySQLに変えてみる

最近のJobScheduler(といってもここ1年くらいですが)は、インストール時にMySQL用のJDBCドライバの指定が求められず、代わりにMariaDBのJDBCドライバが同時にインストールされる形になっています。

一か八か、JDBCドライバをMySQLのものに変えてみることにしました。

JDBCドライバの指定は、JobScheudlerのホームディレクトリ内のconfigディレクトリ(例:/home/jobscheduler/sos-berlin.com/jobscheduler/scheduler1/config)にある、factory.iniで行います。

db = jdbc -class=com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/(DB名) -user=(DBユーザ) -password=(DBパスワード)
db_class = SOSMySQLConnection

MySQLのJDBCドライバは、公式サイトからダウンロードして、JobSchedulerのインストール先のlibディレクトリ(例:/opt/sos-berlin.com/jobscheduler/scheduler1/lib)に入れておきます。
libディレクトリ内のjarファイルはすべて自動的に読み込まれるので、ファイルを置くだけでOKです。

MySQLのJDBCドライバの方がエラーメッセージが明確

JDBCドライバを変えても、結局JobSchedulerは落ちてしまいました。
しかし、MySQLのJDBCドライバが出すエラーメッセージの方が親切だったので、理由が分かりました!

SCHEDULER-306 Error when updating table SCHEDULER_ORDERS: Z-JAVA-105 Java exception com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1098170 > 1048576). You can change this value on the server by setting the max_allowed_packet’ variable., method=executeUpdate []

なるほど、PacketTooBigExceptionだったのか!

そのタイミングで動作させているジョブが吐き出すログが大量だったので、ジョブが終わったタイミングで、JobSchedulerがログをMySQLに格納しようとして、それがPacketTooBigで、MySQLとのコネクションが切れてしまったということのようなのです。

動作させているジョブというのが、日々対象データが増えていく感じのもので、吐き出すログも増えてくるので、ジョブを仕掛けた当初は正常動作していたものが、日を追ってくるうちにJobSchedulerが落ちるようになったというわけです。

根本的な解決ではないかもしれませんが、とりあえず出力するログを減らすことで、JobSchedulerは落ちなくなりました。

まとめ

ということで、JobSchedulerが同時にインストールするMariaDBのJDBCドライバでも通常動作には問題ないのですが、データベース系のエラーが出始めた場合には、MySQLのJDBCドライバに変えてみると理由が分かるかもしれないよということでした。

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。画像認識モデルを活用したアプリや、生成AIを業務に組み込むためのサービス「Gen2Go」の開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。