Play2.4 + Slick3 で MariaDBを使ってみる

この記事はScalaAdventCalender22日目の記事です。
そして、火曜はkuchitamaの日の最終日です。

こんにちは、@kuchitamaこと国平です。
先日バージョンアップした ShareWisはもうご利用いただけましたでしょうか。

現在はITカテゴリの学習コースのみですが、今後はカテゴリ/ジャンルの幅を広げて、知識との出合いを提供していきます。

ShareWisではAWSを利用していますが、サービス改良のために、12/18に大阪で開催されたAWSセミナーに参加してきました。
そこで、AmazonAuroraについての情報を集めたのですが、Aurora利用の前段として、MariaDBを利用するとよいとの知見を得たので、MariaDB利用検証をしました。

NXdGpkmF

AmazonAuroraとMariaDB

クラウド時代のRDBとしてアーキテクチャを見なおされたAuroraは、非常にスケーラブルで魅力的でした。
しかし、現状の弊社のサービスの要件と、Auroraの特徴を考えると、今の時点でAuroraを採用するメリットはそれほど高くないように感じました。

セミナーの後で、その所感を@con_mameさんにお話したところ、Auroraの前段としてMariaDBの利用をオススメしていただきました。

AmazonAuroraはMySQLのドライバでも利用できますが、MariaDBのドライバにより最適化されているとのことでした。
また、MariaDB自体もMySQLを元に、クエリエンジンの改良などがされているそうです。

そこで、先日の記事で公開していた play-bookshelf を Slick3 と MariaDB nに対応させました。

Slick3 + MySQL

今回のテーマはMariaDBですが、まずはSlick3を使ってMySQLを利用できるように実装します。

そのための変更内容はこちらです。

DBのマイグレーションやテストデータの用意は、Play Evolutionを使いました。

Play2.4でSlickを利用するためには、slickと合わせて play-slickをdependenciesに追加します。

"com.typesafe.play" %% "play-slick" % playSlickVersion,
"com.typesafe.play" %% "play-slick-evolutions" % playSlickVersion,
"mysql" % "mysql-connector-java" % "5.1.36",
"com.typesafe.slick" %% "slick" % slickVersion,

そして、MySQLに接続する設定を application.conf に追加します。
playデフォルトのDB設定とは少し違って、 slick.dbs に、設定を含むように記述します。

slick.dbs.default {
driver="slick.driver.MySQLDriver$"
db {
driver=com.mysql.jdbc.Driver
url="jdbc:mysql://localhost:3306/bookshelf"
user=root
password=password
}
}

あとは、前回の仮に実装していたBooksRepositoryクラスからDBにアクセスするように実装を修正します。

def findAll(implicit executionContext: ExecutionContext):Future[List[Book]] = db.run(bookDao.findAll().result).map(_.toList)

def findById(id: Long)(implicit executionContext: ExecutionContext):Future[Book] = db.run{
(for {
b <- bookDao.books.filter(_.id === id)
a <- authorDao.authors.filter(_.id === b.authorId)
} yield (b, a)).result.head.transactionally
}.map(_.withAuthor)

これで、 ./activator run を実行して、 http://localhost:9000/api/books/1 にアクセスすると以下のJsonが帰ってきます。

{
id: 1,
title: "Programming in Scala",
author_id: 1
}

問題なく、MySQLにアクセスしてデータを取得できることが確認できました。

Slick3 + MySQLDriver + MariaDB

とりあえず、MySQLを利用できる状態になったので、まずはMySQLを利用する設定のまま、接続するDBをMariaDBに切り替えて動作確認をしてみます。

今回は、MariaDBの動作環境を手軽に用意するために、AWS RDS上でMariaDBを用意しました。
とりあえずの検証なので、 t2.microインスタンスを起動しました。

screenshot_1222_001

DBインスタンスの用意ができたら、あとは、application.con内の MySQLのurlを 立ち上げたMariaDBのurlに切り替えるだけです。

slick.dbs.default {
driver="slick.driver.MySQLDriver$"
db {
driver=com.mysql.jdbc.Driver
url="jdbc:mysql://bookshelf.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306/bookshelf"
user=root
password=password
}
}

これで、先ほどと同じく接続すると、ちゃんとjsonが取得出来ました。
GitHubのコミットはこちらです。

Slick3 + MariaDBDriver + MariaDB

いよいよ、MariaDBのドライバを使ってMariaDBに接続します。

最終的な変更はこちらです。

まず、MariaDBのJavaドライバを dependenciesに追加します。
MySQLのドライバは不要になります。

// "mysql" % "mysql-connector-java" % "5.1.36",
"org.mariadb.jdbc" % "mariadb-java-client" % "1.3.3",

これで、MariaDBのJavaドライバは用意出来たのですが、Slick3では、各DBの違いを吸収するために、各DBに対応したDriverクラスを用意しています。
たとえば、 MySQL用のドライバは、 slick.driver.MySQLDriver があります。
しかし、MariaDBについては、現時点では提供されていないので、自分で用意する必要があります。
幸い、MariaDBはMySQL互換なので、MySQLDriverをベースにMariaDBDriverを用意出来ました。

一旦、play-bookshelf内にパッケージを切って、MariaDBDriverを用意しましたが、近いうちに別プロジェクトに切り出そうと思います。
また、SlickのGitRepositoryを見ていると、次期バージョンでは、DriverクラスがProfileクラスに置き換わるようなので、その対応も進めるつもりです。

最後に、 application.conf の url設定を変更して、用意したMariaDBドライバを利用するよう変更します。

slick.dbs.default {
# driver="slick.driver.MySQLDriver$"
driver="slick.driver.MariaDBDriver$"
db {
# url="jdbc:mysql://bookshelf.xxxxxx.ap-northeast-1.rds.amazonaws.com:3306/bookshelf"
url="jdbc:mariadb://bookshelf.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com:3306/bookshelf"
user=root
password=password
numThreads = 10
connectionTimeout = 5000
validationTimeout = 5000
}
}

これで、動作確認をすると、エラーなくjsonが取得できます。

まとめ

AmazonAuroraは非常に魅力的なRDBですが、スケールに重きを置いたアーキテクチャのため、現状のシェアウィズのサービス規模では、導入のメリットがあまりありませんでした。
しかし、将来的にサービス規模が大きくなった時にAuroraに切り替えるという可能性はあります。
AmazonAuroraはMariaDBのドライバを利用することで、最大限に活用でき、MariaDB自体もMySQL互換で改良が加えられています。
その点を踏まえて、まずはMariaDBを ShareWisのアーキテクチャに組み込む検証を行いました。

採用情報

株式会社シェアウィズでは、新しいメンバーの募集を積極的に行っています。フルタイムの勤務から学生インターンまで、ご関心をお持ちの方はお気軽にコンタクトしてください!

採用ページへ

フォローする