2016年5月2日月曜日

レプリケーションに関わる各種トラブルQ&A

○レプリケーションに関わる各種トラブルQ&A
Q1:Mysqlのレプリケーションを行い、スレーブのPCを設定修正の必要が生じた場合、注意することは?
その都度スレーブ機能を停止する必要があることに、ご注意ください。具体的には、いったん、
stop slave;  とし
drop database skt;  としてから、新たにデータベースを作り直すことになります。

Q2:うまく同期されてないときどうするか?
>show slave status\G
でslave_IO_RunningがNoならば
>stop slave;
>reset slave;
ここで、⑤のCHANGE MASTER TO~を再度実行
>start slave;
を一度試してみてください。

Q3:Q2の方法でも、うまく動作しないときはどうするか?
my.ini(Windows)、my.cnf(Ubuntu)に次の設定をしてみてください。
[mysqld]
slave-skip-errors=1062,1050,1146,1136,1580
の行を追加したあと、Ubuntuならばservice mysql restartで再起動、WindowsならコントロールパネルのサービスからMysqlを再度起動してみます。

Q4:Access denied for user 'root'@'localhost' (using password: NO)というエラーが出る。
以下の方法はhttp://www.goofoo.jp/2011/11/1457を参照させていただきました。
service mysql stop
mysqld_safe --skip-grant-tables &
mysql -u root
でmysqlのコマンドプロンプトに入れます。

mysql> use mysql;
念のためuserテーブルを全件削除してから、設定を実行。
mysql> truncate table user;
mysql> flush privileges;
mysql> grant all privileges on *.* to root@localhost identified by 'password' with grant option;
実行結果を確認します。
mysql> select host, user from user;
+-----------+------+
| host      | user |
+-----------+------+
| localhost | root |
+-----------+------+
1 row in set (0.00 sec)
これでrootユーザへの権限設定ができましたので、MySQLを–skip-grant-tablesオプションなしで再起動(通常起動)します。
mysql> quit;
service mysql restartでPIDを確認後
[root ~]# kill -KILL [mysql のPID]
[root ~]# service mysql start
mysql を起動中:                                           [  OK  ]
最後に、遭遇したエラーが解消されていることを確認します。
[root ~]# mysql -u root -pパスワード
以上の操作でもうまく、mysqlのコマンドプロンプトが使えない場合
GUIで、Ubuntuのアップデートをしてみる。
これでも、だめな場合
mysqld_safe --skip-grant-tables &として
エラーを見ながら不足するパッケージをいてみる
mysql -u root -pで再度ログインしてみる。

Q5:OSのアップデートしたら、同期しなくなった。
まれに、Ubuntuのアップデートで、Mysqlのバージョンが変わったりすると、違うバージョン間のレプリケーションがうまくいかないことがあるようです。(WindowsのMysqlのバージョンが更新されないため、レプリケーションサーバにWindowsがあったりすると起こりえます。)
再度レプリケーションの修復設定をしたい場合以下のように行います。
①コマンドプロンプトを右クリックし管理者権限で開く
②エクスプローラーで、C:\ProgramFiles\mysql????\binのフォルダのパスを探し、コピーし、コマンドプロンプト内でcd C:\ProgramFiles\my….と貼りつける
※masterのPCでmysqlをアップグレードした場合、
 mysql_upgrade -u repl -pエンター  でアップグレードする。
③mysql -u repl -pエンター
④show slave status\Gエンター
⑤Last_errorの欄のエラー番号をひかえる
⑥C:\ProguramdataフォルダのMysqlのフォルダのmy.iniにスキップしたいエラー番号を追加します。
[mysqld]
slave-skip-errors=1062,1050,1146,1136,1580
最後の行の番号がこれまで、エラーが起きて追加してきた番号です。
ただし、必要な処理がスキップされてしまわないように、追加する番号は、状況をよく見て決めます。場合によっては、再度、マスターをロックして、ダンプデータのコピー、MASTER_LOG_FILEデータ、MASTER_LOG_POSデータの取得をやり直す必要も出てくると思います。

レプリケーションの設定の実際

○ 新たにスレーブのPCとして追加したいとき設定変更が必要なところ
・/var/lib/tomcat7/webapps/SGW/WEB-INF/web.xmlの一部を変更する必要があります。
<context-param>
<param-name>master_hostname</param-name>
<param-value>ここにマスターのPCのipアドレスを入力</param-value>
</context-param>
とします。
 マスターのMYSQLのあるホストのIPアドレスを指定することで、書き込みはすべていったんマスターのMyqlに保存されます。読み込みは、通常通りスレーブのPCからするので、変更不要です。
 つまり、スレーブでの書き込みは、スレーブのWebアプリで入力受付→マスターのMysqlに保存→スレーブへレプリケーション(転送)(スレーブのMysqlに保存)という流れになります。

・drop database skt;としてから、新たにsktのデータベースを作成し直します。
方法は以下の通りです。

 マスターのMySQL サーバーを「A」と呼ぶことにします。新たに追加する MySQL サーバーを「B」を Slave サーバーだとします。
※のついたところは、すでに、マスターの設定ができていれば不要です。

①Bサーバの構築
mysql > create database skt character set utf8;

※②Aサーバにレプリケーション用ユーザ作成とmy.cnfの設定
mysql > GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.1.0/255.255.255.0' IDENTIFIED BY 'password';
/etc/mysql/my.cnf 内に追加設定します# vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1001
ここまで設定したら
>service mysql restartで
Aサーバを再起動します。

③Bサーバにレプリケーション用サーバ作成とmy.cnfの設定
mysql > GRANT ALL PRIVILEGES ON *.* TO 'repl'@localhost IDENTIFIED BY 'password';
# pico /etc/mysql/my.cnf
※ただし、Windowsの場合はmy.iniというファイルに設定する。
[mysqld]
log-bin=mysql-bin
server-id=1002
1002という番号は、複数のスレーブがある場合それらと重複しないようにします。

Bサーバーを再起動します。

※④Aサーバのログ位置の確認とデータベースのデータ取り出し
ここで、AサーバのMysqlにロックがかかります。
mysql > FLUSH TABLES WITH READ LOCK;
mysql > SHOW MASTER STATUS;
+----------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+-----------+--------------+------------------+
| mysql-bin.000031 | 285 | | |
+----------------------+-----------+--------------+------------------+
という表示の mysql-bin.000031 と 285 の2つの値をメモしておきます。
# mysqldump -u root -p skt --lock-all-tables > skt.sql
これで指定した skt データベースのダンプを skt.sql というファイルに取得することができます。
取得後は再度もう一つのターミナルに戻って以下のコマンドを実行し、ロックを解除します
mysql > UNLOCK TABLES;

⑤Bサーバへのskt.sqlデータのコピー と データのBサーバへの展開、2つの値の設定
④で取得したスナップショットファイル(skt.sql)を、B サーバに転送します。
# mysql -u repl -p skt < skt.sql
として、Bサーバにデータを展開します。
mysql > CHANGE MASTER TO
MASTER_HOST='マスターのipアドレス',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000031',
MASTER_LOG_POS=285;
として、先ほどの2つの値等を設定します。

mysql > START SLAVE;
これで、レプリケーションがスタートします。

レプリケーションの下準備

○ 添付ファイルの扱いについて ~レプリケーションの設定の前に必要なこと~
グループウエアのメッセージや各種データは、Mysqlのデータベースで同期をとりますが、添付ファイルは、各サーバに置かず、マスターサーバへのリンクで対応させています。まず、その方法について説明します。
・スレーブがwindowsの場合
 c:\tenpuを\\マスターサーバのipアドレス\tenpuへのシンボリックリンクとして作成する。
(あらかじめ、マスターサーバのtenpuフォルダの共有設定をしておく必要がある)
管理者権限でコマンドプロンプトで
mklink /d c:\tenpu \\マスターサーバのipアドレス\tenpuとすればよい。
※また、画像挿入の機能を追加してからは、ユーザーから見えるパスを../tenpu/ではなく
http://マスターサーバのipアドレス:8080/tenpu/に変更する必要があります。(サーバがLinuxだけであれば、変更不要です。Windowsが1台でも含まれていたら、すべてのサーバの設定をこのように変更する必要があります。)
・スレーブがUbuntuの場合
/etc/init.d/winmountというスクリプトを置いて、起動時実行するようにする。
ファイルの中身
(sleep 30というコマンドについて:起動時30秒ぐらいしてからマウントしないと うまくマウントできないようです。)
#!/bin/sh
sleep 30
sudo mount -t cifs -o username="user",password="" //マスターサーバのipアドレス/tenpu /mnt/windows
この/etc/init.d/winmountを/etc/rc.localに記述しておくとよい
chmod +x /etc/init.d/winmountとしておく。
/mnt/windowsに/tenpuのシンボリックリンクをはる

ユーザーマニュアル

●ユーザーマニュアル
・画面内のラベル等にマウスをかざすと使い方が表示されるようにしてあり、なるべくマニュアルを頼らなくてもいいようにしています。

1 ログインについて
「http://サーバ名:8080/SGW/Login」にアクセスします。
 初期設定では、ユーザー名がadmin パスワードがpassになっています。
 クッキーの保存できるようになっていれば、2回目以後はhttp://サーバ名:8080/SGW/top.jsp
 にアクセスすることで自動的にログインしたことになります。

2 TOP画面について
(1)今日の予定、明日以降の予定は、エクセルの予定表を自動的に読み取るようになっています。
 予定表の形式は以下の通りです。添付されているyotei.xlsxを参考にしてみてください。
・各シート名が4月から3月そして最後が4というシートにまでとなっていること。「4」というシートは、3月のときだけ、翌月(次年度の4月)のデータを表示させたいとき使用
 するシートです。4月になったら、「4月」のほうを読み取るようになっています。
・A列が日付、B列が曜日、C列以降は、各項目名になっていること。
  表示したい項目は
メニューの設定→各種設定→ファイルの保存場所等の画面を開きます。
「予定表エクセルデータから抽出する項目」の欄に設定します。
   例。,,[会議等],[行事等],[当番],[備考],,,,,  (,)は余裕を持って少し多めに入力しておきます。
・予定表エクセルファイルの保存場所は、上記と同じ画面で「予定表エクセルファイルの保存場所およびファイル名」の欄に入力します。
   例。/kyoyu8/H26yotei.xlsx(Linuxの場合)  サーバ内のパスとファイル名で指定します。共有上に置くことも可能です。その場合は「\\\\共有名\\ファイル名」のようにして指定します。
・xls形式も、xlsx形式のいずれにも対応します。

(2) お知らせについて
・「新規」をクリックして、件名、内容を入力します。添付ファイルをつけたいときは、「参照」をクリックしてファイルを選択して下さい。大きなファイルはアップロードに時間がかかるので、「ファイルのアップロード終了!次の操作に移ってもだいじょうぶです」というメッセージが出るまで待って下さい。
・掲載開始日と掲載終了日も指定できます。
・添付ファイルの保存場所は、メニューの設定→各種設定→ファイルの保存場所等を開いて設定します。
  「添付ファイル保存場所(サーバからみた場所)」と「添付ファイル保存場所(ユーザーからみた場所)」の2カ所で設定する必要があります。
<例1 Linuxサーバ内におく場合> (詳細は、TOMCATの資料参照)
コンテキストの設定は<Context path="/tenpu"   docBase="/kyoyu/tenpu" ~ />
/kyoyu/tenpu/(サーバから見た場所)   ../tenpu/(userから見た場所)
 <例2 Windows共有サーバに置く場合>
コンテキストの設定は<Context path="/HomeICT" ~ docBase="\\192.168.1.1\HomeICT" />
\\\\サーバ名\\HomeICT\\(サーバから見た場所)../HomeICT/(userから見た場所)

・「編集」「削除」は、メッセージの作成者のみが可能です。
・「非表示設定」は、自分の所属しない部門への連絡を非表示にしたい場合に使います。あらかじめ、件名につけるキーワードを学校内で決めておき(例。「○○部> □□のお知らせ」であれば「○○部>」の部分)そのキーワードが含まれている場合は、そのメッセージを非表示にする機能です。自分が所属しない部門のキーワードをスペース文字で区切って複数設定できます。一度設定したキーワードは保存されます。(注:ただし、キーワードには#、*、?、_、!、%は使えません。)
・「検索」は期間を指定して、検索ボタンを押すことで、過去や先々のメッセージを確認できます。
また、テキスト欄に文字を入力すると、その文字を件名や内容に含むメッセージを検索します。過去に掲載した内容を調べたいときに活用できると思います。

(3)回覧について
・「新規登録」をクリックして、件名、内容を入力します。宛先の欄をクリックして、左欄で、全職員か、グループを選択します。それに応じて右欄に職員名が表示されるので、全員を選択したいときは、右上のチェックボックスをチェックします。個別にチェックをすることもできます。
・「編集」「削除」は、メッセージの作成者のみが可能です。
・添付ファイルについては、「お知らせ」と同様の方法でアップロードできます。
 なお、添付ファイルは、すでに同一名のファイルがアップロードされているときは、ファイル名の最後に(1)、(2)という番号が付加されます。

(4)月予定について
・右上の欄で、指定した月の予定を確認することもできます。
・エクセルにあるすべての項目が表示されます。

(5)授業変更について
・初期設定は、最新20件表示に設定されていますが、必要に応じて変更できます。
・「新規登録」をクリックして、日付、校時、クラス名、教科等、担当を入力します。
・「今日の予定」に、その日と次の日の授業変更があれば、「授業変更があります」と表示されます。その文字にマウスを重ねると、予定表が表示されます。

(6)リンクについて
・学校内で、共有したいリンクがあれば、このページに登録します。
・「新規登録」をクリックして、表示名とURLを入力します。URLは、インターネット上のものでも、ローカルネット上のものでもかまいません。
・添付ファイルのフォルダが共有サーバにある場合は、URLに「http://サーバ名:8080/tenpu/H26○○.pdf」のように入力することで、全体からアクセスすることも可能です。

(7)設定について
①ログインパスワードの変更
  自分がログインするときのパスワードを変更することができます。
②メールについて
・メールチェックの設定  自分のメールアカウント名、パスワード、pop3サーバ名を入力して保存しておくと、「今日の予定」の欄内に、メールが届いている旨のメッセージが表示され、その文字にマウスを重ねると、届いたメールの件名が表示されます。ただし、メールの本文は、メールソフトでないと受信できません。なお、別ソフト「NotifySGW」を使うことで、新着メールがあったことをタスクトレイに表示させることもできます。
・メール配信設定  この画面の、「配信を希望するメールアドレス」欄に入力したメールアドレスに、お知らせや回覧の内容を添付ファイルを含めて転送します。設定に際しては、セキュリティポリシーに従う必要があります。
「件名の連絡を希望するメールアドレス」欄に入力したメールアドレスには、お知らせや回覧の件名のみ転送します。

③職員の設定について
・ID一覧の画面では、「追加」をクリックし、氏名(全角可)、user(半角英数字のみ)を入力し、「送信」のクリックで職員が新規登録されます。
 編集したいときは、編集したい職員の行を選択して、編集が終わったら、Enterキーを押します。
・グループ登録の画面では、「追加」をクリックし、「グループ名」を入力し、メンバーをCtrlキーを押しながら、マウスで選択していきます。確定したら「送信」をクリックし、最後に、Enterキーを押します。 編集の際も、メンバーの選択のときは、Ctrlキーを押しながら行って下さい。そして最後にEnterキーを押します。

④お知らせ、回覧メッセージの一括削除について
・メッセージが増えてきて、ページの表示速度に影響が見られるようになったときは、古いメッセージを適宜一括削除できるようにしてあります。
・設定>各種設定>ファイルの保存場所等のページで
 <<<<メッセージの一括移動または削除>>>> という項目のところで行います。
いずれも、メッセージ番号を指定すると、その番号以下のメッセージを一括で処理します。メッセージ番号は、「お知らせ」や「回覧」の一覧にある「編集」または「削除」のボタンにマウスをかざすと、「○番目のメッセージです。」と表示されるのでそれを参考にしてください。番号を入力するときは先頭に半角#をつけてください。
・「お知らせ」について
 いったん、「お知らせデータの過去データ領域の移動」を選択し実行します。次に「過去データ削除」を選択し実行します。
・「回覧」について
 「回覧データの削除」を選択します。

⑤adminについて
・「お知らせ」や「回覧」の一覧に、「編集」「削除」が表示されるのは、自分が作成したメッセージのところのみですが、自分のユーザー名を一時的に「admin」に変更すると、すべてのメッセージに「編集」「削除」が表示されるようにしてあります。自分のユーザー名は、メニューの設定>職員>ID一覧で変更可能です。

⑥セキュリティについて
・校内でのメッセージ伝達を目的としているグループウエアです。機密性を要するデータを扱うことはできません。

設定 および Q&A

●設定について
・Windows用、Ubuntu用の2種類のセットアップファイルを用意したので、それぞれのセットアップマニュアルを見ていただければ、セットアップ可能です。
・万が一、うまく動作しない場合は、以下のQ&Aを参考にしていただければと思います。

Q1:最初のログインがうまくいかない。
A:Mysql(データベース)にうまくアクセスできてない可能性があります。以下のようにweb.xmlに、MYSQLのHostname,ユーザーIDとパスワードを設定する必要があります。
<context-param>
           <param-name>hostname</param-name>
           <param-value>localhost</param-value>
</context-param>
<context-param>
           <param-name>mysqluser</param-name>
           <param-value>root</param-value>
</context-param>
<context-param>
           <param-name>mysqlpass</param-name>
           <param-value>pass</param-value>
</context-param>

Q2:添付ファイル名が全角だと文字化けがあったり、添付ファイルのダウンロードができない。
Mysql関連の設定では、Windowsの場合、my.ini Ubuntuの場合/etc/mysql/my.cnf の設定ファイルを確認します。
[client]
default-character-set=utf8 
[mysqld]
character-set-server=utf8
[mysql]
default-character-set=utf8
srver.xmlに以下のようにConnectorの要素に URIEncoding="UTF-8"を追加なっているか確認します。
  <Connector port="8080" protocol="HTTP/1.1"  connectionTimeout="20000"  redirectPort="8443" URIEncoding="UTF-8" />

Q3:添付ファイルの保存場所をディフォルトから変更したい
プログラム内で、Webルートに一時的に添付ファイルを保存してから、同名ファイルチェックを行い、もし同名ファイルがあれば、ファイル名に(1)、(2)という番号を付加してから、指定したフォルダに移動する仕組みになっているため少し複雑な設定になってしまいました。

<例1 Linuxサーバ内におく場合>
Catalina/localhostに tenpu.xmlというファイルを作成.中身はたとえば以下のとおりです。(または、server.xmlにも記述できるようですが)
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/tenpu" docBase="/media/kyoyu/tenpu" antiResourceLocking="false" privileged="true" />
この場合は、SGWでの設定では、/media/kyoyu/tenpu/(サーバから見た場所)  ../tenpu/(userから見た場所) のようにする。
<例2 Windows共有サーバに置く場合>
HomeICT.xmlの中身
<Context path="/HomeICT" reloadable="true" docBase="\\192.168.1.1\HomeICT" workDir="D:\apache-tomcat-7.0.28\webapps\SGW\work" />
この場合は、SGWでの設定では \\\\192.168.1.1\\HomeICT\\(サーバから見た場所)../HomeICT/(userから見た場所)

Q4:予定表が使えるようにしたい
予定表は、たとえばLinuxサーバ内であれば /media/kyoyu/tenpu/yotei.xlsx
共有サーバであれば\\\\192.168.1.1\\HomeICT\\yotei.xlsxなどともできる。

予定表の項目名は、SGWの設定で ,,,,,,,,[全体],[公車],,,,,,,,,,,,[出張],,,,,,,,,,,のような入力欄があるので、ここで設定できる。
カンマがエクセルデータの列数より少ないとエラーが出る可能性あるので、最後のほうに余裕を持たせて、カンマを少し多めに入れておいてください。
[]の項目名がないところは、たとえデータがあっても、表示しないようにしています。
予定表の形式については A列に日付、B列に曜日となっている必要がある。曜日がない場合は、曜日をプログラム内で計算するようにしている。


Q5 予定表が表示ならない
エクセルはすぐに表示なるか(マクロがあったり、リンクがうまく更新できなかったりしてないか)。

Q6  最初のログイン画面がエラーでうまく表示されない
・サーバー名:8080からtomcat管理画面が表示なるか確認する。
ならないときは、tomcatが起動なっているか確認する。
・サーバー名:8080/SGW/Login でアクセスしているか確認する。

Q7 Windowsで、mylogoが表示されない
Tenpu.xmlの中の設定はC:\kyoyuのような形式にする。

Q8 Linuxでのセットアップ(setup.sh)がうまくいかない。
・途中でネットワーク関連のエラーが出ていると思われるときは、ブラウザ等でネット接続を確認する。
・プロキシー(認証が必要な場合もある)の設定が必要な場合、以下のような設定が必要です。
/etc/apt/apt.confの中に以下のような設定を追加してください。
Acquire::ftp::proxy "ftp://ユーザー名: パスワード@ホスト名:ポート名/";
Acquire::http::proxy "http://ユーザー名: パスワード@ホスト名:ポート名/";
Acquire::https::proxy "https://ユーザー名: パスワード@ホスト名:ポート名/";
認証が不要であれば
Acquire::ftp::proxy "ftp://ホスト名:ポート名/";
Acquire::http::proxy "http://ホスト名:ポート名/";
Acquire::https::proxy "https://ホスト名:ポート名/";

Q9 添付ファイルが保存ならない
保存先を別に指定している場合(複数台サーバで運用しているときなど)、指定されているフォルダのアクセス制限が厳しい場合があります。
制限をゆるくしてみてください。(とくにLinuxの場合)

2016年5月1日日曜日

Webアプリケーション高速化のヒント

Tomcat7を利用していますが、様々なノウハウの記載されているリンクを紹介します。

web.xml関連
http://qiita.com/shintaness/items/1f36e04758627b2bf9cb

ExpiresFilter
http://imagination-i.net/2013/12/17/tomcat-pagespeed-insights%E3%81%AE%E6%8F%90%E6%A1%88%E3%81%AB%E5%AF%BE%E5%BF%9C%E3%81%99%E3%82%8B-1-%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5/


メモリ割り当て関連
http://www.kumoyanet.com/514/

圧縮転送
http://www.seifi.org/css/how_to_boost_your_javascript_and_css_performance.html

Mysqlのレプリケーションについて

 学校では、CPU、メモリ等が十分なサーバを用意できずスペックの古いPCをサーバとして利用しなければならないこともあると思います。また、朝の限られた時間にアクセスが集中するということもあります。
 Mysqlのレプリケーションが必要になることは、それほどないとは思いますが、PCの速度、利用者人数など勘案して冗長性を持たせたいこともあるかと思います。グループウエアSGWを複数のサーバで同期をとりながら、利用することで、アクセス集中を緩和できます。

2016年4月23日土曜日

サンプル画像

グループウエアSGWのサンプル画像です





ソフトの概要

学校向けのグループウエアです。
・使用言語等 Java Tomcat7 Mysql
 jqueryを利用することで、なるべくajaxの機能も取り入れるようにしています。
・主な機能
  10日間の予定表示、お知らせ(掲示板)、メールチェック、メールによる配信、回覧、授業変更、予定表、共有リンク、マイロゴ等
・特徴 ~エクセルとの連携~
 エクセルの月毎(シート)の予定表を読み込んで、予定表示するようにしています。したがって、グループウエア表示のために、予定を書き込む必要がありません。普段使っている予定表(学校現場ではエクセルが多い)をそのまま、共有フォルダに置いておくだけでデータを読み取ってくれます。

グループウエアSGWについて

 Javaを使いWindows、Linux両用のシンプルな学校向けグループウエア(SGW)を作ってみました。本サイト(ブログ)は、その使い方や関連ソフトについてまとめたものです。
 グループウエアでは、通常Webページで予定を入力することが多いと思いますが、このソフトでは普段使っているエクセルの予定表をそのまま読み取れるようにしています。他にもオリジナルの機能がいろいろありますので、ぜひお試しください。