世界を動かす技術を、日本語で。

AliSQL: AlibabaのオープンソースMySQL、ベクトルエンジンとDuckDBエンジン搭載

概要

  • AliSQL はAlibabaが開発したMySQLのフォークで、大規模環境向けに最適化されたデータベース
  • DuckDB ストレージエンジンを統合し、軽量分析やAI活用が可能
  • 最新版は MySQL 8.0.44 ベースで、多数のパフォーマンス・安定性向上機能を搭載
  • 今後のロードマップにはDDL/RTO/レプリケーション最適化が含まれる
  • オープンソース であり、GitHubで貢献・サポートが可能

AliSQL概要

  • AliSQL はAlibaba Groupが公式MySQLをフォークし、独自に拡張・最適化したRDBMS
  • Alibaba社内の大規模プロダクション環境 で広範に利用
  • パフォーマンス最適化、安定性向上、大規模用途のための独自機能を提供

主な特徴

  • DuckDBストレージエンジン統合

    • DuckDBをネイティブストレージエンジンとして組み込み
    • MySQLと同様の操作感で DuckDBノードの高速構築 が可能
    • 軽量な分析用途に適した運用
  • ベクトルストレージ対応

    • 最大16,383次元の エンタープライズ向けベクトル処理 を標準サポート
    • HNSWアルゴリズム による高性能な近似最近傍(ANN)検索を実装
    • SQLインターフェースから AIアプリケーション (セマンティック検索・レコメンド等)を簡単構築

バージョン情報

  • AliSQLバージョン :8.0.44(LTS)
  • ベース :MySQL 8.0.44

ロードマップ(予定)

  • DDL最適化

    • 強化されたインスタントDDL、並列B+tree構築、非ブロッキングロック、リアルタイム適用
    • スキーマ変更効率の大幅向上とレプリケーション遅延のほぼ解消
  • RTO(復旧時間)最適化

    • クラッシュリカバリ経路の深い最適化
    • インスタンス起動・復旧の高速化
  • レプリケーション最適化

    • Binlog Parallel FlushBinlog in Redo の導入
    • 大規模トランザクションやDDL操作のための専用最適化
    • レプリケーションスループット向上・遅延最小化

クイックスタート・導入手順

  • 前提条件

    • CMake 3.x以上
    • Python3
    • C++17対応コンパイラ(GCC 7+またはClang 5+)
  • ビルド手順

    • リポジトリをクローン
      • git clone https://github.com/alibaba/AliSQL.git
      • cd AliSQL
    • リリースビルド
      • sh build.sh -t release -d /path/to/install/dir
    • デバッグビルド
      • sh build.sh -t debug -d /path/to/install/dir
    • MySQLサーバのインストール
      • make install
  • 主なビルドオプション

    • -t release|debug:ビルドタイプ指定(デフォルト:debug)
    • -d <dest_dir>:インストール先ディレクトリ指定
    • -s <server_suffix>:サーバサフィックス指定
    • -g asan|tsan:サニタイザ有効化
    • -c:GCCカバレッジ(gcov)有効化
    • -h, --help:ヘルプ表示

サポート・貢献

  • GitHub Issues :バグ報告・機能要望はGitHub Issues

  • Alibaba Cloud RDS :DuckDBベースの分析インスタンス提供

  • DuckDB特有のサポート :DuckDB公式サポート案内を参照

  • 貢献方法

    • リポジトリをフォーク
    • フィーチャーブランチ作成
    • 変更・テスト実施
    • プルリクエスト送信

ライセンス

  • GPL-2.0ライセンス に基づき公開
  • 詳細はLICENSEファイル参照
  • MySQL、DuckDB統合部分も同じライセンス適用

関連リンク

  • AliSQL Release Notes
  • DuckDB Storage Engine in AliSQL
  • Vector Index in AliSQL
  • MySQL 8.0 Documentation
  • MySQL 8.0 Github Repository
  • DuckDB Official Documentation
  • DuckDB GitHub Repository
  • Detailed Article (Chinese)

Hackerたちの意見

従来のデータベースに分析用のカラム型データベースを組み込むのは、生産性と運用のシンプルさにとって大きなメリットだよね。今はPGとTiger Dataを使ってるけど、MySQLの同等品は見つからなかったから、これがその代わりかな。

一つの選択肢はTiDBだね。行ベースのデータとカラム型データの両方をサポートしてる。ただ、MySQL互換だけど、MySQLのコードに基づいてないから、求めてるものとはちょっと違うかも。

Tiger Dataはシンプルなカラムストアとして使えるのかな?僕が求めてるのは、PGでClickHouseがやってることとほぼ同じなんだ。高速なカウントが必要なテーブルが一つあって、ClickHouseはそのカウントを早くできるけど、全体の同期/レプリケーションを通らないといけないんだよね。TimeSeriesのクイックスキャンは、実際にはそれに最適化されてる感じがして、別の使い方をするのはちょっと難しそう。

ClickHouseはMySQLプロトコルをネイティブでサポートしてて、MySQLのテーブルをラップしたりインポートしたりもできるんだ。接続が2つ必要だけど、結構うまく動くよ。

MariaDBは少し前からカラム型テーブルをサポートしてるよ。https://mariadb.com/resources/blog/see-columnar-storage-for-...

MariaDBにはすでにカラム型エンジンがあるんだけど(自分では使ったことないけど)、ほぼMySQL互換だよ。約1年前からベクトルストレージタイプがリリースに含まれてるから、Alibabaのやつとパフォーマンスを比較するのが楽しみだな。これを言いたかっただけ。PostgresがHNでよく取り上げられてるけど、MariaDBの多才さを無視してる人が多いと思う。

pg_duckdbと比べてどうなのか気になるな。pg_duckdbはPostgresの強力な拡張機能のおかげで、かなりクリーンな感じだし。

こちらが、技術的な観客やブログ投稿向けに最適化されたあなたの分析のプロフェッショナルな英語翻訳です:私がMySQLがDuckDB統合にPostgreSQLより適していると考える理由 現在、エコシステムには三つの主流なソリューションがあります:pg_duckdb、pg_mooncake、pg_lake。しかし、いくつかの重要な障害に直面しています。まず、PostgreSQLの論理レプリケーションは成熟していなくて、物理レプリケーションの堅牢性には大きく及ばず、PGのプライマリノードをDuckDBの読み取り専用レプリカに論理ストリーム経由で信頼性を持って接続するのが難しいです。さらに、PostgreSQLには本当に成熟したプラグイン可能なストレージエンジンアーキテクチャが欠けています。テーブルアクセスメソッドをインターフェースとして提供していますが、プライマリ-レプリカのレプリケーションやクラッシュリカバリーに対する標準化されたサポートはありません。これにより、多くのプロダクションシナリオでデータの整合性を保証するのが難しくなります。しかし、MySQLはこれらの問題を優雅に解決しています:ネイティブプラグインアーキテクチャ:MySQLはプラグイン可能なストレージエンジン設計で生まれました。歴史的に、MySQLはInnoDBの行レベルMVCCを活用するためにデフォルトエンジンをMyISAMからInnoDBに切り替えました。InfoBrightのような以前のカラム型の試みもありましたが、大規模な採用には至りませんでした。MySQLにネイティブなカラム型エンジンとしてDuckDBを追加するのは自然な進展です。これにより、PostgreSQLで見られる「回避策」アーキテクチャの必要がなくなります。データはまず行ストアに書き込まれ、その後カラム型フォーマットに変換される必要がなくなります。バイナリログエコシステムの力:MySQLの「デュアルログ」メカニズム(バイナリログとリドゥログ)は二面性があります。生の書き込み性能には影響を与えますが、バイナリログは広範なデータエコシステムに対して比類のないサポートを提供します。データ変更のクリーンなストリームを提供することで、下流システムへのシームレスなレプリケーションを促進します。これが、ClickHouseやStarRocks、SelectDBのようなOLAPソリューションがMySQLエコシステム内で繁栄している理由です。シームレスなHTAP統合:DuckDBをMySQLストレージエンジンとして使用する場合、バイナリログエコシステムは完全に互換性があり、維持されます。これにより、システムはデータウェアハウスノードとして機能し、自身のバイナリログを「エグレス」することができます。HTAP(ハイブリッドトランザクショナル/分析処理)のシナリオでは、InnoDBを使用するプライマリMySQLノードがバイナリログをDuckDBエンジンを使用する下流のMySQLノードに直接ストリーミングでき、完全に互換性のある流動的なデータパイプラインを実現します。

一目見た感じだと、DuckDBとVector StorageのためのPSQL FDWのより統合されたバージョンがあれば、Vespaに合いそうだね。MySQLを拡張する道を選んだのが面白いな、PSQLのFDWルートじゃなくて?

たぶん、すでに何百万行ものコードがMySQLを使ってたんだろうね。

HTAPが来たね!このハイブリッドデータベースが少しずつ普及してるのを見るのはすごくいいことだ。特に面白いのは、トランザクション処理の改善があったみたいで、https://github.com/alibaba/AliSQL/blob/master/wiki/duckdb/du... でも確認できるよ(MySQLの内部についてもいい感じにまとめられてる)。プライマリテーブルと分析用テーブルの同期が速くて、しかもトランザクショナルであることが確認できるのは素晴らしいね。

これが本当にHTAPだとは思わないな。全く異なる二つのデータベースを一つのインターフェースでつなげてるだけじゃない?私が見る限り、Materializeみたいなものと比べてトランザクションや整合性の保証はないと思う。これも新しいわけじゃなくて、何年も前からMySQL/PostgresにOLAPストレージエンジンを組み込む試みはあったし、例えばpg_ducklakeやtimescaleとかね。

これはDuckDbにトランザクショナルなワークロードからデータを継続的に供給するのかな?SAP HANAみたいに。もしそうなら、すごいことだよね。人々はKafkaやdebeziumを使ってトランザクショナルデータをデータウェアハウスに繋げるのにたくさんの時間を費やしてるから。ところで、apavloの意見も聞いてみたいな。

コミット履歴がちょっと変だね。2022年に2回、2024年と2025年に1回ずつ、2026年に5回(そのうちの1つは「最初のコミット、DuckDBエンジンのサポート」)って感じ。

ただの推測だけど、オープンソースとして計画されてなかったんじゃないかな。実際のバージョン管理履歴は、役に立たない内部のJiraチケットの参照や、製品に関する機密情報が中国語で書かれてるかもしれないし、gitにも入ってないかも…最小限の偽のgitバージョン履歴を作る理由は山ほどあるよ。

これを作った可哀想な開発者たちが、過酷な996文化(朝9時から夜9時まで、週6日)にさらされていなければいいな。

READMEにロケットの絵文字があったら、すぐに興味を失っちゃうな。

DuckDBをストレージエンジンとして使うアプローチは賢いね。既存のMySQL接続やツール、レプリケーションのトポロジーをそのまま使いつつ、分析クエリを下のカラム型エンジンにルーティングできるから。別の分析用データベースを立てて、同期パイプラインを作るよりずっと簡単に説明できるよね。本当に重要なのは、InnoDBとDuckDBの同じデータの整合性をどうやって保つかだ。ここがハイブリッドOLTP/OLAPシステムの明暗を分けるところだよ。

このページでは、MySQLのbinlogメカニズムを活用した読み取り専用のカラムストア(DuckDB)ノードの実装方法を紹介しています。 https://github.com/alibaba/AliSQL/blob/master/wiki/duckdb/du... この実装では、binlogのバッチ伝送や書き込み操作などに関して、広範な最適化を行いました。

いい質問だね!データの整合性の問題についてはかなり時間をかけて考えたよ。MySQLのレプリケーションでは、GTIDがトランザクションの見逃しや繰り返し再生を防ぐために重要なんだ。これを二つのシナリオで処理しているよ(binlogが有効かどうかによる):- log_binがOFFの時:DuckDBのトランザクションがコミットされる前にGTIDがディスクに書き込まれることを確認しているよ(mysql.gtid_executedテーブルに)。さらに、クラッシュリカバリーの後、しばらくの間DuckDBに冪等性のある書き込みを行うんだ(原則はアップサートや削除+挿入に似ている)。だから、クラッシュリカバリーの後の任意の瞬間に、DuckDBのデータがプライマリデータベースと整合していることを保証できるよ。- log_binがONの時:前のシナリオとは違って、mysql.gtid_executedテーブルには依存せず、GTIDの永続化にバイナリログを直接使うんだ。でも、新たな問題が発生する:バイナリログの永続化はストレージエンジンがコミットする前に行われるから。だから、DuckDBに有効なバイナリログの位置を記録するためのテーブルを作ったんだ。もしDuckDBのトランザクションがコミットに失敗したら、バイナリログは最後の有効な位置まで切り詰められる。これにより、DuckDBのデータがバイナリログの内容と整合することが保証されるよ。だから、レプリカサーバーのgtid_executedがプライマリデータベースのものと一致すれば、DuckDBのデータもプライマリデータベースと整合することになるんだ。