読者です 読者をやめる 読者になる 読者になる

ユアマイスター株式会社エンジニアブログ

ユアマイスター株式会社のエンジニアが日々徒然。

VagrantでVMを2台立ち上げてMySQLのMaster/Slaveを作ってレプリケーション

こんにちは!ユアマイスターの星です。

今回、ローカル環境で、MySQLレプリケーションを動作確認する機会があったので、その手順を備忘のために書いておきます。

大きく詰まる所はなく、トントンと行けると思います。

VMはCentOS6.3で立ててあります。(MySQLのバージョンは5.6)

フェイルオーバーとか試したくなった時に、気軽にローカルでチャチャッと環境作れるのは嬉しいですね!

それでは、手順です。

1. Masterの初期設定

SU

sudo su

/etc/my.cnfの編集

cp /etc/my.cnf /etc/my.cnf.bak

vi /etc/my.cnf

diff -u /etc/my.cnf /etc/my.cnf.bak
# replication
log-bin=mysql-bin
server-id=101
[root@localhost vagrant]# diff -u /etc/my.cnf /etc/my.cnf.bak
--- /etc/my.cnf 2017-04-26 06:35:41.002033325 +0000
+++ /etc/my.cnf.bak 2017-04-26 06:36:13.929031577 +0000
@@ -20,10 +20,6 @@
 datadir=/var/lib/mysql
 socket=/var/lib/mysql/mysql.sock
 
-# replication
-log-bin=mysql-bin
-server-id=101
-
 # Disabling symbolic-links is recommended to prevent assorted security risks
 symbolic-links=0

MySQL再起動

/etc/rc.d/init.d/mysqld restart
[root@localhost vagrant]# /etc/rc.d/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

MySQLにログイン

mysql -u root -p

ユーザー作成

grant replication slave on *.* to replica@'%' identified by 'replica';

flush privileges;

exit;
[root@localhost vagrant]# mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.6.36-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> grant replication slave on *.* to replica@'%' identified by 'replica';
Query OK, 0 rows affected (0.03 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> exit;
Bye

2. Slaveの初期設定

SU

sudo su

/etc/my.cnfの編集

cp /etc/my.cnf /etc/my.cnf.bak

vi /etc/my.cnf

diff -u /etc/my.cnf /etc/my.cnf.bak
# replication
log-bin=mysql-bin
server-id=102
read_only=1
report-host=server2
[root@localhost vagrant]# diff -u /etc/my.cnf /etc/my.cnf.bak
--- /etc/my.cnf 2017-04-26 06:45:34.169021154 +0000
+++ /etc/my.cnf.bak 2017-04-26 06:45:16.461021094 +0000
@@ -20,12 +20,6 @@
 datadir=/var/lib/mysql
 socket=/var/lib/mysql/mysql.sock
 
-# replication
-log-bin=mysql-bin
-server-id=102
-read_only=1
-report-host=server2
-
 # Disabling symbolic-links is recommended to prevent assorted security risks
 symbolic-links=0

MySQL再起動

/etc/rc.d/init.d/mysqld restart
[root@localhost vagrant]# /etc/rc.d/init.d/mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

3. MasterのDumpをとる

全テーブルをロック

mysql -u root -p 
flush tables with read lock;

FileとPositionをメモ

show master status;
[vagrant@localhost vagrant]$ mysql -u root -p 
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.36-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      400 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

別コンソールを開き、Dumpを取得

mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql
[vagrant@localhost ~]$ mysqldump -u root -p --all-databases --lock-all-tables --events > mysql_dump.sql
Enter password: 
[vagrant@localhost ~]$ ls -l mysql_dump.sql 
-rw-rw-r--. 1 vagrant vagrant 1426633 Apr 26 06:52 mysql_dump.sql

server2へSCP転送

scp mysql_dump.sql 192.168.33.41:/tmp/
[vagrant@localhost ~]$ scp mysql_dump.sql 192.168.33.41:/tmp/
vagrant@192.168.33.41's password: 
mysql_dump.sql                                100% 1393KB   1.4MB/s   00:00   

元のコンソールでロック解除

unlock tables;

exit;
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> exit;
Bye

4. Slaveでレプリケーション有効化

マスターから転送したダンプデータをインポート

mysql -u root -p < /tmp/mysql_dump.sql
[vagrant@localhost ~]$ mysql -u root -p < /tmp/mysql_dump.sql
Enter password: 

レプリケーション詳細設定

mysql -u root -p

メモったFileとPositionを記載する

change master to
master_host='192.168.33.40',
master_user='replica',
master_password='replica',
master_log_file='mysql-bin.000001',
master_log_pos=400;
[vagrant@localhost ~]$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.36-log MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> change master to
    -> master_host='192.168.33.40',
    -> master_user='replica',
    -> master_password='replica',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=400;
Query OK, 0 rows affected, 2 warnings (0.07 sec)

レプリケーション開始

start slave;
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)

ステータス確認

show slave status\G
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.33.40
                  Master_User: replica
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 475
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 358
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 475
              Relay_Log_Space: 532
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101
                  Master_UUID: d3e8ac27-2a19-11e7-aab9-080027c363c3
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

tigを逆から読むと

f:id:yourmystar_engineer:20170428132547p:plain

どうもエンジニアインターン生竹本です!!

最近の弊社のサービス「あなたのマイスター」では母の日キャンペーンとして新社会人になられて初任給をもらった方や、

中々親孝行ができていないと感じている社会人の皆様に向けてハウスクリーニングをプレゼントとして贈ろうという企画を実施しています。

僕も中々日頃の感謝を伝えるために贈りたい気持ちは山々なれど、、お金が、、、、まあそんな竹本のお財布事情はとにかくとして今週も行きましょう!

竹本によるエンジニア初心者のためのエンジニアブログ!

tigのススメ

皆さんはtigを知っていますか?

そう逆から読むとtigはgit hubをよりスピーディーに使用できるツールです。

弊社では開発のバージョン管理ツールとしてgit hubを使っています。

自分のタスクの開発を進めていく中で、よく陥りがちなのが編集したファイルの数が多すぎてgit addするのがちょっと面倒臭いってこと。

tigはそんな問題を解決してくれます。

インストール手順は以下のURLに飛んでみてください。

https://github.com/jonas/tig/blob/master/INSTALL.adoc

tigで何ができるの?

まずgit hubでプッシュする上で行う操作は

  • git status

  • git add

  • git commit

  • git push この4行程ですよね。でcommitしたいファイル数が増えるとその前のgit add をいちいちやらなければいけないからめんどい。。。たまにダブることもあるし、、、でもtigを使えば一瞬でgit add ができます。

使い方

① 今いるブランチでtig status

f:id:yourmystar_engineer:20170428132547p:plain

すると上の画面が出てきます。

②ファイル名を選択して u を押す

uを押すことで選択したファイルがgit addの状態になります。

今回の画面ではファイルは一つしか変更してなかったですが、Changes not staged for commitやUntracked filesには変更もしくは新規作成したファイルがたくさん並びます。

③git add状態になったらqを押す

tigにはinsertモードなどの操作がないのでescキーを押さなくてqだけで画面から抜けられます

④通常どおりにcommit ->pushの流れ

addした後はcommitとpushをしてください

その他にはtig statusではなくてtigと入力すると今までのlogを確認することができるとともにツリー状に表示されるので可視化しやすくなります。

使いやすいツールなのでぜひ使ってみてください。

以上、今週の竹本でした!

N+1問題



N+1問題とは?

アソシエーションをした上でeach doで紐づいた先のデータを取って来る際に データベースに取りに行く回数が多い分SQL文が多く発行される。すなわち、時間がかかる

膨大な量になると重くなってしまう…. f:id:yourmystar_engineer:20170423214103p:plain

N+1問題の解決方法 rails

controller.rbの編集

 Post.all

 Post.all.include(:user)

f:id:yourmystar_engineer:20170423214142p:plain このように保存領域(データベース)から値を取って来る処置速度(SQL文)をはやめてあげることでアプリケーション自体の読み込みも早くなります。

gemファイルを使って問題が起きている箇所を特定

  • bullet
gem 'bullet'

config/enviroments/developmemt.rb参照 bulletの設定を記述

  config.after_initialize do
    Bullet.enable  = true   # 以下はN+1問題を発見した時のユーザーへの通知方法
    Bullet.alert   = true   # ブラウザのJavaScriptアラート
    Bullet.bullet_logger = true # Rails.root/log/bullet.log
    Bullet.console = true   # ブラウザの console.log の出力先
    Bullet.rails_logger = true # Railsのログ
    Bullet.add_footer   = true # 画面の下部に表示
  end

f:id:yourmystar_engineer:20170424022156p:plain このように、N+1問題が起きている場所ではアラートが出てきてくれる
他にも' rack-mini-profiler'というgemでも問題を特定できます。

レンダ(render)ーって便利だー

みなさんこんばんわ。桜が散り、これから緑深くなる季節の前触れかのように気温が急に上がり始めましたね。 だからってまだ朝方は少し寒いみたいで、掛け布団なしで寝たら風邪を引いたエンジニアインターン生の竹本です。 さて、最近の株式会社ユアマイスターでは、春になりインターン生として活動してる大学生たち(自分も)が前期の授業が始まったため人数が減るかなと思いきや、、、授業が終わった後にオフィスにきて懸命に作業して行く学生だらけです。
熱があるって素敵ですね。

最近のあれこれ

先週からMVCのすべての部分を使って一つの機能を作ってます。ページ数で言うと4ページっていう少なさなんですがmodel定義をしたことなかった僕にとっては時間はかかるけど勉強になるタスクです。 今回はその中でも便利だと思ったcakePHPのrender関数について書いていきたいと思います。

render関数って何?

webサイトを作って行くにあたって、同じ画面構成にしたいけど入力する値を変えたいとかってありますよね。要するにページの複製です。 そんな時に新しいファイルを作り、カチカチとコードを書くのもありですが、、せっかくなら作業時間を減らしたいですし、同じようなコードを別ファイルに書くと後で改修したい時などに、修正し忘れてエラーになる原因にもなります。render関数はそんな複製にも便利!&機能改修の時にもミスを防げるのでぜひ使って見てください。

render関数の使い方

render関数の使い方はいたって簡単です。controllerのメソッド内で

class xxxController extends AppController{
    function yyy(){
        /*実行したい操作*/
       
       $this->render('ファイル名');
    }
}

ここで注意していただきたいのが「ファイル名」の書き方です。ファイルの前に/があるかないかにも依りますが基本的に今いるコントローラーメソッドからの相対パスと考えていいのではないしょうか。 あえて明言は伏せますが、気になった方は下記のURLでご確認を。 また来週お目にかかりましょう!以上竹本でした!

コントローラ

MastodonをFranzプラグインを追加して、コミュニケーションツールの一括管理!

f:id:yourmystar_engineer:20170420103746p:plain

こんにちは、ユアマイスターの星です。

最近何かと話題のMastodonマストドン)ですが、僕も早速使い始めてみてます。(もしよかったらフォローしてください)

Macのデスクトップアプリがまだなさそうだったので、普段使用頻度の高いアプリFranz(フランツ)で

Mastodonをみたり更新したりできるようにしました!

これでいちいちブラウザを立ち上げる必要なし!

Franzとは

Slack、FacebookメッセンジャーTwitterSkypeGmailなど、複数のチャット・コミュニケーションツールを

一箇所に集約し、一つのアプリで管理できてしまう優れものです。

しかも、無料。

meetfranz.com

特にこんな人におすすめです。

  • いろんなSlackのチームにぶち込まれていて、行き来するのめんどくさい
  • SlackだけじゃなくてFacebookでも連絡取らないといけない
  • しかもメールはGmail、カレンダーはGoogle Calendarで、もうツールに溺れて目が回りそう

f:id:yourmystar_engineer:20170420103454p:plain

対応しているサービスはすでに結構あるのですが、プラグインという仕組みを使って、

自分で対応サービスを増やせるのがさらにいいところだと思います。

Mastodonとは

特に解説いらないと思いますが、一応念のため。

Mastodonは、TwitterSNSで、オープンソースだから自分でインスタンスを立てて使うか、

誰かが作ったインスタンスでアカウントを作らせてもらって使うことができます。

インスタンス間をまたいでフォローをする「リモートフォロー」という仕組みもあるため、

ほぼTwitterと同じ感覚でつぶやくことができます(Mastodonでは、ツイートのことをトゥートと呼ぶらしい)

mastodon.social

普段のFranzの使い方

個人的には下記のアプリケーションをFranzで管理しています。めっちゃ便利。

開発以外の業務の8割型これで収まります。あっちこっちを見に行かなくていいのは本当に助かる。

MastodonのFranzプラグインを追加する方法

1. Franzプラグインフォルダを開く

左上のロゴマークを押して、設定を押すと設定画面をひらけます。

その一番下にある「Franzプラグインフォルダを開く」ボタンを押します f:id:yourmystar_engineer:20170420110753p:plain

2. プラグイン名の新規ディレクトリを作成

f:id:yourmystar_engineer:20170420110947p:plain

3. 必要なファイルを置いていく

参考:Franz Pluginを作ってみよう - Qiita

  • icon.pngを作ったら、変換ツールなどを使ってicon.svgを作成する
  • package.jsonの記入例は下記の感じです。
{
  "name": "mastodon",
  "version": "1.0.0",
  "description": "Mastodon is a free, open-source social network server. A decentralized solution to commercial platforms, it avoids the risks of a single company monopolizing your communication. Anyone can run Mastodon and participate in the social network seamlessly.",
  "main": "index.js",
  "author": "###YOURNAME### <###YOURMAILADDRESS###>",
  "license": "MIT",
  "config": {
    "serviceURL": "###URL###",
    "serviceName": "Mastodon",
    "message": "Mastodon is a free, open-source social network server.",
    "popup": [],
    "hasNotificationSound": false,
    "hasIndirectMessages": false,
    "hasTeamID": false,
    "customURL": false,
    "hostedOnly": false,
    "webviewOptions": {
      "disablewebsecurity": ""
    },
    "openDevTools": false
  }
}
  • ###URL###のところは、自分のアカウントがあるMastodonインスタンスのURLをセットしてください
  • webview.jsはJavasriptで自由にカスタマイズしちゃってください。

4. Franzを再起動する

5. Mastodonのアイコンが増えているので、サービスの追加をして利用開始!

以上です!

FranzとMastodon、どんどん使って効率よく仕事を進めていきたいですね!

1ヶ月CakePHPを使った感想を書いてみた!

こんばんは!1週間ほど前からインターンとしてお世話になっている高梨です。


プログラミング歴も4ヶ月ほどで、共同開発はこのインターンが初の経験ですので、
そんな若者が書いた「Cakeを1ヶ月使ってみた!」
だと思って 軽い気持ちで見てもらえると幸いです。


まずは、僕の感想を書いていく前に 簡単にCakeの特徴をまとめて見ました!


  • サーバーサイド言語PHPフレームワーク
  • 規約が厳しい
  • MVCモデルを採用(Model, View, Controller)
  • 日本語でも学習しやすい
  • デバックキットがいい感じ




また、wikiさんに 聞いてみると


CakePHP(ケイクピーエイチピー)とは、PHPで書かれたオープンソースのWebアプリケーションフレームワークである。 先行するRuby on Railsの概念の多くを取り入れており、Rails流の高速開発とPHPの機動性を兼ね備えたフレームワークと言われている。 MITライセンスの元でフリーで配布されている。」


Railsがベースがもとになっているんですね! 他にもphpフレームワーク人気度動向」 なんてのもあったので、見てみましょう!


世界でのPHPフレームワーク人気比較 f:id:yourmystar_engineer:20170419214801p:plain http://eng-entrance.com/php_framework


日本でのPHPフレームワーク人気比較 f:id:yourmystar_engineer:20170419214805p:plain http://eng-entrance.com/php_framework


世界ランキングと日本ランキングで結構違うんですね。


世界ランキングをみるとCakeの立場が…..汗


Cakeの将来は大丈夫なのか???


本題


ではでは、1ヶ月実際にCakeを使ってみた 僕の感想をお話していきます。


他のフレームワークPythonDjango
少し 触った程度なので、 あまり比較などはできないのですが、


個人的にはかなり使いやすいフレームワーク なのかなと思います。


規約が厳しいなど言われますが、 少し慣れってしまえば、 案外簡単に使えるようになります!!


ただ、簡単に感覚で書けてしまう部分もあるので、
色々なエンジニアから「読みにくい」という理由で
毛嫌いされてしまうことも少なくないようですね。


確かに、共同開発をやっていて
読みにくいコードを頑張って追っていくのって
かなりエネルギー使いますからね。。。
(僕の場合はただレベルが低いだけかな??)


『結局、Cakeを今から学ぶ価値ってあるの?』


と言う質問に答えるとすれば、 僕は大いにあると思います。


先ほどのグラフから見ても、
将来的にずっとCakeを使っていく可能性は 高くないかもしれませんが、


1つのフレームワークをしっかり習得すれば 次のフレームワークを学ぶ際も
効率が段違いでしょう。 (Djangoを1週間触った経験)


そもそも、サービスやシステムを開発していくにあたって、
プログラミング言語自体はそこまで大きな問題では
ないらしいですしね。


構築する開発環境やサーバー、セキュリティ、プラグインなどなど、
開発をしていくとなると考えることはたくさんあります。


そう考えると、プログラミング言語なんて その中のピースの1つに過ぎません。


「どのフレームワークをやればいいかわからない。」


なんて迷っている暇があるなら、
とっととCakeをやっちゃいましょう!


僕自身プログラミング歴4ヶ月程度ですが、
Cakeのドキュメント(チュートリアル)だけやっとけば、
とりあえず色々と開発できるようになりました!


1ヶ月経った今ではインターンの方でも
どうにか足手まといにならないぐらいにはなっています。
(なっていないかな….?)


ドキュメント(チュートリアル)内容は


  • ブックマーク機能制作
  • ブログ機能制作




の2つのみで、
それぞれ2ページと3ページほどなので、
チュートリアルだけ頑張ってやれば、
あなたもCakeを使いこなせるようになります!!



ここまでつらつら書いてきましたが、
とりあえず僕もこれから頑張るので、
この記事をきっかけにフレームワークを使い出す人が
1人でも出れば幸いです。


では、ここまでご覧いただき
ありがとうございました。


P.S.
Cakeのホームページを載せておくので、
少しでも気になれば見てみてください!
(意外とホームページのデザインもいいです)


CakePHP公式ドキュメント


PHPUnitでテストを省略する方法

こんにちは。ユアマイスターの星です。

今日はPHPUnitで便利だなーと思ったメソッドの紹介です。

どんな時?

ユアマイスターではユニットテストPHPUnitを使っています。

基本的にはModelとComponentに対してテストを書いていってるわけですが、

他メンバーとのソース差分などが生まれて、一旦、書きかけのテストコードをGitHubにPushしないといけないケースがあります。

そんな時に使いたいのが markTestIncomplete() です。

使い方も簡単

各テストケースの中に、下記のように書くだけです。

        // ここで処理を止め、テストが未完成であるという印をつけます。
        $this->markTestIncomplete(
          'このテストは、まだ実装されていません。'
        );

参考:PHPUnit マニュアル – 第7章 不完全なテスト・テストの省略

テストに失敗するとデプロイもできないような開発環境構成にしていますので、

途中でもどうにかPushしたい!っていう緊急事態のための、痒いところに手がとどく機能でした。

もちろん基本的にはテストコードはオールグリーンである必要がありますので、

その後ちゃんとテストコードを書いていく必要があることを忘れないように!

以上、最近テストコードを書くことに快感を感じている星でした。