構築中。

名古屋のITインフラお守り係です。ITイベントへの参加記録などを残していきます。

JJUG CCC 2018 Spring(5/26)

昨秋に続いて行ってきました。 www.java-users.jp f:id:hmatsu47:20180527221828j:plain

以下、気になったポイントと感想などを箇条書きします。

但し、聞いたセッションの数が多いので、すでにスライドが公開されているものについては内容に関する記述は少な目です。

マルチスレッド問題の特定と再現に頑張った話(Koji Linさん)

スライド: マルチスレッド問題の特定と再現に頑張った話

  • 昨秋に続いて朝一に聞くのはLinさんの話
  • Caffeineは自分でも使ってる(Qiitaの記事にも入れてる…意味不明すぎる内容なのでいいね・はてブ0)
  • ヒープダンプ大事
  • VisualVMちゃんと使ってないので使おう
  • 机上トレースとデバッグでの再現、大事
  • 英語でコミュニケーション取れるようにならねば(読めるけどまともに書けない)

Kotlin + Spring Bootでサーバー開発(soranakaさん)

スライド: Kotlin + Spring Bootでサーバー開発

  • 昨秋のエムスリー前原さんのセッションに引き続き、サーバーサイドKotlin & Spring Bootの話を聞く
  • 今の業務に利用できるか…ちょっと微妙なタイミングなのでしばらく個人的に追うだけにする
    • Javaのコードを書くのが遅いから生産性が低い」とは必ずしも言えない状態でもあり…

ざっくりわかった気になるモダンGC入門(tomoya yokotaさん)

スライド: introduction-to-modern-gc // Speaker Deck

  • Shenandoah GC、ZGCとも「世代型メモリ管理をしない」GC
    • ある種のパラダイムシフト?「秘伝のタレ」が腐るヤツかな?
  • ZGCは「Linux 64bit」「仮想メモリ」前提=対象を絞る
    • 課題解決にはこういう「思い切り」が大事だと思う
  • Epsilon GC(何もしないGC)はネタにされてたけどマジメなやつ(だと思う)
    • 別セッションのTweetで「サーバレスに使える」というのが流れてきたけれど、AWS Lambdaに限っていうと、連続的に呼び出しがあると初期化が入らないので途中で死にそう(1日1回程度の呼び出しなら対象コンテナが一旦落ちるので大丈夫だと思う)

LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで(萩原 豪さん)

スライド: LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで

  • akka Actor Modelの使い方(コードの書き方ではなくて考え方)が中心の話
    • 早朝に移動してきた関係で眠気がピークになってしまい、リアルタイムでは理解できなかったが公開スライドで概要を把握
    • かなり参考になる話だった(自社サイトが「そこまで必要」な状態に成長するかどうかは別として)
  • オマケ?でついてきたRedisクライアント(Lettus)の話が、朝一のLinさんの話につながる

JavaでインメモリSQLエンジンを作ってみた(毛利元彦さん)

スライド(5/29追記): JavaでインメモリSQLエンジンを作ってみた

  • BIツールで集計するときにOLAPエンジンと組み合わせて使うSQLエンジンをインメモリで自作した話
  • OLAPエンジンに組み合わせるSQLエンジン高速化が集計高速化のキモ
    • PostgreSQL比100%の高速化(1億レコード389ms vs 39751ms)
    • 最初「RDBでの集計」の話が出たとき、使うSQLとして挙がったのがSELECT SUM() / GROUP BY / WHEREだけで「あれ?Window関数は?」と疑問に思ったが、OLAPエンジンとの組み合わせで使うBIツールが前提の話だったので納得
  • インメモリSQLエンジンの高速化
    • 列指向
    • 更新系を捨てる(定期バッチで更新)
    • 参照系もBIに必要なものに絞る(sum、count、min、max(avgやめる)、group by、where)→可能な限りOLAPエンジン側で吸収
      • avgは「sum/count」で出せる(総計のavgも同じ式で行ける)
    • sumはBigIntegerを使わずlong(配列)で→桁が足りなくなるが、自前で繰り上がりサポート&桁数制限
    • マルチスレッド化
      • PostgreSQLでもパラレルクエリをサポートしたが(9.6では性能が伸びなかった模様)
    • 絞り込みでString(配列)を使うとカラム増で遅くなるので、intをうまく使う
  • 計測Tipsとして、線形ではなく指数的にリソースを増やしていくのがお勧め(問題があったときに見つけやすい)
    • 10万、100万、1000万、1億…
    • 10万、20万、40万、80万…
    • 10万、20万、50万、100万… など
  • このセッションでも「思い切り(による仕様の絞り込み)が大事」ということを学んだ
    • 「シンプルに」といいつつ「あれもほしい」「これもほしい」となりがちな雰囲気をなんとかせねば

JavaエンジニアのためのDocker入門 〜 仮想開発・テスト環境構築 〜(Abe Asami (きの子)さん)

スライド(5/29追記): JavaエンジニアのためのDocker入門 // Speaker Deck

  • 本当に「基礎からのDocker」の話
    • docker build / docker run / docker-compose などなど
  • イメージとコンテナはクラスとインスタンスの関係に近い
    • 冷凍チャーハンに例える話もあった
  • VSCodeのDocker拡張が便利
  • DBサーバなどデータを残したいものはコンテナ内に保管せずにホスト上のFSなどをマウント
  • サーバ時刻変えてテスト、複数バージョンミドルウェアでのテストなどに便利
  • まずはMy開発環境構築用から
  • Java 10からコンテナのリソース制限が正しく働くように(コンテナ上かどうかを判別できるように)なった
    • ちょうど先週聞いてきた話だった
  • はやく手を付けよう…

自分のDocker/K8s環境をタダで手に入れる ICP Community Editionで簡単構築(斎藤 和史さん / 田中 孝清さん)

スライド(後半): K8s-icp-capsmalt-jjugccc2018spring

  • 冒頭にタイムマシン採用の話(Webから2~3年遅れでSI / エンプラへ)
  • 本題はIBM Cloud Private(ICP)でのDocker / k8s利用の話
    • 開発用途なら無償のCommunity Editionを(ICP-ce)
  • 最初から色々入ってて便利
  • はやく手を付けよう…(本日2回目)
  • AdoptOpenJDKの宣伝も

JDBC APIもそろそろ非同期の波に乗りたいらしい(西川 彰広さん)

  • Tech Deep Diveでもお世話になっている西川さんのセッション
  • まだ決まった話ではない(議論中)
    • 毎月仕様が変わる状態
  • 現行JDBCは同期アクセス
    • AOT、コネクションプールが使えないとき、coherenceが高くて使えないときにツラい→非同期にしたい
  • 非同期:ADBA(AsynchronusなDB Access
    • まだどのバージョンから入るか決まってない
      • Java 11では無理
    • コンセプト段階
  • 現時点でのゴール
    • ユーザスレッドはノンブロッキング
    • 既存のJDBCの置き換えではない(並存)
    • スループットアプリケーションがターゲット
    • java.sqlを参照しない or 最小限にする
      • パッケージはjava.sql2、モジュールはjdk.adbaの予定(最初はincuvatorが付く)
    • Builder patternを使う
    • SQLを解釈しない
      • 個々のRDBMSの方言 / 固有機能に対応しない
  • CompletionStage & CompletableFutureをガンガン使う
  • ラムダ式対応 & fluent programming
  • 実行モデルはすべてOperation
    • Operationはグルーピング可能(発行順序の指定OK←デフォルト)
  • OracleMySQL 8.0のConnector/JでX DevAPIに対応して非同期アクセスができるようになったはずだけど、どちらを使うか悩ましい状態になりそうな予感

懇親会

  • 「回る寿司」を横目に「回ってない穴子」狙いで行ったので普通にゲット
    • しかしテーブルが空いていなくて会場を一周する羽目に
    • やっとたどりついた先でボランティアスタッフの方に声を掛けていただいて雑談→寿司以外の食料にもありつく(昨秋は位置取りに失敗して食べるものがなくなった)。ありがたや
  • LT面白い
    • でも新幹線の都合で残念ながら今年も中座

全体を通して

  • 一方通行ルールは一部把握できていない参加者もいたようだが、全体的には混乱もなく秩序が保たれた状態だったと思う
    • 帰って万歩計を見たら、8,000歩余り(昨秋よりやや少ない)でいい運動になった
  • 懇親会の「回る寿司」も「奪い合い」どころか「むしろ余る」事態に?
    • 事前アナウンスの効果?LINEさんの配慮で増量?
      • そもそも今回の参加者に最初から「乱暴者」がいなかった可能性も
    • 「緊急事態です」「お寿司がお寿司なので」「穴子穴子なので」という謎のアナウンス
  • 今度は忘れ物をせずに帰ることができた
    • 前回は上着を忘れた(ちゃんと保管されていて送っていただきました)
    • 西新宿駅の入口を通過せずにまっすぐ帰ることもできた
      • 焦って反対方向の電車に乗ることもなかった
  • 時間帯が被って諦めたセッションのスライドが早い段階で公開されたので助かった

今回も十分楽しめました。

スタッフ・登壇者はじめ関係者の皆様、ありがとうございました!

Oracle MySQL Innovation Day 2018 Tokyo(5/23)

先週のJava Day Tokyoに引き続き、Oracle絡みのイベントです。

※東京のイベント告知&申込ページは既にリンクを外されているようなので、ここにリンクは付けません。

f:id:hmatsu47:20180524230142j:plain

※↑SNSで公開されていましたが、マズそうなら引っ込めます。

また、いつものように気になったポイントと感想などを中心に箇条書きします。長丁場で通訳のレシーバに混信があったせいもあり、勘違いもあると思います。

※公開資料はこちらで確認してください。

MySQL :: 資料ダウンロード

Keynote: MySQL | State of the Dolphin / What's new in MySQL 8.0(稲垣 大助さん)

  • 全体の概要
  • Mobile First / Developer First / Data Driven / 24x7
  • 機能強化について
  • utf8mb4デフォルト化
    • utf8mb4でMySQL 5.7より40%高速化
  • 性能 16x
  • MySQL MLE:GraalVM in MySQL 8
    • 最初はJSだけ
  • トランザクショナルなデータ・ディクショナリ
  • セキュリティ強化
    • ROLE(ROLES_GRAPHML関数) / パスワード強化 / キャッシュ付きSHA-256 / 暗号化(テーブルスペース & REDO / UNDOログ)
  • バージョンアップ
    • アップグレードチェッカー / Shellのユーティリティ(JS / Python) / Manual 2.11.1.1参照
  • InnoDB Cluster
  • Enterprise Edition
    • Enterprise Monitor 4.0(UI改善 / NDB CLusterサポート強化 / 日本語対応改善)
  • このキーノートを聞いただけで全体の把握は可能

MySQL 8.0: What’s new in the Optimizer(Manyi Luさん)

  • CTE(再帰 / 非再帰)とWindow関数
  • 文字コードと照合順序
    • sijs、eucjpなどを使ってる人手挙げて!
  • JSON
    • SELECT(参照)用に最適化
    • JSON_TABLE以外の関数を5.7にもバックポート
    • INDEX作成可
  • 不可視INDEX
  • メモリバッファ(バッファプール)を意識したコスト見積もり
  • ヒストグラム(値の分布)
    • JOINの例
  • JSON_TABLE関数では実行時に一時テーブルを作る
  • CTE / Window関数 / コスト見積もり / ヒストグラムについては自分でも試して記事化した(後述)

MySQL Enterprise Security & Regulatory Compliance(Mike Frankさん)

  • GDPR / PCI(-DSS) / HIPAAなどへの対応
    • 具体的なセキュリティ管理手法はGDPRに規定されていないが、4つのコア領域(アセスメント / 防止 / 検出 / 復旧)がある
  • MySQLが提供しているもの
    • 製品 / 特徴(Feature) / ベストプラクティス / ホワイトペーパー / 技術資料
  • 3rd party製品との統合・連携
  • Enterprise Security Architecture
    • 暗号化(通信 / データの透過的暗号化)
    • 認証(台数多い場合、統合化)
    • Thread Pool(可用性確保)
    • Workbench(セキュリティ評価機能あり) / Enterprise Monitor(アラートを出せる)
    • LDAPなど認証 / 認可の連携
    • Enterprise Backup
    • Enterprise Firewall
    • KMIP(鍵管理)
  • ROLE
  • AtomicなACLステートメント
  • OpenSSLにダイナミックリンク(MySQLのアップグレードなしでパッチ適用可能)
  • FIPSモジュールサポート(ハードウェア)
  • パスワードポリシー設定
  • キャッシュ付きSHA-256(高速性を保ちつつハッシュ強化)
  • データのマスキング
  • 透過的暗号化とヒストグラム(前述)の併用、RC時点でNGだったので試してみたらやっぱりNGだった
mysql> USE sample_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+---------------------+
| Tables_in_sample_db |
+---------------------+
| sample_tbl          |
+---------------------+
1 row in set (0.00 sec)

mysql> show create table sample_table\G
ERROR 1146 (42S02): Table 'sample_db.sample_table' doesn't exist
mysql> show create table sample_tbl\G
*************************** 1. row ***************************
       Table: sample_tbl
Create Table: CREATE TABLE `sample_tbl` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `value` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ENCRYPTION='Y'
1 row in set (0.00 sec)

mysql> select count(*) from sample_tbl;
+----------+
| count(*) |
+----------+
|        4 |
+----------+
1 row in set (0.00 sec)

mysql> ANALYZE TABLE sample_tbl UPDATE HISTOGRAM ON value WITH 10 BUCKETS;
+----------------------+-----------+----------+------------------------------------------------------------+
| Table                | Op        | Msg_type | Msg_text                                                   |
+----------------------+-----------+----------+------------------------------------------------------------+
| sample_db.sample_tbl | histogram | Error    | Cannot create histogram statistics for an encrypted table. |
+----------------------+-----------+----------+------------------------------------------------------------+
1 row in set (0.00 sec)
  • 暗号鍵管理は重要、でもどれだけ意識されてる?
    • PCI-DSS対応なら嫌でもやらなきゃいけないけど
  • mysqldump / pumpの出力先などとして使うファイルシステムの暗号化を忘れてると意味がなかったり
    • ツールでbinlogから一部を抜き出してうっかり非暗号化領域に置いたりとか

昼食

  • 今半のすき焼弁当(うまかった)
  • アンケート項目あり

Voice from customers and community(浜平 仁さん、とみた まさひろさん、yoku0825さん)

  • 事情により1つ目は紹介NG
  • とみたさん、utf8(utf8mb3)とGAでのパラメータ初期値の変化へのツッコミと、utf8mb4での照合順序の注意点など(JIS順とか渋い)
  • yokuさん、罠について語る(--innodb-log-write-max-size=-1で無限に落ち続けるなど)
    • 罠以外にも「events_errors_summary_by_account_by_errorでアカウントまでアタリを付けて監視できるの便利」など

MySQL Analytics Service(Nipun Agarwalさん)

  • MySQLをベースとした大規模データ分析サービスへの取り組みの話
  • Labsなので提供時期未定
  • 略称:RAPID
  • インメモリ / 1TB超え / 電力性能比を考えスケールアップ&スケールアウトのハイブリッド型に
    • 単一RAPIDノードで15x以上の電力性能比 / 8ノードで27x / 512ノードまでスケールを確認(もっと行ける)
  • パーティション指向
  • 計算と通信をオーバーラップして処理(時間短縮)
  • SQL分析への汎用化
  • MySQLリアルタイム分析クラウドサービス向けに開発
  • Redshiftとの比較(リアルタイム分析できる、など)
  • Machine Learningを活用(自律型)
  • 意見ちょうだい
  • 話だけ聞いてるとOracle(Datadase)での取り組みと似通っている気がするが、Oracle梶山さんによると「全くの別物」

Developing Applications with MySQL Document Store & NodeJS(Frederic Descamps)

  • ブログ等でお馴染みのlefredさん
  • JSON型でスキーマレス(高速な初期開発 / 手間削減 / 非リレーショナルモデル / ORM使わない場合)
    • ORMはDBAの敵!
  • RDBMS と NoSQLの片方だけを選択する必要はない
  • 1GBまでのDocumentに対応可能(MongoDBは16MBまで)
  • SQLは必須ではない
  • X DevAPI Connectorが必要
  • MySQL Shell
  • MongoDBからのマイグレーション
    • プログラムなしでデータを引き出せる
  • 強み:ACID準拠!
  • さすがにこのあたりから疲れてきた…

MySQL 8.0: What’s New in Replication(Luis Soaresさん)

  • From ポルトガル
  • レプリケーション機能の多くは5.7にバックポート
  • 急成長するWebでのスケールアップ / ダウンの文脈で説明
  • binlogは他の技術との連携にも使える(Hadoop、Kafka、Solr等)
  • マルチソースレプリケーションはDB統合に使える
  • 障害発生時等のPrimary選択は以前はランダムだった→ルール化された
  • 処理が追い付かないときのフローコントロール
    • 「なにその忖度機能」(参加者の感想)
  • モニタリングはマイクロ秒の精度
  • 高速リカバリ

MySQL 8.0: InnoDB Cluster(Frederic Descampsさん)

  • Group Replication
    • 1st commitがとにかく勝つアルゴリズム
    • Paxosベース
      • Paxos:分散システム全体にメッセージを配信する
      • マニュアルフェイルオーバ不要に
    • クラッシュ、失敗、再接続等を自動処理
  • MySQL Router
    • L4ルーティング
  • ProxySQLとも協力
  • MySQL Shell
  • 5.7と比べてもより簡単に

Q&A

  • Routerの配置場所について
    • 基本はWebサーバなどと同居
    • Webサーバ同居だと台数が増えてしまうが、ライセンス料の節約方法は
      • Community版をうまく使って!
      • ん?MySQL商用版って、「連携がある範囲全体のライセンスを買わないといけない」んじゃなかったっけ?
      • 変わったのかな?それとも「Routerは別製品」扱いでいいの?
      • InnoDB Clusterの主要コンポーネントなのに
  • Group ReplicationでXAは?
    • サポートしてる
  • Group Replicationで多段レプリケーションは?
  • 8.0の品質はいかほど?
    • 某B社やF社なんかはGA前から一部で使ってるよ!
  • CHECK制約、エラーにならないのに効かないんですけど…
    • そういう仕様
    • でもCHECK制約サポートはロードマップに入ってる
  • 透過的暗号化とヒストグラムの併用は?
  • 「GAとは」に対し「継続的リリースモデルですから」
  • InnoDB Clusterでは「小さなトランザクション」を推奨しないの?
    • マルチマスタならその通り
    • シングルマスタならあまり気にしなくて良い

その他

  • スクリーン前に巨大Sakila(イルカ)のぬいぐるみが鎮座し、会場後方からの視界を遮る罠
    • 休憩中に(プロジェクタのすぐ横の席にいた)某氏がプロジェクターの向きを調整していたOracle山﨑さんに「本当はココ(Sakilaが置いてある場所)にプロジェクタを置くんですよね」と指摘するも、山﨑さんスルー
  • みんながSakilaの「ORACLE面」の写真を撮ろうとするとなぜかOracleの方々はしきりに「そっちじゃない」「反対」だと
  • アンケートと引き換えのおみやげはMySQL 8.0 Tシャツ
    • Mサイズだったけど、人を見て渡してる?見てない?(私はMサイズで着れるが無理な人は…?)
  • 初めて参加したので知らなかったが、Java Day Tokyoのような物販はなかった
  • 「意地でもPaxosを使わない」AWSに対し、Oracleは「使えるものは遣う」スタンス?
  • 某所で噂されていた「重大発表」はなかった模様
  • MySQL 8.0の新機能については事前に色々試していたので大体知ってた
    • Oracleよりもむしろyokuさんの話のほうが初見
    • なお、書いた記事は以下を参照

hmatsu47.hatenablog.com hmatsu47.hatenablog.com

Java Day Tokyo 2018(5/17)その2

その1の続きです。 hmatsu47.hatenablog.com

Java EE 利用者のための Java EE 8 以降の世界に向けての歩き方(柳原 伸弥さん)

  • 過去(Java EE 8既リリース分含む)の話がメインだったので、開始10分くらいで「セッション選択間違えた」と気づく
    • 内容はよくまとまっていて悪くなかった。自分の選択ミス(富士通の数村さんのとか面白そうだった)
    • 通路を挟んで反対側の人も同じ気持ちだったのか単に時間切れだったのか不明だが途中で去って行かれた
  • Oracleサポート契約してるユーザの現在地はJava EE 5(一部だけEE 6化)がほとんどとのこと
    • だからEE 7化も「未来の話」なのか
    • EE 8は「未来」のところがほとんどだろうけれど
  • 基本的には、一つ前に聞いた話を、非エンジニア(だけどエンジニアをまとめる管理職 or 経営層…最低限の知識はある人)向けに、コード部分を省いて丁寧に説明した話

Java SE 10、そしてJava SE 11への移行ガイド(櫻庭 祐一さん)

  • スライドはこちら(正しい内容はスライドを確認して!)

Migration Guide to Java SE 10, and also Java SE 11

  • 「モジュール化したい人手を挙げて!」「はい、モジュール化なんてしなくていいです。ほとんどの人には今は必要ないです」
  • (大規模なものの)「いきなりSE 11」は相当厳しい
  • 古いJigsawの情報は信用するべからず(かなり変わった)
  • Deprecated、大抵の人は概ね無視する
    • これまでは「やるやる詐欺」?
    • 今回は本当になくなる(12から本格的に)
      • 「forRemoval = true」のヤツは特に気をつけろ!
    • JDK内部API(sun.XXX、com.sun.XXXとか)は触れなくなる
      • Java 10で実行すると「表示不可」エラー…(エラーの意味がわからん)
  • 削除されたヤツらの回避策、いくつかある
    • 詳しくはWeb、じゃなくて上のスライドで
    • いつまで使えるかわからないので注意
    • 個人的には社内に教えたくない(よほど理解がある経営者/管理職がいないと、一時回避策を使うのは大失敗する)
  • Java EEJakarta EEに移行するのに絡んで、Java SE内にあるEEのサブセット達もなくなる(なくなった)から注意
  • 依存関係調査にはjdeps
  • Java 9以降、当面クラスパスとモジュールパスを併用しないといけない
  • さすがプロの話芸(芸人違う)

Performance tuning with poor tools and cheap drink(Kirk Pepperdineさん)

  • なぜかMSの寺田さんも壇上に!?
  • パフォーマンス問題発生でTiger Team発足(色々な切り口で)→責任の押し付け合いが始まる
  • 推測を使ってしまうのは、測定できないから
  • JPDM = A Java Performance Diagnostic Model
    • パフォーマンスの診断モデル
    • システムが複雑な場合、モデルを使うと便利
    • でもモデルを使うと複雑性を排除してしまう分結果の信憑性が怪しくなる
  • コード:抽象的→パフォーマンスの問題は直接見えない(コードからは)
  • ハードウェア:現実のもの→パフォーマンス問題は現実にはここで生じる。CPU含む
  • 先に事実が分かっている=あらかじめ判断できる
  • パフォーマンスへの支配的影響力はどこが握っている?
    • 攻撃的なものと受動的なものがある(他の影響を受けて…)
    • Idleの時間に意識を払うべし
  • GitHubにThread Dump Analyzerが上がってる(使ってみよう)
  • GCログから見つかる問題点:GCそのものではなく仮想基盤等の問題が見つかるケースが多い
  • デモでパフォーマンス問題の原因発見と解消を実演
    • 「system支配かuser支配か」と「アプリケーションかOSか」がごっちゃになると変なことに(後で考えれば当たり前のことでも)
  • 通訳が大変そうだった

用事があったので、私はここで帰りました。

Ask the Experts!も面白そうだったのですが(公式サイトでは、終わった今でも「調整中」のまま!?)。