久しぶりに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ドライバに変えてみると理由が分かるかもしれないよということでした。