今日はなにの日。

気になったこと勉強になったことのメモ。

今日は、MariaDBの記事が難しかったので詳しく調べたの日。

目次

とある日

ツイッターでとある記事を見た。

buildup-db.blogspot.com

読んでみたけど、今の自分ではあまり理解できなかったので理解できるように単語を調べてみたりする。

見てない方はぜひご覧ください。

下記の6つの単語を中心に調べてみる。

  • fsync()
  • innodb_flush_log_at_trx_commit
  • LSN
  • log_write_up_to()
  • assertion code
  • write/flush

※環境を整えて計測するなどは一切致しません、あくまでも記事内容を理解するために使用されている単語について調べた内容を記述します。

MariaDB

MySQLは趣味で触ることが多いですがMariaDBについてはあまり知らないので軽く調べる。

Wiki

MariaDBは、MySQL派生として開発されている、オープンソース関係データベース管理システム (RDBMS) である。

MariaDBの開発は、MySQLのオリジナルコードの作者でMySQL ABの創設者でもあるミカエル・ウィデニウスにより、現在オラクル)によって所有されているMySQLフォーク)して立ち上げられたプロジェクトにより行われている[6]。配布ライセンスは、GNU General Public Licenseのバージョン2[5]

豆知識

いつ使えるかわからない豆知識としてWikiにも載っていた。

MySQLは、一番目の子供の名前らしいですね。

MariaDBの名は、Wideniusの2番目の娘の名前から採られている[7]

日本語. MariaDB Knowledge Base

詳しいことが知りたい方はこちらで。

mariadb-10.5.9.tar.gz

記事で、使用されていたファイル。

見たい方はこちらから。

現在公開されている最新バージョンみたいですね。

MySQLとほとんど同じと考えて良さそうですね。

なので、MySQL5系のリファレンスなどを参考にする場合があります。

MariaDBの基礎知識がわかったところで本編へ。

fsync()

「fsync()を待つべきなのに待ってないから」

元記事で一番重要と思われるfsync()という単語から調べます。

MariaDBにまつわるfsync()の記述は見つけられなかったがLinuxUbuntuの2つOSについての記述を見つけた。

どちらも、メモリ上のキャッシュデータから永続ストレージデバイスに 転送(フラッシュ)することを指していました。

メモリ

  • データキャッシュ
  • ログバッファ

殆どのRDBMSが、この2つに該当するメモリ領域を持っています。

データキャッシュ

ディスクにあるデータの一部を保持するためのメモリ領域です。

SELCET文でデータ検索を行うときに、メモリ領域内に該当するデータがあると高速で処理が可能。

ログバッファ

更新処理の実行に関係します。

DBMSは、更新SQL文を実行したときに即座にストレージ内のデータを変更していません。

このログバッファに更新情報を蓄積させて後でストレージへ変更を反映させます。

そして、fsyncではこのログバッファの処理が関係しています。

ログバッファの内容をストレージ書き込む処理をfsyncということになります。

innodb_flush_log_at_trx_commit

記事では、この値が0,1,2のいずれでも同じ動作になると書いています。

MySQL5.6 innodb_flush_log_at_trx_commit

コミット操作に対する厳密な ACID コンプライアンスと、コミット関連の I/O 操作が再編成およびバッチ処理されるときに実現可能な高いパフォーマンスとの間のバランスを制御します。デフォルト値を変更するとパフォーマンスを改善できますが、クラッシュ時にトランザクションが最大で 1 秒間失われる可能性があります。

innodb_flush_log_at_trx_commit = 0

値を 0 にすると、約 1 秒ごとに 1 回、InnoDB のログバッファーの内容がログファイルに書き込まれ、ログファイルがディスクにフラッシュされます。

innodb_flush_log_at_trx_commit = 0

完全に ACID コンプライアンスに従うには、デフォルト値の 1 を使用する必要があります。

innodb_flush_log_at_trx_commit = 0

値を 2 にすると、トランザクションコミットのたびに、InnoDB のログバッファーの内容がログファイルに書き込まれ、約 1 秒ごとに 1 回ログファイルがディスクにフラッシュされます。

それぞれの値で、ログファイルに書き込むタイミングが変化します。

ログファイルに書き込む処理を行うとファイルに対するI/Oのため低速になる。

LSN

「ログシーケンス番号 (Log Sequence Number)」の頭字語。この任意の増加し続ける値は、Redo ログに記録される操作に対応する時点を表します。(この時点は、トランザクション境界を意識しません。1 つ以上のトランザクションの中間になることがあります。)クラッシュリカバリ中に InnoDB によって内部的に、バッファープールを管理するために使用されます。

Redoログとの紐付けのために使用される番号となっている。

log_write_up_to()

それっぽいやつがあったのですが、ソースコード中の関数名かなと思います。

log_write_up_to(lsn, LOG_WAIT_ONE_GROUP, FALSE);

ソースコードとなると、これ以上踏み込むのは難しいので諦めます。

assertion code

アサーション(ソフトウェア開発))

コンピュータプログラミング使用する場合、具体的には命令型プログラミングのパラダイムを、アサーションは、ある述語)(ブール値関数オーバー状態空間通常のように表現、論理命題用い変数)プログラム内のポイントに接続された番組の)を、そのコード実行のその時点で常にtrueと評価される必要があります。アサーションは、プログラマーがコードを読んだり、コンパイラーがコードをコンパイルしたり、プログラムが自身の欠陥を検出したりするのに役立ちます

正常に作動しているかを確認するような使用方法なのかと認識しました。

mariadb-10.5.9> diff -up storage/innobase/log/log0log.cc.orig storage/innobase/log/log0log.cc --- storage/innobase/log/log0log.cc.orig 2021-03-02 12:04:30.167590939 +0900

diffコマンド

Linux等で使用されるコマンド。

「diff」は、2つのテキストファイルを比較し、異なる箇所を出力するコマンドです。

短いオプション 長いオプション 意味
-u --unified 違いのある箇所を1つにまとめて、-記号と+記号で変更箇所を示す(unified形式、第103回参照
-p --show-c-function 変更がC言語のどの関数で行われたのかを表示する。「-F'^[_a-zA-Z$]'」相当

参照してたそれっぽいファイルは見つけた。

該当ファイルはC言語で記述されている。

storage/innobase/log/log0log.cc.orig storage/innobase/log/log0log.cc

write/flush

直接的な記述はなかったですがそれっぽい解釈は見つかりました。

write

MySQLとMariaDBの比較

テーブルへの挿入

flush

フラッシュ

バッファー内に貯められた情報を吐き出すこと。英語の原義で、流す、追い出す、平らにする。

おまけ

MariaDBがはやいかどうかの記事を探してみた。

MariaDB vs MySQL: 徹底比較

それぞれの単語を調べて改めて記事を読むとより理解が深まった。

読んですぐ理解できるようにこれからもっと頑張りたいと思った。

Yasufumi Kinoshitaさんは他に様々なDBの記事があるので読んでみると面白いです。