GitHub、1200台以上のMySQL 5.7を8.0へアップグレード。サービス無停止のまま成功させる GitHubが提供するGitHub.comは、世界最大のソースコード管理システムを始めとするソフトウェア開発者向け支援サービスを提供しています。 そのGitHub.comはRuby on Railsで構築されており、同社はつねにRubyとRuby on Railsをアップデートし続けていることを今年(2023年)4月に明らかにしています。 参考:GitHubは200万行規模のRailsアプリケーションであり、毎週RailsとRubyを最新版にアップデートし続けている そして同社はこのGitHub.comを支える1200台以上のMySQL 5.7を、GitHub.comのサービスレベルを維持したまま1年以上かけてMySQL 8.0にアップグレードしたことをブログで明らかにしました。 Up
バックエンドエンジニアの徳富(@yannKazu1)です。先日、メドピアのメインサービスであるmedpeer.jpで使われているデータベースエンジンを、MySQLからAurora MySQLへと移行しました。今回はその移行のプロセスについて詳しくお話しします。 移行したデータベースの簡単なインフラ構成 移行方針 今回移行するデータベースは複数のアプリケーションから参照されており、ダウンタイムによるユーザー影響が大きいため、移行方針の検討の段階で重視したのは、ダウンタイムの最小化でした。これを達成するために、DNSのCNAMEレコードと、Auroraのリードレプリカを活用し、移行させることにしました。 DNSのCNAMEレコードの使用 データベースエンドポイントをアプリケーションに直接記述する代わりに、DNSのCNAMEレコードを利用して間接的に参照するようにしました。これにより、データベー
この記事はエムスリー Advent Calendar 2022の30日目の記事です。 前日は id:kijuky による チームメンバーのGoogleカレンダーの休暇予定一覧をスプレッドシート+GASで作った でした。 AI・機械学習チームの北川(@kitagry)です。 今回はMySQLへのインサートを20倍以上高速化した話について書きます。 仕事をちゃんとしてるか見張る猫 TL; DR はじめに 今回のテーブル バイナリログを無効化する 追試 LOAD DATA INFILE 追試 テーブルの正規化 インデックスを一時的に剥がす まとめ We are hiring!! TL; DR バイナリログをオフにする LOAD DATA INFILEを使う インデックスを一時的に消す はじめに AI・機械学習チームではサイトトップからアプリに至るまで多くの推薦システムがあります。 そこでは推薦ロ
ANDPADボードチームの原田(tomtwinkle)です。 Node.jsの mysqljs/mysql の仕様に起因するSQLインジェクションが話題に上がっていたので、それGolangのORMであるGormでも同じような「仕様」があるよ! という注意喚起の意味も込めて筆を執りました。 ※ 2022/02/21追記 コードレビューを自動化して指摘してもらう記事を公開しました! tech.andpad.co.jp Node.jsのMySQLパッケージにおけるエスケープ処理だけでは防げない「隠れた」SQLインジェクション | 株式会社Flatt Security TL;DR GormのQuery Conditions関数に関する危険な仕様 対策 締め TL;DR GormのConditions関数(Find, First, Delete...)を使用する際、第2引数の値にStringを引き渡
みなさん、おはようございます! CARTA fluct エンジニア の なっかー@konsent_nakka です。 CARTA TECH BLOG アドベントカレンダー 12/14ということで、普段DBのロックについてあまり意識したことがない人に向けた実は覚えておきたいロックについての知識をざっとまとめてみました。 とりあえずこれだけ読んでおけば最低限は困らない、もし何か困った時にはあそこで出てきた内容をもう少し深く調べて見るか、というきっかけになれば良いなと思います。 厳密な定義よりも普段DBを扱う中でロックについてあまり意識したことがないような人にもすっと入ってくるように簡単な表現を優先して書いていますがご了承ください。 目次 留意事項 排他ロックと共有ロック トランザクション分離レベル SELECTのロックレベルを変更する 共有ロック: LOCK IN SHARE MODE 排他ロ
IAM認証用ユーザの作成 RDSインスタンスが作成出来たら、次の作業を行います。 マスターユーザでRDSに接続 IAM認証用のユーザ作成 まず、RDSに接続できるEC2にアクセスします。対象のEC2のAWS CLIをアップデートしておきます。 $ sudo pip install -U awscli $ aws --version aws-cli/1.11.81 Python/2.7.12 Linux/4.4.41-36.55.amzn1.x86_64 botocore/1.5.44 RDS for MySQLに接続します。 $ mysql -h iamtest.xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -u mymaster -p Enter password: Welcome to the MySQL monitor. Commands
Aurora MySQLでIAM認証を検証したので、備忘録を兼ねて諸々メモ。 AuroraのIAM認証とは? DBユーザーに、個別のパスワード入力の代わりにIAMクレデンシャルで認証する機能。 DBごと、ユーザーごとのパスワード管理が不要になる。 スロットルのリスクがあるためアプリケーションの認証には不向きだが、運用に伴う人による認証については一考の価値がある。 Aurora側での設定 クラスターでIAM認証を有効化しておく。マネジメントコンソールでいうと、インスタンス設定(≠クラスター設定)の以下が該当設定。 データベースで、IAM認証を有効にしたDBユーザーを作成する。IAM認証は、あくまでこのDBユーザーに対して、AWSプロファイルのIAMクレデンシャルでログインする行為であって、DBユーザーがないと機能しない点に注意。 踏み台インスタンスでの設定 DB接続用のmysqlクライアント
よく見るDB接続例 Go言語を用いてmysqlに接続する際、DBの情報を文字列で直書きしているケースを良くみる import ( "database/sql" _ "github.com/go-sql-driver/mysql" ) func main(){ db, err := sql.Open("mysql", "user:password@tcp(localhost:3306)/db?charset=utf8&parseTime=true") // 以下省略 } import ( "database/sql" "time" "github.com/go-sql-driver/mysql" ) func connectDB() *sql.DB { jst, err := time.LoadLocation("Asia/Tokyo") if err != nil { // エラーハンドリ
Mercari Advent Calendar 2017 の18日目です。 こんにちは。メルカリJPのサーバーサイドエンジニアの@Hirakuです。最近はメルカリNOWの立ち上げに関わっておりGoとPHPを行ったり来たりしています。 今回はネタとしては地味ですが、2017年に遭遇した、MySQLのデッドロックの話をしようと思います。 これまでも何度か話されている通り、メルカリのコア部分は今でもPHP + MySQLで構成されており、複雑なトランザクションを含む処理が各所に存在しています。そのため、意図せずしてデッドロックを作ってしまうことがあり、場合によっては重大な問題につながります。 今年は本当にデッドロックに関するトラブルに多く遭遇し、すっかり「デッドロック絶対に許さないおじさん」みたいになっていました。 事例1)出品者と購入者 デッドロックと言われてもピンと来ない方もいらっしゃるでし
【2022/2/26 追記】 主にはてブコメントで様々なご指摘を頂いたので、タイトルの修正&内容を一部追記しました。分かりにくいタイトルを付けてしまい申し訳ございません。ご指摘ありがとうございます。 もともと本記事は自分用のメモを兼ねて駆け出しエンジニアの人が数人参考にしてくれたらいいかな、程度の気持ちで書いたものでした。 現在はてなブックマークのテクノロジーカテゴリーで 1 位になっており、予想の 1000 倍以上の人に見ていただける記事になってしまいました。 今後も精進します、ありがとうございます! 特に理由もなくローカルに MySQL を入れて遊びたくなる気持ちって定期的に湧きますよね。 私は湧きます、半年に 1 回ぐらい。 業務ではフロントを触ることが多く、DB はそれほど触りません。 そのため久々に MySQL をローカルで立ち上げようとするといつも手順を忘れてしまっていて、なん
2021/05/24 サイボウズ開運研修 動画が以下のサイトからリンクされています - https://blog.cybozu.io/entry/2021/07/20/100000 - これに矢印を書きながらぐりぐりやっていたわけなので、資料単体だとわかりづらいと思います…
MySQL 8.0.17 では JSON カラムで Multi-Valued Indexes が使えるようになりましたので少し試してみます。 Multi-Valued Indexes とは JSON カラムの中に、キー値に対応する値として(配列のように)複数値を持つものが含まれている場合にも有効に機能する INDEX です。 WHERE句で以下の関数等を使って絞り込む場合に有効です。 JSON_CONTAINS() MEMBER OF() ※8.0.17 で新規追加 JSON_OVERLAPS() ※同上 INDEX 作成方法 こちらに説明があります。 Multi-Valued Indexes(13.1.15 CREATE INDEX Syntax / MySQL 8.0 Reference Manual) 具体的には、CAST()関数をARRAYキーワードとともに使って INDEX を作
Go database/sqlチュートリアルのエラーハンドリングの日本語意訳になります。 エラーハンドリング database/sql でのほぼ全ての操作では最後の返り値としてエラーが返却されます。 それらのエラーを必ずチェックし、無視しないでください。 エラー動作が特殊だったり、何かが追加されているケースはいくつかあり、知っておくべきものもあります。 取得行セットの繰り返しによるエラー 以下のようなコードがあるとします。 for rows.Next() { // ... } if err = rows.Err(); err != nil { // ここでエラーを処理する } rows.Err() でのエラーは、 rows.Next() ループ処理内の様々な種類のエラーの結果が入る可能性があります。 ループ処理は正常に終わるだけでなく、何らかの理由によって終了してしまうかもしれません。 そ
この記事は DeNA 20 新卒 Advent Calendar 2020 19日目の記事です。 はじめに MySQLやPostgreSQLに代表されるRDBMSではトランザクションと呼ばれる仕組みが提供されています。多くのWebアプリケーションエンジニアはこのトランザクションを駆使してDBとやりとりをするロジックを組み立てることになります。 しかし不整合を起こしたくない処理があるからといって闇雲にトランザクションを張ったり、トランザクションが張られているからと安心してアプリケーション側で闇雲にロジックを組み立ててしまうと思わぬバグを生むことになってしまいます。 このエントリでは、「トランザクションを張っておけば大丈夫」という考え方は危険な場合もあるということを、ありがちな実装例を交えて紹介していきます。 並列に処理されるトランザクション そもそも、トランザクションは全て直列に処理されるわ
※ InnoDBはREPEATABLE READでもファントムリードが発生しません。 MySQLで実際に試す MySQL(InnoDB)でトランザクション分離レベルを実際に試してみます。 準備 プレイヤーのコイン数を表す簡単なテーブルを作ります。 テーブル構造は次のようになります。 テーブルにplayer1とplayer2のデータを追加します。 2つのターミナルからMySQLに接続します。クライアントAとクライアントBとします(以下はAとBと呼ぶ)。 これで準備は完了です。 READ UNCOMMITTED READ UNCOMMITTEDは一番低いレベルです。 コミットされていない変更を他のトランザクションから参照できる設定です。 ① Aで現在接続中のセッションのトランザクション分離レベルをREAD UNCOMMITTEDに設定して、テーブルを検索します。 ② BでREAD COMMIT
本日は、MySQL Casual Advent Calendar 2013の20日目である。というわけでカジュアルに小ネタを紹介しよう。 MVCC - Multi Version Concurrency Controlご存知の通り、InnoDBはMVCCを実装している。そのため、分離レベルがREPEATABLE READの場合には、行にロックをかけることなく、一貫した読み取りが可能になっている。 もし、あるトランザクションT1開始後に、別のトランザクションT2によって同じ行が書き換えられてしまった場合には、T1はロールバックセグメントにある古いバージョンの値を読み取ることができるので、T1内で実行したSELECTは常にT1開始時点のデータを参照することができるのである。大事なのでもう一度言うが、REPEATABLE READにおける単純なSELECTでは行ロックは必要ない。 Lost Up
排他ロックや共有ロックではなく、innoDBやそこら辺でもなく、内部レベルの行ロックやテーブルロックでもなく、GET_LOCK関数のメモ書き。 MySQLにあるLock機能があって、任意の名前のロックを作成する事ができる。何それ知らないって言ったら笑われたのを今頃思い出した。MySQLを使ってファイルロックをする感じ。 使い方 IS_FREE_LOCK, GET_LOCK, RELEASE_LOCK を使う。 IS_FREE_LOCK(str) 文字列strのロックが使えるか確認する。 1 が帰ってきた時は使用可能 GET_LOCK(str, timeout) timeout秒だけ文字列strで指定されたロックの取得を試みる。timeoutが負の時は無制限。取れるまで待つ。 RELEASE_LOCK(str) ロックを解除する。1 の時は成功を表す 実験 ターミナル1とターミナル2を作り、
概要 k8sのチュートリアルやってみたし自分用のアプリケーション作ってみる! こんな感じの構成にしたい。DB接続までやってみよう。 フロント NGINX (React) (TypeScript) バックエンド golang MySQL 構築 クラスタ作成 k8sのチュートリアル通りminikube使ってローカル環境にクラスタ作る。 ちなみにこれ基本Mac想定 $ minikube stop $ # deleteしとかないとちょくちょく起動しないときある $ minikube delete $ # virtualbox重いのでhyperkitで行く $ minikube start --vm-driver=hyperkit フロントエンド とりあえずNginx起動させてWelcome to nginx!表示させたい Dockerファイルを作成する Dockerfile FROM nginx:
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く