mysqlのreplication関連リンクまとめ
mysqlのreplication関連情報まとめ こんにちは。小宮です。 なんだかmysqlのことを聞かれることが多い今日この頃なので、 聞かれたときコピペできるように聞かれがちなことが説明されてるリンクをまとめる試みです。 この記事だけ読んでも大したことはわかりませんのであしからずご了承ください。 (自分がすっかり忘れたときにも役立ちそうです。) ・基本 現場指向のレプリケーション詳説 漢(オトコ)のコンピュータ道: MySQLレプリケーションを安全に利用するための10のテクニック Art of MySQL Replication. バイナリログに書かれるのは更新系のクエリです。 補足すると、I/Oエラーは、物理的にディスクが壊れた、ネットワーク的につながらない、レプリケーション用ユーザのIDとパスワードが間違っている、server_idが重複している などの理由で起こることがあります。SQLエラーの主な原因は上記の最初のリンクに書いてありますが主に重複エラーが多い印象です。 参考までに現在のreplicationまわりの設定値はだいたいこんなかんじです。 [shell]## replication (master/slave) log-bin=mysql-bin log-bin-index=mysql-bin.index binlog_format=mixed server-id = 133 relay-log=mysqld-relay-bin relay-log-index=mysql-relay-bin.index log_slave_updates=1 replicate-ignore-db=mysql,information_schema,performance_schema binlog-ignore-db=mysql,information_schema,performance_schema skip_slave_start read_only slave_net_timeout=120 ## replication (for 5.6) gtid-mode = OFF enforce_gtid_consistency=false master-info-repository=TABLE relay-log-info-repository=TABLE relay_log_recovery=ON #sync-master-info=1 slave-parallel-workers=0 binlog-checksum=CRC32 #master-verify-checksum=1 #slave-sql-verify-checksum=1 binlog-rows-query-log_events=1 #log_bin_use_v1_row_events=ON #sync_binlog=1 report-port=3306 report-host = 192....OpenSSLの重大バグ(CVE-2014-0160)への対応
こんにちは。小宮です。 OpenSSLの重大バグが発見されたという記事をうけまして、 さすがに影響が大きいようなので関連情報を記録しておきます。 OpenSSLの重大バグが発覚。インターネットの大部分に影響の可能性 | TechCrunch Japan JVNVU#94401838: OpenSSL の heartbeat 拡張に情報漏えいの脆弱性 影響範囲はopenssl-1.0.1~1.0.1fということで、まじめに最新にしてるサイトが影響を受けるという皮肉なことに。 でもまあ影響範囲が限定的なのは良かったと思います。 弊社ではCentOS6.5とAmazonLinuxの環境が影響を受けました。 まず以下をご覧ください。 対策方法を記しているサイト: AWS - EC2インスタンスのOpenSSLのHartbleed Bug対応 - Qiita opensslのTLS heartbeat read overrun (CVE-2014-0160)を対処した | Ore no homepage バージョンの確認方法は rpm -qa|grep openssl とか openssl version という感じで、 CVE-2014-0160をfixしてるパッチがあたってるかどうかは、以下のように確認しました。 rpm -q --changelog openssl |head * 月 4月 07 2014 Toma?...mysqlfailoverをデーモンになってから試してみた
※ 古い記事ですのでご注意ください。 こんにちは。小宮です。 まだ使いたい人がいるかわかりませんが検証してみましたので載せておきます。 長い記事になりますのでお時間のあるときにどうぞ。 mysqlfailoverを–forceつけず–daemon=startで起動させる 以前検証したときは –forceつけないと動かなかったのと デーモンで起動させるオプションは存在しなかった というわけでそこを再度たしかめてみます。 ・構成: 192.168.1.133 komiya-test-mysql01 my1 192.168.1.155 komiya-test-mysql02 my2 192.168.1.150 komiya-test-mysql03 my3 192.168.1.241 komiya-test-mysql04 my4 manager 192.168.1.222 vip ・インストール: パッケージは公式とかこのへんからダウンロードできます。 とりあえずchefでmysql5.6とutility等を入れておきました。 ssh-copy-idとknife solo prepareして nodeファイルのrunlistにdbロール指定して knife solo cookしただけで以下と必要な設定ファイルが置かれて server_idとかreport_hostとか自動的に入るようにしました。 参考にしたレシピはこちら。 以下が関連パッケージです。 mysql-utilitiesはpythonで書かれたツールなのでmysql-connector-pythonが必要です。 $ rpm -qa|grep -i mysql MySQL-shared-compat-5.6.15-1.linux_glibc2.5.x86_64 MySQL-test-5.6.15-1.linux_glibc2.5.x86_64 perl-DBD-MySQL-4.013-3.el6.x86_64 mysql-utilities-1.4.1-1.el6.noarch mysqltuner-1.1.1-1.el6.noarch MySQL-client-5....chef-soloのレシピのカスタマイズの記録
こんにちは。小宮です。 おかげ様でカスタマイズする機会があったため、その一部を引用してご紹介いたします。 基本的なことなどは、 以下のリンクや「入門chef-solo」とその落ち穂拾いもご覧になるとよいと思います。 Chef Soloと Knife Soloでの ニコニコサーバー構築 (2) 〜導入編〜:dwango エンジニア ブロマガ chef-solo - Chefを読んで実行するための全知識 - Qiita DevOpsを実現するChef活用テクニック // Speaker Deck あとGW前後にchef実践入門的な書籍をエンジンヤード(chefが出る前から8年くらい使ってる会社)の御方が出されるそうで大変期待してるところです。 chefのnode、role、enviroment、attribute、data_bagsの解説になります。 この記事は基本の説明とカスタマイズの為の簡単な情報提供になるかと思います。 以下に記載しているレシピを実際ためした環境はCentOS6.4のみで、申し訳ありませんが異なる環境での動作保障はできないです。 異なるOS間の動作保障するような汎用的(複雑)なレシピはopscodeコミュニティの☆がいっぱいついてるクックブックを使えばいいらしいです。 (余計なものを極力入れないとか既存の環境または手順をレシピ化するという需要には不向きかとは思います。) chefリポジトリ直下のディレクトリの解説を以下に記します。 cookbooks :サードパーティのクックブック置き場 data_bags :data_bagsのデータ置き場 environments :環境設定ファイル置き場 nodes :ノード(ホスト・各サーバ)設定ファイル置き場 roles :役割設定ファイル置き場 site-cookbooks :自作クックブック置き場(クックブックはレシピ、配布ファイル等を含む) 各用語を以下に軽く解説します。 ・ohai chefに同梱されているレシピを適用するホストの情報を取得するコマンドです。 ohaiで取得した値に基づいてattributeを定義することが可能です。 たとえばOS搭載メモリやCPUコア数に応じて設定値を変えたい場合やホスト名や IPアドレスなど固有の情報を設定ファイルに載せたい場合などに利用すると便利です。 ・node nodesディレクトリ直下にhostname.jsonまたはipaddress.jsonというファイルを置き、 そこにそのサーバ固有の設定値(attribure)や割り当てる役割(role)を定義します。...AMIのバックアップをawscliで自動でとる
こんにちは。OPSのほうの小宮です。 どうも社内で需要があるようだったのと、 javaよりpythonのツールが早いということで検索したけどawscliのは見つからなかったのでつくりました。 タグでとるとらない自動判定などはしておりません。bkup_numに世代数を指定すると複数世代とれるように直しました。 引数1にインスタンスID、引数2にホスト名を指定して実行する仕様です。 --no-rebootを付けてあるので稼働中のインスタンスが再起動されることはありません。 データ領域のEBSがあってもamiコマンドが勝手に複数とってくれるようだったので、 osデバイスかdataデバイスか判定してわかりやすいタグつけるようにしてみました。 ※※要注意※※ --no-rebootつけてAMIを取得する対象がMyISAMストレージエンジンのmysqlのDBサーバだった場合に、データが壊れて止まるという現象が発生しました。 InnoDBじゃない場合にどうしてもAMI取得したい時はメンテ推奨で止めてやるのがよいかと思われます。 ※AWSでは無停止でのAMI取得に関するデータの整合性は保証しておりません。 参考URL:http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html ということはストレージ系のサーバは気をつけたほうがよい(メンテ推奨)ようです。 ・awscliが入ってなければインストールする 入れ方参考:(入ってない場合はpip install awscliとする。pipはeasy_installで入れる) AWS Command Line Tool Python版 | Developers.IO pythonでeasy_install - ハネ@日記 AWS Command Line Interface(awscli)を使ってみた - 元RX-7乗りの適当な日々 スクリプトから呼ぶAWSのアクセスキーとリージョンの設定ファイルを作っておきます。 [shell]# cat /root/.ec2/aws.config ———— [default] aws_access_key_id=<アクセスキーID> aws_secret_access_key=<シークレットアクセスキーID> region=ap-northeast-1 ————[/shell] ・コマンドの調査(いちおう載せておきます) [shell]# aws ec2 copy-image help ———— copy-image DESCRIPTION Initiates the copy of an AMI from the specified source region to the region in which the request was made....Android Expansion files(拡張ファイル) アップロード
拡張ファイルのアップロード方法がわかりません。 Devleloper Consoleのヘルプを見ると 注: 現在のところ、新しい Google Play デベロッパー コンソールの制限により、新しいアプリをアップロードする最初の APK ファイルに拡張ファイルを追加することはできません。この問題を回避するには、まず APK ファイルのみをアップロードし、必要に応じて拡張ファイルを追加した APK ファイルで置き換えてください。これらの操作はドラフト状態の APK でも行えますので、既存ユーザーや潜在ユーザーに影響が及ぶことはありません。 どうやら拡張ファイルを追加できない事はわかります。しかし回避するための方法がわかりません。 「拡張ファイルを追加したAPKファイルで置き換えてください」? それじゃあ、APKと拡張ファイルが一体化しているじゃないですか! 頑張って調べてみると http://stackoverflow.com/questions/15109191/how-to-upload-apk-expansion-files-in-new-developer-console がヒット。 it’s a dummy apk. When you first upload your apk you will not have any option for the expansion files. From second apk onwards you will have that option....TortoiseGit + GitHub + port 443
TortoiseGitとGitHubで快適にGit生活を送っていたのですが、ある日突然pullできなくなりました。 どうも GitHubとの22番ポート経由での通信ができなくなった模様。 なぜ? 22番といえばsshのポート。AWS上のサーバーにもガシガシsshしているので、社内ネットワークの どこかで閉じているとは考えられません。GitHub側から締め出しをくらったのかなぁ? 仮にも有料プランユーザーなのにそんなことあるの?? 結局原因不明ながらも 443番ポート経由で通信するように環境を変更することで対応しました。 TortoiseGitとGitクライアントはインストールされている前提です。 インストール方法は以下にとっても良くまとまっています。 TortoiseGitを日本語化するまでの手順 - ssh クライアントを切り替える 右クリックしコンテキストメニューを開き、そこからTortoiseGitの設定を開きます。 左ペインのネットワークを選択し、右ペインに表示されたsshクライアントが以下でなければ変更します。 C:\Program Files (x86)\Git\bin\ssh.exe - 鍵を再作成する TortoiseGitを使っている場合おそらく標準であろうTortoisePlink.exeをSSHクライアントに設定している場合 証明書に自動的にパスフレーズが設定されるらしく他のsshクライアントでは再利用できないので、再作成します。 $ ssh-keygen -t rsa -C “メールアドレス” - GitHubに公開鍵を登録する GitHubのサイトに行き先程作成した公開鍵(*.pub)の内容をコピペします。 - ssh設定ファイルを作成する 以下のファイルを作成します。 C:\Users\[ユーザーのホーム]\.ssh\config 中身 鍵のパスは適切に修正してください。 これで443ポート経由でGitHubとやり取りできるようになっているはずです。 お試しあれ。 参考 SSHポートが通らなくてもgithub.comにpushする方法...CloudFormationを使いredmineのインスタンスを起動する
おはようございます。インフラの宮下です。 社内向けredmineが古いのでリプレイスを検討しています。 できるだけ手間をかけずに検証環境を用意したいと思い、AWSのcloudformationを使って redmineを用意してみました。 目次 はじめに CloudFormationでインスタンスを作成する インスタンスが起動してからの設定 はじめに 現在稼働しているredmine環境が物理サーバにバージョンがRedmine 1.1.2.stable (MySQL)ととても古いので最終的には入替まで実施したいと思います。 CloudFormationでインスタンスを作成する ManagementConsoleからCloudformationの画面を開きます。 「Create Stack」で新規作成を開始します。 ・Name→管理しやすい名前を自由につける。 ・Template→Use sample templateの中のSingleInstanceSamplesの中から「Redmine Project Management System」を選ぶ。 ※検証環境なので今回は最小化された構成で構築します 「Next Step」で次に進みます。 Specify Parametersにそれぞれ値を入れていくのですが、デフォルトではkeyを指定する事ができませんでした。 という事で一旦「Back」で戻ります。 amazonが公開している下記のテンプレートをローカルPCに保存します。 https://s3.amazonaws.com/cloudformation-templates-us-east-1/Redmine_Single_Instance.template サンプルとの違いは、KeyNameの定義が入っているだけですのでSSHログインしないというのであれば この作業は不要です。 [shell](8行目) “KeyName”: { “Description” : “Name of an existing EC2 KeyPair to enable SSH access to the instances”, “Type”: “String”, “MinLength”: “1”, “MaxLength”: “255”, “AllowedPattern” : “[\\x20-\\x7E]*”, “ConstraintDescription” : “can contain only ASCII characters....SSHでforced-commands-onlyを使ってVIPを付けてみる
おはようございます。インフラの宮下です。 今回は端末機からサーバの仮想IPを付けたり削除する時のSSH設定に関する手順です。 MHAの内部でIPをfailoverする所をお手製で実施するイメージです。 SSH接続でroot権限を実行する方法としては、 ・rootで公開鍵認証が出来るようにする。 ・ログインユーザがsudo出来るようにしてrootにスイッチする。 ・rootで特定のコマンドだけ実施出来るようにする。 の3通りありますが、今回はセキュリティレベルがそんなに変わらない3番目の方法を適用したいと思います。 既にsudo出来る環境なら良かったのですが、sudoできない環境なのでforced-commands-onlyを使用します。 作業環境は以下の通りです。 接続元のOS:SunOS test 5.10 Generic_147440-19 sun4v sparc sun4v →端末機と呼びます 接続先のOS:Red Hat Enterprise Linux Server release 6.2 (Santiago) →サーバ呼びます 今時珍しいsolarisが端末と言う事でレトロ感満載の環境と言う事はお察し下さい。 (端末機の設定) ・ログインするユーザの公開鍵を作成します。コマンド毎に鍵を分けるので2個用意します。 [shell]# ssh-keygen -t rsa -N "" -f ~/.ssh/ipadd_command 公開/非公開 rsa 鍵のペアを生成しています。 識別情報が /export/home/test/.ssh/ipadd_command に保存されました。 公開鍵が /export/home/test/.ssh/ipadd_command.pub に保存されました。 鍵のフィンガープリント: 80:1e:4f:8b:2a:0d:22:fb:e2:c7:22:75:70:ef:db:a2 test@test...要素が1つしかない連想配列のネストを解消する
WordPress関数(特に$wpdbクラスなどに多い。get_results()メソッドでDBの値をとって来たときなど)を使っていて、戻り値の配列が一つしか要素持ってないのに連想配列になっていたりする場合、値を取り出すときにネストしたループ処理を書くケースが結構ある。 以前からコード的に冗長で非効率だよなぁ…と思っていて、今回改善方法を見出してスッキリしたので、ここにTIPSとして残しておこうかと。 $array = array( array( 'key_1' => 'value_1', 'key_2' => 'value_2', ), ); foreach ($array as $nested_array) { foreach ($nested_array as $key => $value) { echo 'array["' . $key . '"] => "' . $value . '"<br />'; } } 今まではこんな感じに(無駄ではないのだが、効率的ではない)foreachループを連想配列の入れ子分回して値取ってた…。 で、この連想配列とループのネストを解消してシンプルに処理を書けないものか…とPHPのarray関数を色々と試してみた。array_reduce()とかarray_walk()とかあんまり使わない関数で、独自にネスト解消用の関数組んでもできるんだが、別途独自関数用意しなきゃならなくてまるでスマートでない…。なんかスパっと1ラインで解決できないかと試行錯誤してみたところ、ありました! array_shift()で先頭要素取得して元の配列変数を上書きしてしまえばいいのです。 $array = array_shift($array); たったこれだけ(笑) でも、これだけだと配列の要素数が1つ以上でも上書きしてしまうので、要素数の判定を入れておく。 $array = (count($array) == 1) ?...InternetExplorer11で変更されたUserAgent書式に対応する
今まで問題なく稼動していたとあるシステムにて、InternetExplorer11(以下IE11)のブラウザにて不具合が発生する旨の報告を受けて調べたところ、IE11ではユーザーエージェントの書式が変更になっていて、ブラウザ判定処理が「不明なブラウザ」として処理されていたことがわかった。 今までユーザーエージェントのブラウザバージョントークン(UAの"MSIE 9.0"とか書いてある部分)でIEブラウザの判定とIEバージョンを取得していたのだが、IE11からはこのブラウザバージョントークンがなくなってしまい、新たに"rv"というリビジョントークンが設けられてました(※IE11標準ブラウザモード)。 今後IE11を含めてユニークにIEを判定するには、ブラウザエンジンであるトライデントトークン(UAの"Trident/7.0"とか書いてある部分)の存在確認もOR条件で判定しないといけなくなった。 IE11のUserAgent [ブラウザモード:標準] Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko [ブラウザモード:互換表示] Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0) 問題なのが、IEの互換表示モードだ。IEの互換表示モードはIE9から導入された機能だが、このモードにすると現状の全てのIEにおいてUAのブラウザバージョントークンがIE7となってしまう。互換表示の際についても正確にIE11と判定させるには、まずトライデントトークンを先に判定して、トライデントのバージョンが7.0以上だったらIE11として判定しリビジョントークンからブラウザバージョンを取得し、それ以外はブラウザバージョントークンからバージョンを取得するという処理にする必要がある。さらにIE11より下位の互換表示モードをもつIE9とIE10用の処理も必要だ。 また、IE7以下はトライデントトークンを持っていないので、IE7用の判定処理も別途必要となる…(いやはや、まるで嫌がらせのような仕様だな…)。 試しにこのDEVLABで利用している独自のクライアントデバイス判定処理(PHP)で、IE11にも対応した判定処理に修正してみた。 まずは、今までのIE判定処理内容。 [php] $ua = $_SERVER[‘HTTP_USER_AGENT’]; $results[‘browser’] = ‘’; $results[‘version’] = ‘’; if (preg_match(’/(MSIE \d{1,}?(.\d{1,}?){1,}?;)/’, $ua, $mtcs)) { $results[‘browser’] = ‘msie’; list(, $vstr) = explode(’ ‘, str_replace(’;’, ‘’, $mtcs[0])); $results[‘version’] = $vstr; } [/php]...Android アプリに設定されたパーミッションを取得する
もしmanifestに設定されていないパーミッションが必要な機能を使うと無慈悲なSecurityExceptionが発生します。 それはもう、catch節をスルーするくらい無慈悲です。 このExceptionが発生するという事は、manifestとコードが不一致だということなので、コード直せボケ! なのかもしれませんが、やはりコード内でパーミッションをチェックして条件分岐したい事もあるものです。 例えばライブラリとして公開する場合とか。 そんなわけで、パーミッションのリストを取得するメソッドと、お目当てのパーミッションがmanifestに存在するのか確認するメソッドをお届けします。 [code lang="java" light="true"] /** * 指定されたパーミッションがmanifestに記載されているかどうか確認します。 * * @param checkPermission 調査するパーミッション * @param context コンテキスト * @return true:記載されている /false:記載されていない */ public boolean hasPermission(String checkPermission, Context context) { if (checkPermission == null || context == null) { // 引数が渡されていないケース return false; } String[] requestedPermissions = getPermissionList(context); if (requestedPermissions == null) { // manifestに一件もpermissionが設定されていないケース return false; } for (String str : requestedPermissions) { if (str....GitHubでpush時にAWS OpsWorksで自動デプロイする方法
開発の平形です。 今日は、GitHubでpush時にAWS OpsWorksで自動デプロイする方法をお教えします。 OpsWorksはAWSで提供されているデプロイのサービスです。 *OpsWorksについては、こちらのサイトが詳しいです。 この話は、OpsWorksにスタックとレイヤとインスタンスが存在する前提です。 OpsWorks自体、最近触ったばかりですが、 デプロイがすごく簡単にできるという事はよくわかりました。 でも、欲張りな僕は、もっと自動化できないのかな?と思ったのです。 普段、ソースはGitHubでバージョン管理しているので、 GitHubにpushしたら同時にデプロイできないのかな?と。 そしたら、ビックリするほど簡単に実現できました。 GitHub側で設定が可能です。 アプリケーションのリポジトリのページの「Settings」 「Service Hooks」 AWS OpsWorks 以下の項目は全て必須なので、全部入力します。 ここで、OpsWorks側の情報が必要になります。 まずは、Stack Idですが、一見これがわかるところが、AWS Managed Consoleの画面上にはありません。 手っ取り早くこれを確認する方法はStackの画面のURLをみる事です。 次にApp Idですが、同じくOpsWorksの画面で、「Apps」=>「アプリケーション名」をクリック OpsWorks IDがApp Idです。 Branch Nameはリポジトリのデプロイしたいブランチ名を指定。 AWSのアクセスキーとシークレットキーを入力し、Update settingsをポチっとします。 あとは、該当ブランチにpushするだけ! これで自動的にOpsWorksのデプロイが走ります。 僕はこれに感動しました! ただ、欲張りな僕はまたまた思ったのですね。 OpsWorksではスタックを本番環境とステージング環境と分けて運用してるとします。 そうすると、 releaseブランチはステージング masterブランチは本番 にそれぞれ自動デプロイできたらいいなー、と。 しかし、一つのリポジトリにつき、一つのスタックの設定しかできないんですよね。 という事で「できない」という事がわかり、取り乱しました。 まあ実際の運用で、masterのpushしただけでいきなりデプロイするのもトラブルの元になりそうだし、 そういうもんなんだ。って自分に言い聞かせて落ち着きを取り戻しました。 それでも便利には変わりないですけど。 あなたのデプロイライフがもっと充実しますように。 以上、平形がお届けしました。...redisのソースインストール(chef-solo)
こんにちは。opsのほうの小宮です。 redisのソースインストールをご依頼いただきCHEF-SOLOったのでその記録をのこしておきます。 ★要件 バージョンについては2.8.4でお願いします。(2014/1時点で最新のソース) ★以下作業 ・rpmで入るバージョンの確認(※同環境のサーバでyumで確認) redis.x86_64 0:2.4.10-1.el6 ※要件に合わないためソースインストールする必要がある ・chef-soloの下準備 [shell]$ ssh-copy-id -i ~/.ssh/id_dsa.pub server2 $ ssh-copy-id -i ~/.ssh/id_dsa.pub server1 $ knife solo prepare server1 $ knife solo prepare server2[/shell] ・role作成 [shell]$ vi roles/rankingAPI.json { “name”:“rankingAPI”, “chef_type”: “role”, “json_class”:“Chef::Role”, “default_attributes”:{ “base_setting”: { “swappiness”: “0”, “tcp_tw_reuse”: “0”, “tcp_tw_recycle”: “0”, “tcp_fin_timeout”: “10”, “tcp_max_syn_backlog”: “8192”, “somaxconn”: “8192”, “ntpserver1”: “ntp....