Upload
yoku0825
View
736
Download
2
Embed Size (px)
Citation preview
MySQL 5.7の次のMySQL 8.0はどんなものになるだろうMySQL先⽣の次回作はおそらく4⽉中旬
2017/03/10
yoku0825OSC 2017 Tokyo/Spring
\こんにちは/
yoku0825@とある企業のDBAオラクれない-ポスグれない-マイエスキューエる-
⽣息域Twitter: @yoku0825-Blog: ⽇々の覚書-MyNA ML: ⽇本MySQLユーザ会-MySQL Casualʼs Slack: MySQL Casual-
1/60
このスライドのゴール
MySQL 8.0に興味のある⼈を増やす今からMySQL 8.0にワクワクしてもらう
2/60
このスライドに記載された⾒解は個⼈の意⾒であり、所属する組織または所属しない組織またはNULLの意⾒を ⼀切 代表するわけがありません
3/60
MySQL 8.0に⾄るまでのみちのり
< MySQL 5.1MySQL 5.1MySQL 5.5MySQL 5.6MySQL 5.7MySQL 8.0
4/60
< MySQL 5.1
もうやめて俺のライフはゼロよ
5/60
MySQL 5.1
パーティション⾏ベースレプリケーション( binlog_format )ストレージエンジンプラグインAPIイベントスケジューラーテーブル形式ロギング
6/60
MySQL 5.5
認証プラグインInnoDBのデフォルトストレージエンジン化準同期レプリケーションプラグインutf8mb4の導⼊
7/60
MySQL 5.6
InnoDB FTS, InnoDB GISInnoDBオンラインALTER TABLEInnoDB Memcached Pluginperformance̲schemaの強化GTIDの導⼊DATETIME型のマイクロ秒対応マルチスレッドスレーブクラッシュセーフスレーブ
8/60
MySQL 5.7(1)
アカウント管理の強化暗黙のテンポラリーテーブルのInnoDB化⽇本語対応InnoDB FTS, InnoDB GISの空間インデックスサポートInnoDBバッファプールオンラインリサイズInnoDBテーブルスペース暗号化JSONデータ型, JSON関数
9/60
MySQL 5.7(2)
Generated Column(式インデックス的な)マルチソースレプリケーションGTIDのオンライン有効化MySQL X ProtocolGroup Replicationオプティマイザーヒント構⽂のサポート
10/60
MySQL 8.0(1)
mysql スキーマのMyISAM撲滅ロールのサポートutf8mb4 がUnicode 9.0.0ベースの照合順序をサポート( utf8mb4_*_ai_ci の誕⽣)utf8mb4_unicode_900_ai_ci のデフォルト化SET PERSIST / RESET PERSIST 構⽂のサポートInnoDBデータディクショナリー( *.frm ファイルがなくなる)
11/60
MySQL 8.0(2)
column̲statsのサポートパーティションストレージエンジンの削除(InnoDBネイティブパーティション)降順インデックス( KEY idx̲name ( column̲name DESC ) )のサポート共通テーブル式(CTE)のサポート(WITH / WITH RECURSIVE 句)SELECT .. NOWAIT , SELECT .. SKIP LOCKED 構⽂のサポートInnoDBログ、InnoDB UNDOスペースの暗号化Window Function ︕︖ (未実装)
12/60
MySQL 8.0(3)
InnoDBのAUTO̲INCREMENTがInnoDBログに記録されるようにINFORMATION̲SCHEMA.INNODB̲CACHED̲INDEXESSET GTID_PURGED ="+gtid_set" 構⽂のサポートRBRの進捗状況をperformance̲schemaで確認可能に変な構⽂でカラム名エイリアスがつけられるようになった( SELECT * FROM (SELECT 1, 2, 3, 4) AS dt (a, b, c, d); )さよなら mysql̲install̲dbINNODB̲LOCKS, INNODB̲LOCK̲WAITS が information̲schemaからperformance̲schemaへ移動
13/60
参考
MySQL :: MySQL 8.0 Release NotesMySQL :: MySQL 8.0 Reference Manual :: 1.5 Server and Status Variables and Options Added, Deprecated, or Removed in MySQL 8.0
14/60
増えるわ増える
15/60
イマココ
5.1
5.1 5.5 5.6 5.7
5.1, 5.2, 5.3 5.5 10.0 10.1 10.2
5.5 5.6 5.7 8.0
Percona Server
MySQL
MariaDB
16/60
ツギココ
5.1
5.1 5.5 5.6 5.7
5.1, 5.2, 5.3 5.5 10.0 10.1 10.2
5.5 5.6 5.7 8.0
Percona Server
MySQL
MariaDB
17/60
ちょっと思うこと
MariaDBは10.0の時に「MySQL 5.6のリリースは待っていられない。MariaDB 5.5をベースにMySQL 5.6の機能を バックポート したMariaDB 10.0を開発する︕」と⾔って分岐
それ以来、MariaDB 10.1 も MariaDB 10.0 ベースで MySQL 5.7の機能をバックポート/再インポートしてる
-
MySQL 5.6とそれ以降に開発された機能と(名前は同じだけど)実装が違う機能がいくつか(GTID, Multi Source Replication, Data At Rest Encryption, ..)
18/60
ちょっと思うこと
MariaDB 10.2では binlog_format=MIXED がデフォルトになったし(MySQL < 5.7はSTATEMENT, 5.7以降はROW)そろそろDBAの目に⾒える範囲で互換性がなくなってきている
10.0くらいまではプラグインとかゴニョる⼈には⾒えたけどDBAには⾒えない程度の非互換だった
-
MySQLプロトコルレベルでの互換性はあるのでまだそこの⼼配はいらないけど
-
19/60
⾯⽩いこと
Window FunctionはMariaDB 10.2で⼊れてきた(あるいは、MariaDB Column Store(新⽣InfiniDB))ものに対抗して後から⾔い始めてる
CTEもMariaDB 10.2の⽅が先だった気がする-
Data At Rest Encryptionが実装された後にInnoDB暗号化が追いかけて実装されたログファイル、UNDOファイルの暗号化もMariaDBが先⾏-
MariaDBが先⾏実装する、MySQLが ムキになって それを追いかける
⇒ 機能が増えて 俺が みんなが楽しい-Multi Source Replicationもそうだったな-
20/60
閑話休題21/60
切り⼝その1
NoSQL APIこの場合のNoSQLは「mysqldがMySQLプロトコル(とその上に乗っかるSQL)以外でしゃべる」という意味実はOracle MySQLは5.6(4年以上前)からNoSQL APIに開発リソースを割いている
22/60
MySQL de NoSQLの歴史
InnoDB API
Handler API
Executor
Optimizer
Parser
MySQL Protocol HS Protocol
HS Plugin
memcached Protocol
InnoDB Memcached
HTTP/MySQL X
23/60
HandlerSocket Plugin
MySQL 5.5〜5.6MySQL 5.7はサポートされていないSQLのパース、オプティマイザーをかっ⾶ばせばCPUコスト削減できるMySQLプロトコルでない軽量プロトコルにすることで転送量を抑える
24/60
InnoDB Memcached Plugin
MySQL 5.6〜基本的な⽅向性はHandlerSocketといっしょより⼀般的なmemcachedプロトコルを選んだところまでは良かったもののちなみに、MySQL Clusterにもmemcached NDB engineというmemcachedをしゃべるプラグイン(︖)があるRDSでサポートされている唯⼀のMySQL de NoSQLインターフェース
25/60
MySQL HTTP Plugin
ラボ版MySQL 5.7のみたぶんもう開発されない考え⽅としては「かっ⾶ばして⾼速化/軽量化」ではなく、「HTTPをしゃべれる全てのライブラリーがデータベースのクライアントになれる」ってことのような気がするちなみにMySQL Clusterにもmod̲ndbというHTTPをしゃべるプラグイン(︖)がある
26/60
MySQL HTTP Pugin(lab)
$ mysql -e "SELECT * FROM myhttp.simple"+----+------------------+| id | col_a |+----+------------------+| 1 | Hello || 2 | || 3 | world! || 4 | yoku0825 is here |+----+------------------+
$ curl --user a:b "127.0.0.1:8080/sql/myhttp/SELECT+%2A+FROM+simple"[{"meta":[ {"type":3,"catalog":"def","database":"myhttp","table":"simple","org_table":"simple","column":"id","org_column":"id","charset":63,"length":11,"flags":16899,"decimals":0}, {"type":253,"catalog":"def","database":"myhttp","table":"simple","org_table":"simple","column":"col_a","org_column":"col_a","charset":33,"length":765,"flags":0,"decimals":0}],"data":[ ["1","Hello"], ["2"," "], ["3","world!"], ["4","yoku0825 is here"]],"status":[{"server_status":34,"warning_count":0}]}]
27/60
SQLインジェクション #とはなんだったのか
みたいなところが好き28/60
MySQL de NoSQLの歴史
InnoDB API
Handler API
Executor
Optimizer
Parser
MySQL Protocol HS Protocol
HS Plugin
memcached Protocol
InnoDB Memcached
HTTP/MySQL X
29/60
MySQL X (X protocol)
MySQL 5.7.12〜 (GA #とは)JSONデータ型、JSON関数群と若⼲の兼ね合いアリそれらと合わせて「MySQL Document Store」という概念で売り込みたいらしい
-
SQLパーサーをかっ⾶ばさない系なのでgeneral̲logやスローログやbinlogに影響を及ぼさない-
サーバー側の「MySQL X」、クライアント側の「MySQL Shell」または「X Dev API」で対になっている
30/60
MySQL Document Store
ドキュメントDBライクなデータ操作JSONデータ型-クライアントライブラリーにそれっぽいインターフェイスを追加(X Dev API)
-
可変⻑なドキュメントの転送に相性の良さそうな新プロトコル(Xプロトコル)
-
XプロトコルをしゃべれてX Dev APIを使えるクライアントとしてのMySQL Shell
31/60
X Protocol周り
MySQL Shell
Python JavaScript SQL
X Protocol MySQL Protocol
MySQL X (X Plugin) Native Protocol Parser
Connector/Python
32/60
MySQL de NoSQLの嬉しいこと
InnoDBのトランザクション性能をそのままにMySQLプロトコル以外の⽅法でアクセスできる
memcachedプロトコルはアリだと思うけど、独⾃プロトコルのMySQL Xはちょっとつらくない︖それならむしろMySQL HTTP Pluginの⽅が筋は良いように思える
-
プロトコルを刷新することで非同期クライアントの実装もしたいっぽい(X Dev API)ちなみに “Cross(X)over between relational and document model” で MySQL X らしい
-
33/60
非同期クライアント構想 in MySQL X(未実装)
http://mysqlserverteam.com/mysql-5-7-12-part-2-improving-the-mysql-protocol/
34/60
ここまでが1つ
35/60
切り⼝その2
SQL⽅⾯⾼速化新しい構⽂運⽤関連レプリケーション関連
36/60
SQLアクセスの⾼速化
5.6, 5.7, 8.0と続くオプティマイザーの強化JOIN時の⾒積もり精度向上-ORDER BY狙いのキー精度向上-ヒストグラムのサポート(8.0)-バッファプールに載っているかどうかでオプティマイザーコストを動的に判定(未実装)これは5.7の時から計画だけはあった
-
オプティマイザーの機能強化は透過的に(何も意識せずに)性能を上げてくれる
37/60
新しい構⽂(1)
共通テーブル式(CTE)のサポート(WITH / WITH RECURSIVE 句)(8.0)
derivedテーブル(FROM句サブクエリー)の機能を使って実装されている
-
5.7で暗黙のテンポラリーテーブルのInnoDB化を頑張ったから実現した ︖
-
ロールとデフォルトロールの追加(8.0)構⽂としては新しい SET ROLE, CREATE ROLE などなど-ログインユーザーに権限をプラスする感じ-
38/60
新しい構⽂(2)
降順インデックス( KEY idx̲name ( column̲name DESC ) )のサポートSELECT .. NOWAIT , SELECT .. SKIP LOCKED 構⽂のサポート
SELECT .. FOR UPDATE NOWAIT ⇒ ロック待ちせずに即アボート-SELECT .. FOR UPDATE SKIP LOCKED ⇒ ロックを取れなかった⾏は取らずに、取れた⾏だけロックと結果を返却
キューっぽいテーブルにいいんじゃない︖ ってドキュメントに書いてあった
-
Window Function ︕︖ (未実装)https://www.slideshare.net/DagHWanvik/sql-window-functions-for-mysql
-
39/60
運⽤関連(1)
performance̲schemaの⼤幅な機能強化(5.6)5.5では(MySQLの)開発者専⽤みたいな機能だったのが-フツーにDBAが使える程度の機能として充実-メモリー関連の統計情報も(オーバーヘッドでかいけど)取れるようになった(5.7)
-
p̲sを更に⾒やすく集約する sys の追加(5.7)-
information̲schemaのInnoDB関連テーブルの強化(5.6)SHOW ENGINE INNODB STATUS のステータスカウンターはほぼすべて INNODB_METRICS で参照可能に(5.6)
-
INNODB_BUFFER_PAGE , INNODB_BUFFER_PAGE_LRU でバッファプールの中⾝を覗けるように(5.6)
-
40/60
運⽤関連(2)
オプティマイザートレースの追加(5.6)InnoDBログのリサイズが楽になった(5.6)各種オンライン操作の範囲拡⼤(5.7)SET PERSIST / RESET PERSIST 構⽂のサポート(8.0)InnoDBデータディクショナリー( *.frm ファイルがなくなる)(8.0)InnoDBのAUTO̲INCREMENTがInnoDBログに記録されるように(8.0)
ROLLBACKでAUTO̲INCREMENTが⻭抜けになる件のこと ではない-
41/60
レプリケーション関連(1)
5.6, 5.7と (特に準同期) レプリケーションのスループットをとにかく上げようとしてきたバイナリーログのグループコミット(5.6)
Bug#70669のFixでロック粒度がすごくでかい(5.6)5.7でロックを分割し、スループットを向上させた
-
マルチスレッドスレーブ(5.6)5.7ではバイナリーログのマスターでのグループコミット状況に合わせたパラレル化が可能に(いわゆるスキーマ内マルチスレッドスレーブ)
-
42/60
レプリケーション関連(2)
master̲info, relay̲log̲info のInnoDB化リレーログから取り出したイベントとrelay̲log̲infoを “1つのトランザクションとしてコミット” し、 “コミットされていないリレーログはSQLスレッドが⽌まったら全部消す” ことでクラッシュセーフスレーブを構成可能(5.6)
-
テーブル化することで複数の構造を容易に保存できるようになり、マルチソースレプリケーションが実現(5.7)
-
GTID関連の使い勝⼿向上オンラインでGTIDの有効化(5.7)-SET GTID_PURGED ="+gtid_set" 構⽂のサポート(8.0)-
レプリケーション関連ステータスのperformance̲schemaへのポート(5.7)
5.7では SHOW SLAVE STATUS を完全に置き換えることはできなかったので8.0に期待
-43/60
SQLの強化とは
つまり「できること」の強化SQLの表現⼒が増えて今まで「MySQLにできなかったこと」が少しずつ増えていく(といいな)
-
なんだかんだ⾔ってもMySQLへのアクセスは当然SQLが⼤多数ここがスピードアップことは全てのユーザーにメリットをもたらす-
RDBMSにとってのSQLはデータの問い合わせだけでなく「管理機能のインターフェイス」でもあるシェルレス運⽤が捗りそうな SET PERSIST 構⽂はSUPER権限が必要なのでRDSでは使えないかもなあ。。
-
44/60
ここまでで2つ
45/60
切り⼝その3
InnoDB関連機能, 性能の向上はもちろんだけどMySQL 8.0.0時点での⼤きな⽅向性
46/60
InnoDB単体での強化(1)
Fast Index Creation(5.1 Plugin)デフォルトストレージエンジン化(5.5)バッファプールウォームアップ(5.6)オンラインALTER TABLE(5.6)FTS, GISのサポート(5.6)「MyISAMにしかできないことをなくす」(5.6〜)-
47/60
InnoDB単体での強化(2)
バッファプールオンラインリサイズ(5.7)ロックの分割によるスケーラビリティーの向上(5.7)テーブルスペース暗号化(5.7)REDOログ, UNDOログ暗号化(8.0)
48/60
Good-bye MyISAM?
5.1の時点から既に新機能の開発は⽌まっている5.6のキーワード「MyISAMにできることはInnoDBにもできるようにする」「MyISAMでだけできることはなくす」5.7では暗黙のテンポラリーテーブルまでInnoDB化テンポラリーということは-クラッシュしたら消えるということで-ってことはREDOログ (暗黙のテンポラリーテーブルならUNDOログも) いらないじゃん︖ という最適化
-
そして8.0.0では本丸の mysql スキーマが全てInnoDBに
49/60
Hello, Dictator InnoDB
今まで プラガブルだったからできなかったこと を実現していくデータディクショナリーを .ibd ファイルのヘッダに載せることで、InnoDBの耐久性をテーブル定義情報にも適⽤MyISAMの都合を考えずに特化した結果に得られそうなもの
(予定) バッファプールに載ってるかどうかでオプティマイザーコストを打ち分けられるオプティマイザー
-
(予定) ネイティブパーティショニング (これ⾃体は実装済み) による外部キー制約の撤廃
-
(噂) ページ内パーシャルアップデート(JSONデータ型だけ︖)-
50/60
The Others..
MySQLサーバー以外のプロダクトMySQL InnoDB Cluster-MySQL Docker-R.I.P. MySQL Fabric-
51/60
MySQL InnoDB Cluster
MySQL Group Replicationちょっと強い相互準同期レプリケーションを実現するプラグイン(5.7)-ちょっと強い準同期 = 独⾃リレーログを送ってコンフリクトしないかどうかの判定まで
-
コンフリクトしないことまでは即時保証だけど適⽤が終了するのは非同期
-
グループレプリケーション内で相互に更新をやり取りするのでマルチマスター構成が可能
-
52/60
MySQL InnoDB Cluster
MySQL Routerグループレプリケーションのメンバー情報を問い合わせてキャッシュ-キャッシュに沿って⽣きているサーバーにコネクションをルーティングコネクションのルーティングであってトランザクションの再開とかはできない
-
53/60
MySQL InnoDB Cluster
MySQL Shellグループレプリケーションのオーケストレーターインターフェイス-メンバーの追加, 削除, ステータス…だったりを管理-コイツがいなくても別にクラスターの稼働に問題はない-
54/60
MySQL InnoDB Cluster
55/60
MySQL InnoDB Cluster
「ちょっと強い準同期」なので、書き込み性能は落ちるシャーディング⽤途というよりは、お⼿軽簡単マルチマスター構成のニーズに対応するものらしいInnoDBストレージエンジンなので、NDBCLUSTERほどピーキーじゃない(はず)類似製品にGalera Cluster for MySQL, MariaDB Galera Cluster, Percona XtraDB Cluster
56/60
MySQL Docker
そもそもMySQL公式のyumやaptリポジトリーができたのが割と最近のような気がするけれども時代の流れに乗っかってDockerリポジトリーも作ってる
https://hub.docker.com/̲/mysql/ はDocker社オフィシャルのMySQLリポジトリ
-
https://hub.docker.com/r/mysql/mysql-server/ がOracle MySQLオフィシャルのリポジトリ
-
ややこしい-
調⼦に乗って⾊々作ってくれるのはいいこと
57/60
R.I.P. MySQL Fabric
MySQL Fabric support was removed.
MySQL :: MySQL Router Release Notes :: Changes in MySQL Router 2.1.2 (2017-03-06, Release Candidate)
58/60
まとめ
3つの切り⼝NoSQL API-SQLの機能強化-InnoDBの機能強化-
周辺製品の事情MySQL InnoDB Cluster-
59/60
Questions and/or
Suggestions?60/60