:>/dev/null

ラガードエンジニアの不撓不屈の精神/unlearning/go beyond

MacのCPU温度、ファンスピードなどをターミナル表示する方法

夏場にPC(MacBook)を使用している場合、熱を多く持ち高熱(60℃後半)になることがしばしばあります。
FANはフル稼働していますが、排熱が間に合わず、熱暴走によって動作が重くなる/突然フリーズするなど発生する為、夏場の温度管理は必要です。
iStatsというソフトを使うとMacの各温度状態(CPUの温度、バッテリーの温度、メモリ周辺の温度、CPU/GPU ヒートパイプ周辺の温度など)が分かって便利。

インストール方法

# iStatsのインストール
sudo gem install iStats -n /usr/local/bin

# 実行
istats

# help(コマンド一覧)
istats -h

# 全てのセンサーをスキャンしてターミナルに表示
istats scan

# 全てのセンサー情報をistatsに表示
istats enable all
インストール時にエラー発生する場合
ERROR:  Could not find a valid gem '******' (>= 0), here is why:
          Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv2/v3 read server hello A: tlsv1 alert protocol version (https://rubygems.org/latest_specs.4.8.gz)

下記リンクに従って対応
Bundler: How to troubleshoot RubyGems and Bundler TLS/SSL Issues

istatsの実行結果
f:id:oguguman:20190825201939p:plain

  • 上記結果の説明
    • CPU温度: 45.5℃
    • ファンスピード: 2001rpm(rpmは1分間あたりの回転数)
    • バッテリーの状態: Good
    • バッテリーの温度: 28.09℃

CPUの適正な温度
適正な温度に関して明確化な指針は不明ですが、上限値はノート型の場合は100℃近辺まで耐えられるようです。
適正値がわからない為、そこに達しない範囲で利用するのが無難かと思います。

アンインストール方法

# sudo gem uninstall iStats

XtraBackup(innobackupex)を使用したMySQLバックアップ(no-lock)

mysqldumpを使用したレプリケーション構築を作成するとします。このとき、mysqldumpに--master-dataを付与すると"FLUSH TABLES WITH READ LOCK" が発行され、一瞬のあいだ、全テーブルがロックが発生します。

mysqldump -uroot -pxxxxxxxx --single-transaction --master-data=2 --all-databases | gzip >  mysqldump.sql.gz  

2095627 Query FLUSH TABLES WITH READ LOCK
2095627 Query SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2095627 Query START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */
2095627 Query SHOW MASTER STATUS
2095627 Query UNLOCK TABLES

上記のような状況を回避して、MySQLマスターをロックせずレプリケーションを構築するためにXtraBackupを利用します。
通常、innobackupexを用いたバックアップを実行した場合、ロックを発行するのですが、 --no-lockで回避可能です。
--no-lock オプションを付与すると、binlogのポジションが記述されるはずの xtrabackup_binlog_info ファイルが作成されません。
しかし、--apply-logコマンドでリカバリ用のファイルを作成すると、ログにbinlogのポジションが出力されます。これを利用してレプリケーションを構築できます。

バックアップ

(1)ツールインストール

# rpm -Uhv http://www.percona.com/redir/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
# wget https://www.percona.com/redir/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm
# rpm -ivh percona-release-0.1-6.noarch.rpm
# yum install xtrabackup

(2)バックアップフォルダ作成

# mkdir -p /tmp/xtrabackup/

(3)既存データバックアップ

# innobackupex --ibbackup=xtrabackup --slave-info --safe-slave-backup --user root --password "" /tmp/xtrabackup/ --no-lock
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

innobackupex: Using mysql  Ver 14.14 Distrib 5.1.60, for unknown-linux-gnu (x86_64) using readline 5.1
innobackupex: Using mysql server version Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

.... snip ...

xtrabackup: Creating suspend file '/tmp/xtrabackup/2019-07-30_18-58-30/xtrabackup_suspended' with pid '3023'
xtrabackup: Transaction log of lsn (49192) to (49192) was copied.
innobackupex:: Starting slave SQL thread
^@190730 18:58:47  innobackupex: Connection to database server closed

innobackupex: Backup created in directory '/tmp/xtrabackup/2019-07-30_18-58-30'
innobackupex: MySQL slave binlog position: master host '10.131.10.99', filename 'master-bin.000022', position 2089
190730 18:58:47  innobackupex: completed OK!

下記エラーが発生した場合

xtrabackup: Error: Please set parameter 'datadir'
innobackupex: Error: ibbackup child process has died at /usr/bin/innobackupex line 386.

xtrabackupはmy.cnfを参照する仕様の為、「datadir」を記載する必要がある。

[mysqld]
datadir=/var/lib/mysql/

(3)データ転送

# tar zcvf xtrabackup.tar.gz xtrabackup/2019-07-30_18-58-30/
# su - test
$ scp -i ~/.ssh/private.pem /tmp/xtrabackup.tar.gz xxx.xxx.xxx.xxx:/tmp/

リストア

(1)MySQL停止/既存データバックアップ

# /etc/init.d/mysqld stop
# mv /var/lib/mysql /var/lib/mysql.old
# mkdir /var/lib/mysql

(2) バックアップしたファイルへログの適用

# tar zxvf xtrabackup.tar.gz
# /usr/bin/innobackupex --user root --password "" --apply-log /tmp/xtrabackup/2019-07-30_18-58-30/

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

.... snip ...

[notice (again)]
  If you use binary log and don't use any hack of group commit,
  the binary log position seems to be:
InnoDB: Last MySQL binlog file position 0 1035, file name ./master-bin.000018

xtrabackup: starting shutdown with innodb_fast_shutdown = 1
190730 19:08:45  InnoDB: Starting shutdown...
190730 19:08:45  InnoDB: Shutdown completed; log sequence number 50700
190730 19:08:45  innobackupex: completed OK!

(3)データファイルのリストア

#  /usr/bin/innobackupex --copy-back /tmp/xtrabackup/2019-07-30_18-58-30/

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona LLC and/or its affiliates 2009-2013.  All Rights Reserved.

This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

.... snip ...

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/tmp/xtrabackup/2019-07-30_18-58-30'
innobackupex: back to original InnoDB log directory '/var/lib/mysql/'
innobackupex: Copying '/tmp/xtrabackup/2019-07-30_18-58-30/ib_logfile1' to '/var/lib/mysql/'
innobackupex: Copying '/tmp/xtrabackup/2019-07-30_18-58-30/ib_logfile0' to '/var/lib/mysql/'
innobackupex: Finished copying back files.

190730 19:10:29  innobackupex: completed OK!

(4)MySQL起動

# chown -R mysql:mysql /var/lib/mysql
# /etc/init.d/mysql start

(5)レプリケーションの復旧
スレーブでのバックアップ--slave-infoオプション指定してバックアップを取得するとxtrabackup_slave_infoファイルが作成されます。
バックアップ時点のmaster_log_fileとmaster_log_positionが記述されたファイルが記録されています。
これを元にしてCHANGE MASTER構文を実行することでスレーブが復旧します。

# cat /var/lib/mysql/xtrabackup_slave_info
CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000022', MASTER_LOG_POS=2089

# mysql -uroot
mysql> change master to master_host='xxx.xxx.xxx.xxx', master_user='repl', master_password='******', master_log_file='master-bin.000022', master_log_pos=2089;

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000022
          Read_Master_Log_Pos: 2089
               Relay_Log_File: localhost-relay-bin.000002
                Relay_Log_Pos: 252
        Relay_Master_Log_File: master-bin.000022
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

「Slave_IO_Running」と「Slave_SQL_Running」がともに「Yes」となっていれば、レプリケーション設定完了。

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

ref)
https://www.submit.ne.jp/428
https://takeshiyako.blogspot.com/2015/03/mysql-innobackupex-no-lock.html
http://buta9999.hatenablog.jp/entry/20131120/1384972041
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0059
https://qiita.com/isobecky74/items/eb38447e02f05ba4386b

MySQLの各Versionを跨いだ多段レプリケーション構成構築手順

前回の記事( MySQL+groonga+mroonga構築手順 - :>/dev/null )でレガシーシステムから現時点(2019/07/18)の最新Versionにアップデートする手順を検証したが、多段レプリケーションを用いた構成で再検討したので作業記録メモを残す。
多段構成として5.1 → 5.5 → 5.6 → 5.7の順でレプリケーションを行い、データ反映完了後、最終的に現master(5.1)と新master(5.7)間でスイッチオーバーさせ切り替える。
一気に最新までアップデートを行い手順を簡略化させたが2世代またいだレプリケーションはサポート対象外の為、数珠つなぎで1バージョン毎にアップデートを行う。

  • 以下各Version毎の構築要件
    • OS:CentOS7.6 x86_84 ← OSは全てこのVerで統一
MySQL Groonga Mroonga
5.1.60 2.10 2.1.0
5.5.62 4.10 4.10
5.6.44 9.0.4 9.0.3
5.7.26 9.0.4 9.0.4
現Master(5.1)
   -> relay(5.5)
       -> relay(5.6)
           -> relay(5.7) ← バージョンアップ後、Master
  • 各バージョンのSQL_MODEに関して
    • バージョン毎で設定値に変更が発生してる為、現Master構成の「設定なし」に統一
      • 5.1.60
        • 設定なし
      • 5.5.62
        • 設定なし
      • 5.6.44
        • NO_ENGINE_SUBSTITUTION
      • 5.7.26
        • ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

sql_mode設定
各環境の/etc/my.cnfの[mysqld]セクションに「sql_mode=''」を設定し、sql_modeのバージョン依存を改善する

◎ 各Version環境構築

■ インストール&設定

MySQL5.1.60 + Mroonga2.10(Groonga2.1.0) 構築手順

構築手順に関しては MySQL+groonga+mroonga構築手順 - :>/dev/null を参照
Replication構成に関しては MySQL+groonga+mroonga移行手順(バージョンアップ) - :>/dev/null のReplication構成部分を参照

● Masterデータ取得先として、Slaveの一台をレプリケーション停止→dump→リストアを行う。

既存Slaveから複製 dumpファイル出力の為、slave停止

# mysql -uroot -p
 
mysql> stop slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000022
          Read_Master_Log_Pos: 383
               Relay_Log_File: mysql-relay-bin.000027
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000022
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「No」となっていれば、レプリケーション停止。

dumpファイルのステータス状況確認
ダンプした時点の、マスターのバイナリログファイル名(MASTER_LOG_FILE)と開始位置(MASTER_LOG_POS)を確認する。

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000019
          Read_Master_Log_Pos: 270
               Relay_Log_File: mysql-relay-bin.000019
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000019
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 270
              Relay_Log_Space: 557
              Until_Condition: None

対象DBのデータdump

# mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -B db1 > /tmp/mysql51.sql

slave再開

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000019
          Read_Master_Log_Pos: 270
               Relay_Log_File: mysql-relay-bin.000019
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

対象DBのdumpファイルをslaveDBへ転送

$ scp -i ~/.ssh/private.pem /tmp/mysql51.sql xxx.xxx.xxx.xxx:/tmp/

参考)
以下Masterノードからdumpデータを取得する場合の手順

レプリケーションユーザー登録

# mysql -uroot

mysql> use mysql;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.0/255.0.0.0' IDENTIFIED BY '******';
mysql> select user, host from user\g;
+-------+--------------------+
| user  | host               |
+-------+--------------------+
| repl  | 10.0.0.0/255.0.0.0 |
+-------+--------------------+

mysql> show grants for repl@'10.0.0.0/255.0.0.0';
+---------------------------------------------------------------------------------------------------------+
| Grants for repl@10.0.0.0/255.0.0.0                                                                      |
+---------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.0/255.0.0.0' IDENTIFIED BY PASSWORD '****************' |
+---------------------------------------------------------------------------------------------------------+

binファイルのステータス状況確認
ダンプした時点の、マスターのバイナリログファイル名(File)と開始位置(Position)を確認する。

mysql> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000019 |      270 |              |                  |
+-------------------+----------+--------------+------------------+

対象DBのデータdump

# mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -B db1 > /tmp/mysql51.sql

対象DBのdumpファイルをslaveDBへ転送

$ scp -i ~/.ssh/private.pem /tmp/mysql51.sql xxx.xxx.xxx.xxx:/tmp/
MySQL5.5.62 + Mroonga4.10(Groonga4.10) 構築手順

関連パッケージ

# yum install wget tar gcc-c++ make mecab-devel
# yum remove mariadb-libs

MySQLリポジトリインストール

# rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm

MySQLパッケージ確認

# yum repolist all |grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community   enabled:      118
mysql-connectors-community-source MySQL Connectors Community - disabled
mysql-tools-community/x86_64      MySQL Tools Community        enabled:       95
mysql-tools-community-source      MySQL Tools Community - Sour disabled
mysql55-community/x86_64          MySQL 5.5 Community Server   disabled          <-ここ注目
mysql55-community-source          MySQL 5.5 Community Server - disabled
mysql56-community/x86_64          MySQL 5.6 Community Server   disabled
mysql56-community-source          MySQL 5.6 Community Server - disabled
mysql57-community/x86_64          MySQL 5.7 Community Server   enabled:      364 <-ここ注目
mysql57-community-source          MySQL 5.7 Community Server - disabled

この環境では、5.7がenabled、5.6がdisabledである。
このままインストールすると、5.7がインストールされるので、有効/無効の切り替えをする。
この切り替えをするためにはyumの設定変更用のyum-utilsパッケージが必要なので、インストールされていない場合はインストールする。

# yum list installed |grep yum-utils
yum-utils.noarch                      1.1.31-50.el7                    @anaconda

リポジトリ有効/無効切替

# yum-config-manager --disable mysql57-community  <-5.7を無効設定
# yum-config-manager --enable mysql55-community   <-5.5を有効設定

リポジトリ再確認

# yum repolist all |grep mysql
mysql-connectors-community/x86_64 MySQL Connectors Community   enabled:      118
mysql-connectors-community-source MySQL Connectors Community - disabled
mysql-tools-community/x86_64      MySQL Tools Community        enabled:       95
mysql-tools-community-source      MySQL Tools Community - Sour disabled
mysql55-community/x86_64          MySQL 5.5 Community Server   enabled:      427
mysql55-community-source          MySQL 5.5 Community Server - disabled
mysql56-community/x86_64          MySQL 5.6 Community Server   disabled
mysql56-community-source          MySQL 5.6 Community Server - disabled
mysql57-community/x86_64          MySQL 5.7 Community Server   disabled
mysql57-community-source          MySQL 5.7 Community Server - disabled

MySQLパッケージ確認

# yum info mysql-community-server mysql-community-devel
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: ftp-srv2.kddilabs.jp
 * extras: ftp-srv2.kddilabs.jp
 * updates: ftp-srv2.kddilabs.jp
Available Packages
Name        : mysql-community-server
Arch        : x86_64
Version     : 5.5.62
Release     : 2.el7
Size        : 45 M
Repo        : mysql55-community/x86_64
Summary     : A very fast and reliable SQL database server
URL         : http://www.mysql.com/
License     : Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. Under GPLv2 license as shown
            : in the Description field.

MySQLパッケージインストール

# yum install mysql-community-server
# mysql --version
mysql  Ver 14.14 Distrib 5.5.62, for Linux (x86_64) using readline 5.1

MySQL起動

# systemctl start mysqld 

自動起動設定

# systemctl enable mysqld

/etc/my.cnf作成

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=55
log_bin=mysql-bin

log_slave_updates
relay_log=mysql-relay-bin
sql_mode=''

設定反映

# systemctl restart mysqld

Groonga

# yum install https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
# yum install --enablerepo=epel groonga groonga-devel

Mroonga

# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.62.tar.gz
# tar -zxvf mysql-5.5.62.tar.gz
# http://packages.groonga.org/source/mroonga/mroonga-4.10.tar.gz
# wget http://packages.groonga.org/source/mroonga/mroonga-4.10.tar.gz
# tar -zxvf mroonga-4.10.tar.gz
# cd mroonga-4.10/
# ./configure --with-mysql-source=/tmp/mysql-5.5.62 --with-mysql-config=/bin/mysql_config
# make
# make install

mysqlにpluginを組み込む

# mysql -uroot
mysql> INSTALL PLUGIN Mroonga SONAME 'ha_mroonga.so';
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
| Mroonga            | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

/etc/my.cnf更新 (既存環境のmy.cnfを反映)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=55
log_bin=mysql-bin

log_slave_updates
relay_log=mysql-relay-bin
sql_mode=''

port = 3306
#skip-locking
skip-external-locking
skip-character-set-client-handshake
skip-name-resolve
#old_passwords ← 5.5⇔5.6間でのレプリケーションで接続エラー発生※1
key_buffer_size=64M
table_cache = 2048
##table_open_cache = 2048

[client]
port = 3306
default-character-set=ujis

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
default-character-set=ujis

[mysqlhotcopy]
interactive-timeout

設定反映

# systemctl restart mysqld

◆ Slave設定

database作成

# mysql -uroot -p
mysql> CREATE DATABASE db1 DEFAULT CHARACTER SET ujis COLLATE ujis_japanese_ci;

masterのdumpファイルをrestore

# mysql -uroot db1 < /tmp/mysql51.sql

master DBへ接続するためのパラメータ設定
ダンプした時点の、ホスト名、ユーザー、バイナリログファイル名(MASTER_LOG_FILE)と開始位置(MASTER_LOG_POS)を設定し、レプリケーションを構成する。

# mysql -uroot
mysql> change master to
    -> master_host='xxx.xxx.xxx.xxx',
    -> master_user='repl',
    -> master_password='******',
    -> master_log_file='master-bin.000019',
    -> master_log_pos=270;

slave開始/状況確認

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000019
          Read_Master_Log_Pos: 270
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「Yes」となっていれば、レプリケーション設定完了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

◆ Master設定

dumpファイル出力の為、slave停止

mysql> stop slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000022
          Read_Master_Log_Pos: 383
               Relay_Log_File: mysql-relay-bin.000027
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000022
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「No」となっていれば、レプリケーション停止。

binファイルのステータス状況確認
ダンプした時点の、マスターのバイナリログファイル名(File)と開始位置(Position)を確認する。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 |    62842 |              |                  |
+------------------+----------+--------------+------------------+

レプリケーションユーザー登録

mysql> use mysql;
mysql> select user, host, password from user\g;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.0/255.0.0.0' IDENTIFIED BY '******';

対象DBのデータdump

# mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -B db1 > /tmp/mysql55.sql

slave再開

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000022
          Read_Master_Log_Pos: 383
               Relay_Log_File: mysql-relay-bin.000027
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000022
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000022
          Read_Master_Log_Pos: 383
               Relay_Log_File: mysql-relay-bin.000028
                Relay_Log_Pos: 253
        Relay_Master_Log_File: master-bin.000022
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

対象DBのdumpファイルをslaveDBへ転送

$ scp -i ~/.ssh/private.pem /tmp/mysql55.sql xxx.xxx.xxx.xxx:/tmp/

※1 old_passwordsに関する問題
slave側で「show slave status \G;」を実行した時、下記エラー発生
[ERROR] Slave I/O: error connecting to master '@:3306' - retry-time: 10 retries: 68, Error_code: 2049
これは16文字のパスワードを持っている場合、それらは古いパスワードです。有効な41byteハッシュパスワードを持っている必要があります。
よって、old_passwordsを無効化しmysqlを起動する必要があります。

ref)
http://lucianoshow.biz/charlie/tumblr/158847295488.html
https://charlietokyojp.tumblr.com/post/158847295488/mysql-55-56%E3%81%AEoldpasswords%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%A1%E3%83%A2
http://anothermysqldba-jp.blogspot.com/2013/09/secureauthmysql.html

パスワード保存のセキュリティ警告について
「CHANGE MASTER TO」で「MASTER_USER」や「MASTER_PASSWORD」を指定すると、MySQL5.6からは警告されるようになりました。これは『スレーブサーバの「master.info」にユーザ名やパスワードがそのまま保存されるよ!』と注意してくれています。

SHOW WARNINGSオプション

(略) Message: Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information.

ref)
https://blog.apar.jp/linux/6725/

MySQL5.6.44 + Mroonga9.0.3(Groonga9.0.4) 構築手順

関連パッケージ

# yum install wget tar gcc-c++ make mecab-devel
# yum remove mariadb-libs

MySQL

# wget http://repo.mysql.com/yum/mysql-5.6-community/el/7/x86_64//mysql-community-server-5.6.44-2.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.6-community/el/7/x86_64//mysql-community-client-5.6.44-2.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.6-community/el/7/x86_64//mysql-community-devel-5.6.44-2.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.6-community/el/7/x86_64//mysql-community-common-5.6.44-2.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.6-community/el/7/x86_64//mysql-community-libs-5.6.44-2.el7.x86_64.rpm
# rpm -ivh mysql-community-*

ダウンロードサイト
https://centos.pkgs.org/7/mysql-5.6-x86_64/

mysql起動

# systemctl start mysqld 

自動起動設定

# systemctl enable mysqld

/etc/my.cnf作成

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=56
log_bin=mysql-bin

log_slave_updates
relay_log=mysql-relay-bin
sql_mode=''

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Mecab
mysql-mroongaの依存関係にあるmecabおよびgroonga関連のパッケージが必要な場合、下記インストール

# yum install mecab mecab-devel mecab-ipadic --disablerepo=* --enablerepo=groonga

→ Version指定の場合
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-devel-0.996-1.el7.centos.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-ipadic-2.7.0.20070801-13.el7.centos.1.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-0.996-1.el7.centos.x86_64.rpm
# rpm -ivh mecab-*

Groonga

# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-libs-9.0.3-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-tokenizer-mecab-9.0.3-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-9.0.3-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-devel-9.0.3-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-plugin-suggest-9.0.3-1.el7.x86_64.rpm
# rpm -ivh groonga-*

ダウンロードサイト
https://packages.groonga.org/centos/7/x86_64/Packages/

Mroonga plugin

# yum install groonga-normalizer-mysql ← 関連パッケージ

# wget http://packages.groonga.org/centos/7/x86_64/Packages/mysql-community-mroonga-9.03-1.el7.x86_64.rpm
# rpm -ivh mysql-community-mroonga-9.03-1.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:mysql-community-mroonga-9.03-1.el################################# [100%]
Redirecting to /bin/systemctl status mysqld.service
/bin/mysql -u root < /usr/share/mroonga/install.sql

Mroonga plugin確認
# mysql -uroot
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Mroonga            | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

/etc/my.cnf更新 (既存環境のmy.cnfを反映)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=56
log_bin=mysql-bin

log_slave_updates
relay_log=mysql-relay-bin
sql_mode=''

port = 3306
#skip-locking
skip-external-locking
#old_passwords
key_buffer_size=64M
#table_cache = 2048
table_open_cache = 2048
#thread_cache=512
thread_cache_size=512

[client]
port = 3306
default-character-set=ujis

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
default-character-set=ujis

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

設定反映

# systemctl restart mysqld

● Replication

◆ Slave設定

#mysql -uroot -p
mysql> CREATE DATABASE db1 DEFAULT CHARACTER SET ujis COLLATE ujis_japanese_ci;

masterのdumpファイルをrestore

mysql -uroot db1 < /tmp/mysql55.sql

master DBへ接続するためのパラメータ設定
ダンプした時点の、ホスト名、ユーザー、バイナリログファイル名(File)と開始位置(Position)を設定し、レプリケーションを構成する。

mysql> change master to master_host='xxx.xxx.xxx.xxx', master_user='repl', master_password='********', master_log_file='mysql-bin.000008', master_log_pos=62842;

slave開始/状況確認

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 545
               Relay_Log_File: mysql-relay-bin.000003
                Relay_Log_Pos: 704
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「Yes」となっていれば、レプリケーション設定完了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

◆ Master設定

dumpファイル出力の為、slave停止

mysql> stop slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 850
               Relay_Log_File: mysql-relay-bin.000003
                Relay_Log_Pos: 1009
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「No」となっていれば、レプリケーション停止。

binファイルのステータス状況確認
ダンプした時点の、バイナリログファイル名(File)と開始位置(Position)を設定し、レプリケーションを構成する。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 |   105233 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

レプリケーションユーザー登録

mysql> use mysql;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.0/255.0.0.0' IDENTIFIED BY 'replpw';
mysql> select user, host, password from user\g;
+------+--------------------+-------------------------------------------+
| user | host               | password                                  |
+------+--------------------+-------------------------------------------+
| repl | 10.0.0.0/255.0.0.0 | ***************************************** |
+------+--------------------+-------------------------------------------+

対象DBのデータdump

mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -B db1 > /tmp/mysql56.sql

slave再開

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000009
          Read_Master_Log_Pos: 850
               Relay_Log_File: mysql-relay-bin.000004
                Relay_Log_Pos: 266
        Relay_Master_Log_File: mysql-bin.000009
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

対象DBのdumpファイルをslaveDBへ転送

$ scp -i ~/.ssh/private.pem /tmp/mysql56.sql xxx.xxx.xxx.xxx:/tmp/
MySQL5.7.26 + Mroonga9.0.4(Groonga9.0.4) 構築手順

関連パッケージ

# yum install wget tar gcc-c++ make mecab-devel
# yum remove mariadb-libs

MySQL

# wget http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64//mysql-community-server-5.7.26-1.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64//mysql-community-client-5.7.26-1.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64//mysql-community-devel-5.7.26-1.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64//mysql-community-common-5.7.26-1.el7.x86_64.rpm
# wget http://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64//mysql-community-libs-5.7.26-1.el7.x86_64.rpm
# rpm -ivh mysql-community-*

ダウンロードサイト
https://centos.pkgs.org/7/mysql-5.7-x86_64/

自動起動設定

# systemctl enable mysqld

/etc/my.cnf作成

# vi /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

server-id=57
log_bin=mysql-bin
sql_mode=''

設定反映

# systemctl start mysqld

初期パスワード確認

# cat /var/log/mysqld.log | grep password

初期化(mysql_secure_installation)
# mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root: [初期パスワード]
The existing password for the user account root has expired. Please set a new password.
New password: [新しいパスワード]
Re-enter new password: [もう一度新しいパスワード]

The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: [新しいパスワード]
Re-enter new password: [もう一度新しいパスワード]

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

mysql-mroongaの依存関係にあるmecabおよびgroonga関連のパッケージが必要な場合、下記インストール

# yum install mecab mecab-devel mecab-ipadic --disablerepo=* --enablerepo=groonga

→ Version指定の場合
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-0.996-2.el7.1.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-devel-0.996-2.el7.1.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mecab-ipadic-2.7.0.20070801-17.el7.x86_64.rpm
# rpm -ivh mecab-*

Groonga

# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-libs-9.0.4-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-tokenizer-mecab-9.0.4-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-9.0.4-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-devel-9.0.4-1.el7.x86_64.rpm
# wget https://packages.groonga.org/centos/7/x86_64/Packages/groonga-plugin-suggest-9.0.4-1.el7.x86_64.rpm
# rpm -ivh groonga-*

ダウンロードサイト
https://packages.groonga.org/centos/7/x86_64/Packages/

Mroonga

関連パッケージ
# yum install groonga-normalizer-mysql

Mroonga plugin
# wget https://packages.groonga.org/centos/7/x86_64/Packages/mysql57-community-mroonga-9.04-1.el7.x86_64.rpm
# rpm -ivh mysql57-community-mroonga-9.04-1.el7.x86_64.rpm

Mroonga plugin確認
# mysql -uroot -p
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Mroonga            | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

/etc/my.cnf更新 (既存環境のmy.cnfを反映)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

validate_password_length=4
validate_password_policy=LOW

server-id=57
log_bin=mysql-bin

log_slave_updates
relay_log=mysql-relay-bin
sql_mode=''

port = 3306
skip-external-locking
table_open_cache = 2048
thread_cache_size=512

[client]
port = 3306
socket=/var/lib/mysql/mysql.sock
default-character-set=ujis

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash
default-character-set=ujis

[mysqlhotcopy]
interactive-timeout

設定反映

# systemctl restart mysqld

● Replication

◆ Slave設定

database作成

# mysql -uroot -p
mysql> CREATE DATABASE db1 DEFAULT CHARACTER SET ujis COLLATE ujis_japanese_ci;

masterのdumpファイルをrestore

# mysql -uroot -p db1 < /tmp/mysql56.sql

master DBへ接続するためのパラメータ設定
ダンプした時点の、ホスト名、ユーザー、バイナリログファイル名(File)と開始位置(Position)を設定し、レプリケーションを構成する。

mysql> change master to master_host='xxx.xxx.xxx.xxx', master_user='repl', master_password='******', master_log_file='mysql-bin.000006', master_log_pos=105233;

slave開始/状況確認

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 105233
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 317
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「Yes」となっていれば、レプリケーション設定完了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

◆ Master設定

dumpファイル出力の為、slave停止

mysql> stop slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State:
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 106336
               Relay_Log_File: mysql-relay-bin.000003
                Relay_Log_Pos: 317
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: No
            Slave_SQL_Running: No
              Replicate_Do_DB:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「No」となっていれば、レプリケーション停止。

binファイルのステータス状況確認
ダンプした時点の、マスターのバイナリログファイル名(File)と開始位置(Position)を確認する。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |    37328 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

レプリケーションユーザー登録

mysql> use mysql;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'10.0.0.0/255.0.0.0' IDENTIFIED BY '******';
mysql> select user, host, authentication_string from user \g;
+---------------+--------------------+-------------------------------------------+
| user          | host               | authentication_string                     |
+---------------+--------------------+-------------------------------------------+
| repl          | 10.0.0.0/255.0.0.0 | ***************************************** |
+---------------+--------------------+-------------------------------------------+

対象DBのデータdump

mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -B db1 > /tmp/mysql57.sql

slave再開

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000006
          Read_Master_Log_Pos: 106336
               Relay_Log_File: mysql-relay-bin.000004
                Relay_Log_Pos: 317
        Relay_Master_Log_File: mysql-bin.000006
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

対象DBのdumpファイルをslaveDBへ転送

$ scp -i ~/.ssh/private.pem /tmp/mysql56.sql xxx.xxx.xxx.xxx:/tmp/

◆ Slave Replication設定(MySQL5.7間)

masterのdumpファイルをrestore

# mysql -uroot -p db1 < /tmp/mysql57.sql

master DBへ接続するためのパラメータ設定

change master to master_host='xxx.xxx.xxx.xxx', master_user='repl', master_password='******', master_log_file='mysql-bin.000004', master_log_pos=154;

slave開始/状況確認

mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 37633
               Relay_Log_File: sql57mroo90401-relay-bin.000003
                Relay_Log_Pos: 625
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:

MySQL+groonga+mroonga移行手順(バージョンアップ)

前回の記事( MySQL+groonga+mroonga構築手順 - :>/dev/null )でレガシーシステムを検証したが、その環境を現時点(2019/07/18)の最新Versionにアップデートする必要があり作業記録メモを残す。
レガシーシステムではMySQLからgroongaをストレージエンジンとして利用する場合、mroonga plugin(MySQL組込)を使用せず直接利用する構成だが、
groongaがv3.04からmysql経由で直接使用するのを停止しmroonga経由で使用する方式に統一された為、バージョンアップ環境ではmroonga経由の構成で調査。

  • 以下構築要件
    • OS:CentOS7.6 x86_84
    • MySQL:5.7.26
    • groonga:9.0.4
    • mroonga:9.0.4

◎ 環境構築

■ インストール&設定

関連パッケージインストール

# yum install wget tar gcc-c++ make mecab-devel mysql-community-devel

mysqlインストール

# yum remove mariadb-libs ← 標準インストールされてるライブラリとの依存関係でエラーが発生する為、先行して既存ライブラリ削除
# rpm -Uvh http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
# yum info mysql-community-server ← レポジトリの対象Version確認
# yum install mysql-community-server

初期設定

# systemctl start mysqld

初期パスワード確認

# cat /var/log/mysqld.log | grep password

初期化

# mysql_secure_installation


Securing the MySQL server deployment.

Enter password for user root: [初期パスワード]

The existing password for the user account root has expired. Please set a new password.

New password: [新しいパスワード]

Re-enter new password: [もう一度新しいパスワード]
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
Using existing password for root.

Estimated strength of the password: 100 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: [新しいパスワード]

Re-enter new password: [もう一度新しいパスワード]

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

/etc/my.cnf作成

# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

# defaultではポリシーが厳しい基準の為、テスト用にパスワードポリシー変更
validate_password_length=4
validate_password_policy=LOW

## Replication 用設定
# 各MySQLサーバを識別するためのIDの設定
server-id=101

# バイナリログの有効化
log_bin=mysql-bin

# バイナリログをコミットと同時にディスクに書込む
sync_binlog=1

mysql再起動

# systemctl restart mysqld

自動起動設定

# systemctl enable mysqld
◆ パッケージインストールの場合

groonga

# yum install https://packages.groonga.org/centos/groonga-release-latest.noarch.rpm
# yum install --enablerepo=epel groonga

mroonga

# wget https://packages.groonga.org/centos/groonga-release-1.4.0-1.noarch.rpm
# rpm -ivh groonga-release-1.4.0-1.noarch.rpm
# yum install --enablerepo=epel mysql57-community-mroonga
◆ ソースインストールの場合

groonga

# wget https://packages.groonga.org/source/groonga/groonga-9.0.4.tar.gz
# tar zxvf groonga-9.0.4.tar.gz
# cd groonga-9.0.4/
# ./configure
# make -j$(grep '^processor' /proc/cpuinfo | wc -l)
# make install

mysql

# wget https://fossies.org/linux/misc/mysql-5.7.26.tar.gz
# tar zxvf mysql-5.7.26.tar.gz
# cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DMYSQL_DATADIR=/usr/local/mysql/data \
-DDEFAULT_CHARSET=utf8 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/tmp

・ソースコンパイルに必要なパッケージ/ライブラリをインストール

# yum install wget gcc-c++ cmake ncurses-devel zlib-devel readline-devel bison
# wget  http://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

※頻繁に下記エラーが発生する為、事前にライブラリをダウンロード

-- LOCAL_BOOST_DIR -- LOCAL_BOOST_ZIP -- Could not find (the correct version of) boost. -- MySQL currently requires boost_1_59_0 CMake Error at cmake/boost.cmake:81 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST= This CMake script will look for boost in . If it is not there, it will download and unpack it (in that directory) for you. If you are inside a firewall, you may need to use an http proxy: export http_proxy=http://example.com:80 Call Stack (most recent call first): cmake/boost.cmake:238 (COULD_NOT_FIND_BOOST) CMakeLists.txt:508 (INCLUDE) -- Configuring incomplete, errors occurred! See also "/tmp/mysql-5.7.26/CMakeFiles/CMakeOutput.log". See also "/tmp/mysql-5.7.26/CMakeFiles/CMakeError.log".

ref)
https://www.eastforest.jp/mysql/3521

mroonga

# wget https://packages.groonga.org/source/mroonga/mroonga-9.04.tar.gz
# tar zxvf mroonga-9.04.tar.gz
# cd mroonga-9.04/
# ./configure PKG_CONFIG_PATH=/tmp/groonga-9.0.4/ --with-mysql-source=/tmp/mysql-5.7.26-el7-x86_64 --with-mysql-build=/tmp/mysql-5.7.26-el7-x86_64 --with-mysql-config=/usr/bin/mysql_config
# make
# make install
# mysql -uroot -p < /usr/local/share/mroonga/install.sql

※configureオプション
--with-mysql-source:MySQLソースコードディレクトリーを指定
--with-mysql-build:MySQLのビルドディレクトリーを指定
--with-mysql-config:mysql_configコマンドのパスを指定

SHOW ENGINES SQLを実行することでMroongaが正常にインストールされているかを確認。Mroongaという行があれば正常にインストール済み。

mysql> SHOW ENGINES;  
+------------+---------+-----------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                 | Transactions | XA   | Savepoints |
+------------+---------+-----------------------------------------+--------------+------+------------+
...snip...
| Mroonga    | YES     | Fulltext search, column base            | NO           | NO   | NO         |
...snip...
+------------+---------+-----------------------------------------+--------------+------+------------+

ref)
https://gitter.im/groonga/ja
https://yoku0825.blogspot.com/2015/12/mysql-55mysql-57.html

◆ 動作確認

database作成

mysql> CREATE DATABASE db1 DEFAULT CHARACTER SET ujis COLLATE ujis_japanese_ci;

table作成

mysql> create table t1 (c1 int primary key, c2 varchar(255), c3 text, fulltext index(c2), fulltext index(c3)) ENGINE = mroonga DEFAULT CHARSET ujis;

サンプルデータ作成&確認

mysql> insert into t1 values(1, "明日の富士山の天気について","東京");
mysql> insert into t1 values(2, "天気予報","明日の富士山の天気は分かりません");
mysql> insert into t1 values(3, "dummy", "dummy");

mysql> select * from t1 where match(c2) against("富士山");
+-----+-----------------------------------------+-----------------------+
| c1    | c2                                                    | c3                            |
+-----+-----------------------------------------+-----------------------+
|  1     |  明日の富士山の天気について          | 東京                         |
+-----+-----------------------------------------+-----------------------+

■ Replication

Masterノード作業

Replicationユーザー作成&確認

mysql> GRANT REPLICATION SLAVE ON *.* TO repl@xxx.xxx.xxx.xxx IDENTIFIED BY '******';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> SELECT user,host FROM mysql.user;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| repl          | xxx.xxx.xxx.xxx |
+---------------+---------------+

dump中にDBが更新されないようにテーブルの書き込みロック

mysql> flush tables with read lock;

現在のバイナリログの状態を確認する

mysql> show master status;
+------------------+----------+--------------+------------------+----------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
+------------------+----------+--------------+------------------+----------------------------------------+
| mysql-bin.000002 |      194 |              |                  |       |
+------------------+----------+--------------+------------------+----------------------------------------+

データタンプ

# mysqldump -u root -p \
--single-transaction \
--flush-logs \
--master-data=2 \
--all-databases \
--hex-blob \
--triggers \
--routines \
--events > /tmp/master_db.sql

テーブルロックを解除

mysql> unlock tables;

Masterノード → Slaveノードへデータ転送

# scp -i ~/.ssh/private.pem /tmp/master_db.sql xxx.xxx.xxx.xxx:/tmp/
Slaveノード作業

/etc/my.cnf作成

## Replication 用設定
# 各MySQLサーバを識別するためのIDの設定
server-id=102

# 更新を禁止する
read_only

# スレーブSQLスレッドによって実行される更新をバイナリログに書き込む
log_slave_updates

# リレーログファイルの名前
relay_log=mysql-relay-bin

# クラッシュセーフなレプリケーション設定
relay_log_info_repository=TABLE
relay_log_recovery=ON
relay_log_purge=ON

mysql再起動

# systemctl restart mysqld

Masterノードのデータリストア

# mysql -uroot -p
 
mysql> CREATE DATABASE db1 DEFAULT CHARACTER SET ujis COLLATE ujis_japanese_ci;
mysql> use db1;
mysql> source /tmp/master_db.sql;

SlaveノードのReplication設定
(Slaveノード → Masterノードへ接続するためのパラメータ設定)

# mysql -uroot -p
 
mysql> change master to
    -> master_host='xxx.xxx.xxx.xxx',
    -> master_user='repl',
    -> master_password='******',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=194;

Replication対象DBとして設定

mysql> change replication filter replicate_do_db = (db1);

※Replication対象DBから 削除する場合
(フィルターを消すには、フィルター名をreplicate-do-db構文から削除する必要があり)

mysql> show slave status\G
...snip...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: db1
          Replicate_Ignore_DB:
...snip...

mysql> change replication filter replicate_do_db = (); ← slave未停止の場合、エラーで弾かれる
ERROR 3017 (HY000): This operation cannot be performed with a running slave sql thread; run STOP SLAVE SQL_THREAD first

mysql> stop slave;
mysql> change replication filter replicate_do_db = ();
mysql> start slave;

mysql> show slave status \G;
...snip...
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
...snip...

Replication開始

mysql> start slave;

Replicationステータス確認

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: xxx.xxx.xxx.xxx
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000004
          Read_Master_Log_Pos: 194
               Relay_Log_File: 157x112x83x169-relay-bin.000005
                Relay_Log_Pos: 367
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: db1
          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: 194
              Relay_Log_Space: 796
              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: 361e5307-a2e4-11e9-8318-0050568ca249
             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 more updates
           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
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:

ステータス結果
「Slave_IO_Running」と「Slave_SQL_Running」がともに「Yes」となっていれば、レプリケーション設定完了。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
上記正常稼働後、更新系のSQLをMasterノードで実行し変更内容がSlaveに伝播する事を確認。

◎ バージョンアップ環境設定

■ バージョンアップ(データ移行)手順

バージョンアップ環境のmy.cnfファイル生成

現構成のコピーベースですがmysql5.7へアップデートした為、一部パラメータ名変更の発生に伴い設定調整。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
 
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 
server-id=101
log_bin=mysql-bin
 
port = 3306
#skip-locking  ← 旧パラメータ(廃止)
skip-external-locking
skip-character-set-client-handshake
skip-name-resolve
back_log = 100
#old_passwords  ← 旧パラメータ(廃止)
key_buffer_size=64M
max_allowed_packet = 16M
max_connect_errors = 100000
max_connections = 8192
#table_cache = 2048  ← 旧パラメータ(廃止)
table_open_cache = 2048
sort_buffer_size = 64M
join_buffer_size = 2M
net_buffer_length = 1M
read_buffer_size = 2M
read_rnd_buffer_size = 2M
query_cache_limit=16M
query_cache_size=1024M
query_cache_type=2
#thread_cache=512  ← 旧パラメータ(廃止)
thread_cache_size=512
net_read_timeout=3600
connect_timeout=60
wait_timeout=300
open-files-limit=1000
character-set-server=ujis
tmpdir = /tmp/
 #default-storage-engine = groonga  ← 旧パラメータ(廃止)
default-storage-engine = mroonga

[client]
port = 3306
socket=/var/lib/mysql/mysql.sock
default-character-set=ujis
 
[mysqldump]
quick
max_allowed_packet = 16M
 
[mysql]
no-auto-rehash
default-character-set=ujis
 
[mysqlhotcopy]
interactive-timeout

現構成からダンプ(現環境(mysql5.1.60)の作業)

mysqlの登録済みユーザー移行準備

登録済みユーザー確認

# mysql -uroot -p
mysql> use mysql;
mysql> select user, host from user\g;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| admin         | localhost     |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
+---------------+---------------+

登録済みユーザー権限確認 移行対象ユーザーの現構成を確認。下記adminユーザーの例。

mysql> show grants for admin@localhost;
+-------------------------------------------------------------------------------------+
| Grants for admin@localhost                                                          |
+-------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '****************' |
| GRANT ALL PRIVILEGES ON `db1`.* TO 'admin'@'localhost'                              |
+-------------------------------------------------------------------------------------+

ユーザー登録に関して
バージョンアップ環境でユーザー登録が必要な為、現環境のユーザー名/権限を確認し、バージョンアップ環境で手動登録する必要がある。

old_passwordsに関して
MySQL 5.7.5移行からold_passwordsが利用できなくなり、完全に古いパスワードでログイン不可。
アップグレード前に予めold_passwordsを解除した上で、ハッシュが短いユーザーのパスワードを再設定する事で解決する必要がある。

アプリケーションデータ

dump中にDBが更新されないようにテーブルの書き込みロック

mysql> flush tables with read lock;

テーブルスキーマ

$ mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -d -B db1 > mysql51-s.sql

テーブルデー

$ mysqldump -uroot -p -c --add-drop-table=0 --skip-comments --default-character-set=ujis --order-by-primary --skip-extended-insert -t -B db1 > mysql51-d.sql

テーブルロックを解除

mysql> unlock tables;
デフォルトストレージエンジンをgroonga → mroongaへ変換
$ sed -e 's/ENGINE=groong/ENGINE=mroong/g' mysql51-s.sql
バージョンアップ環境へファイル転送
$ scp -i ~/.ssh/private.pem /tmp/mysql51-* xxx.xxx.xxx.xxx:/tmp/

バージョンアップ環境へリストア(バージョンアップ環境(mysql5.7.26)の作業)

mysqlのユーザー移行

登録済みユーザー確認

mysql> use mysql;
mysql> select user, host from user\g;
+---------------+---------------+
| user          | host          |
+---------------+---------------+
| admin         | localhost     |
| mysql.session | localhost     |
| mysql.sys     | localhost     |
| root          | localhost     |
+---------------+---------------+
現環境(移行)ユーザー登録

移行対象ユーザーの登録。下記adminユーザーの例。

mysql> grant ALL PRIVILEGES ON db1.* TO 'admin'@'localhost' IDENTIFIED BY '*******';
登録済みユーザー権限確認
mysql> show grants for admin@localhost;
+--------------------------------------------------------+
| Grants for admin@localhost                             |
+--------------------------------------------------------+
| GRANT USAGE ON *.* TO 'admin'@'localhost'              |
| GRANT ALL PRIVILEGES ON `db1`.* TO 'admin'@'localhost' |
+--------------------------------------------------------+

ユーザー権限に関して
現環境とバージョンアップ環境でユーザー登録/権限が同様に設定されている事を確認する必要がある。

アプリケーションデータ移行

テーブルスキーマ

# mysql -u root -p --default-character-set=ujis db1 < /tmp/mysql51-s.sql

テーブルデー

# mysql -u root -p --default-character-set=ujis db1 < /tmp/mysql51-d.sql

動作確認

・テーブルスキーマ

リストア後のテーブルスキーマ定義を確認。

mysql> use db1;
mysql> show create table t1 \G;
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) NOT NULL,
  `c2` varchar(255) DEFAULT NULL,
  `c3` text,
  PRIMARY KEY (`c1`),
  FULLTEXT KEY `c2` (`c2`),
  FULLTEXT KEY `c3` (`c3`)
) ENGINE=Mroonga DEFAULT CHARSET=ujis

ステータス結果
対象テーブルのスキーマ定義に下記が設定されてる事を確認。
ENGINE=Mroonga
DEFAULT CHARSET=ujis

テーブルデー

現環境とバージョンアップ環境で全文検索SQLを発行した場合、同じ結果が表示される事を確認。

# 現環境
mysql> select * from t1 where match(c2) against("富士山");
+-----+-----------------------------------------+-----------------------+
| c1    | c2                                                    | c3                            |
+-----+-----------------------------------------+-----------------------+
|  1     |  明日の富士山の天気について          | 東京                         |
+-----+-----------------------------------------+-----------------------+
 
 
# バージョンアップ環境
mysql> select * from t1 where match(c2) against("富士山");
+-----+-----------------------------------------+-----------------------+
| c1    | c2                                                    | c3                            |
+-----+-----------------------------------------+-----------------------+
|  1     |  明日の富士山の天気について          | 東京                         |
+-----+-----------------------------------------+-----------------------+

ステータス結果
現環境とバージョンアップ環境で同様の結果が表示される事が出来れば、バージョンアップ(データ移行)完了。

MySQL+groonga+mroonga構築手順

オンプレ環境でMySQL+groonga+mroonga構成を検証する機会があり、Versionは古いが知見として作業記録メモを残す。
MySQLからgroongaをストレージエンジンとして利用する場合、mroonga plugin(MySQL組込)を使用するが直接利用するケースとの違いを参考資料として共有。

  • 以下構築要件
    • OS:CentOS6.9 x86_84
    • MySQL:5.1.60
    • groonga:2.1.0
    • mroonga:2.1.0

■ 前提

MYSQLからgroongaをストレージエンジンとして使用する場合、下記パターンがあります。

① MySQLからmroongaプラグイン経由(MySQL組込)で利用する場合  
INSTALL PLUGIN groonga SONAME 'ha_mroonga.so';
mysql> show engines; →「mroonga」が表示
テーブルスキーマで「ENGINE=mroonga」指定

② MySQLから直接groongaを利用する場合
INSTALL PLUGIN groonga SONAME 'ha_groonga.so';
mysql> show engines; →「groonga」が表示
テーブルスキーマで「ENGINE=groonga」指定

Mroonga(Groonga)ストレージエンジンでのバックアップに関して

Groonga族のMroongaでのバックアップは、それぞれのRDBMSの仕組みに乗るのがよい。それぞれトランザクションレプリケーションがある。
また、MySQLの場合、InnoDBレプリケーション先としてMroongaを選ぶことができる。こうすると、(データが守られやすい)InnoDBをマスターデータとして考えることができる。

上記記載からInnoDB同様の扱いで問題ないとの認識

ref)
https://diary.kitaitimakoto.net/2016/01/15.html

■ インストール&設定

● 必要な開発ツールインストール

# yum groupinstall "Development Tools"
# yum install openssl openssl-devel readline-devel zlib-devel curl-devel libyaml-devel flex libxml2-devel zlib-devel libpng-devel libjpeg-devel libXpm-devel freetype freetype-devel

MySQLのパッケージインストール

# wget https://downloads.mysql.com/archives/get/file/MySQL-client-5.1.60-1.glibc23.x86_64.rpm
# wget https://downloads.mysql.com/archives/get/file/MySQL-devel-5.1.60-1.glibc23.x86_64.rpm
# wget https://downloads.mysql.com/archives/get/file/MySQL-server-5.1.60-1.glibc23.x86_64.rpm
# wget https://downloads.mysql.com/archives/get/file/MySQL-shared-5.1.60-1.glibc23.x86_64.rpm
# rpm -ivh MySQL-*
# rpm -qa |grep mysql

※依存関係でエラーが発生した場合、既存のライブラリ削除

# yum remove mysql-libs

● groonga/mroonga インストール

# wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.60.tar.gz
# tar zxvf mysql-5.1.60.tar.gz
# wget http://packages.groonga.org/source/groonga/groonga-2.1.0.tar.gz
# tar zxvf groonga-2.1.0.tar.gz
# cd groonga-2.1.0
# ./configure
# make
# make install
# groonga --version

# cd ..
# wget http://packages.groonga.org/source/mroonga/mroonga-2.10.tar.gz
# tar zxvf mroonga-2.10.tar.gz
# cd mroonga-2.10
# ./configure PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/ --with-mysql-source=/usr/local/src/mysql-5.1.60 --with-mysql-config=/usr/bin/mysql_config
# make
# make install
# find / -name ha_mroonga.so

● /etc/my.cnf作成

# cp /usr/local/src/mysql-5.1.60/mysql-test/include/default_my.cnf /etc/my.cnf
# vi /etc/my.cnf
...任意内容にて作成...

# /etc/init.d/mysql restart

MySQLにpluginを組み込む

# mysql -uroot -p

mysql> INSTALL PLUGIN groonga SONAME 'ha_groonga.so';
mysql> INSTALL PLUGIN mroonga SONAME 'ha_mroonga.so';
mysql> SHOW engines; (Engineのリストに「mroonga」という項目が追加されていればインストール成功です。)

※UDF関数を登録します。
mysql> CREATE FUNCTION last_insert_grn_id RETURNS INTEGER SONAME 'ha_mroonga.so';
mysql> CREATE FUNCTION mroonga_snippet RETURNS STRING SONAME 'ha_mroonga.so';
mysql> CREATE FUNCTION mroonga_command RETURNS STRING SONAME 'ha_mroonga.so';

+------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine     | Support | Comment                                                        | Transactions | XA   | Savepoints |
+------------+---------+----------------------------------------------------------------+--------------+------+------------+
...snip...
| groonga    | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
| mroonga    | YES     | CJK-ready fulltext search, column store                        | NO           | NO   | NO         |
...snip...
+------------+---------+----------------------------------------------------------------+--------------+------+------------+

※または下記で確認可能
# mroongaという行があれば期待通りです
$ mysql -uroot -p -e "SHOW PLUGINS"
+------------+----------+----------------+---------------+---------+
| Name       | Status   | Type           | Library       | License |
+------------+----------+----------------+---------------+---------+
...snip...
| mroonga    | ACTIVE   | STORAGE ENGINE | ha_mroonga.so | GPL     |
...snip...
+------------+----------+----------------+---------------+---------+

■ 障害対応

# /etc/init.d/mysql stop
Shutting down MySQL. ERROR! Manager of pid-file quit without updating file.

# 上記エラー発生しmysql停止が出来ない場合、groonga pluginが原因
$ mysql -uroot -p -e "SHOW PLUGINS"
+------------+----------+----------------+---------------+---------+
| Name       | Status   | Type           | Library       | License |
+------------+----------+----------------+---------------+---------+
...snip...
| groonga    | ACTIVE   | STORAGE ENGINE | ha_groonga.so | GPL     |
| mroonga    | ACTIVE   | STORAGE ENGINE | ha_mroonga.so | GPL     |
...snip...
+------------+----------+----------------+---------------+---------+

※不要なgroonga pluginを削減
mysql> UNINSTALL PLUGIN groonga;

これで起動/停止が正常稼働する。

参考)
stop時のエラーに関してはログ(***.err)に下記が記載される。

190708 12:14:43 [Note] Event Scheduler: Purging the queue. 0 events 190708 12:14:43 - mysqld got signal 11 ; This could be because you hit a bug. It is also possible that this binary or one of the libraries it was linked against is corrupt, improperly built, or misconfigured. This error can also be caused by malfunctioning hardware. We will try our best to scrape up some info that will hopefully help diagnose the problem, but since we have already crashed, something is definitely wrong and this may fail.

key_buffer_size=8384512 read_buffer_size=131072 max_used_connections=0 max_threads=151 threads_connected=0 It is possible that mysqld could use up to key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 338325 K bytes of memory Hope that's ok; if not, decrease some variables in the equation.

Thread pointer: 0x0 Attempting backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong... stack_bottom = (nil) thread_stack 0x40000 /usr/sbin/mysqld(my_print_stacktrace+0x2e)[0x852ebe] /usr/sbin/mysqld(handle_segfault+0x34c)[0x5c951c] /lib64/libpthread.so.0[0x374f00f7e0] /usr/local/lib/libgroonga.so.0(grn_io_segment_alloc+0x26)[0x7fd07bd1aa56] /usr/local/lib/libgroonga.so.0(grn_hash_get_value+0x20d)[0x7fd07bcea65d] /usr/local/lib/libgroonga.so.0(grn_plugin_close+0x35)[0x7fd07bd75dc5] /usr/local/lib/libgroonga.so.0(grn_obj_close+0x277)[0x7fd07bc5b0f7] /usr/local/lib/libgroonga.so.0(grn_db_close+0xe1)[0x7fd07bc5acc1] /usr/local/lib/libgroonga.so.0(grn_obj_close+0x19c)[0x7fd07bc5b01c] /usr/lib64/mysql/plugin/ha_groonga.so(+0x181de)[0x7fd0802b01de] /usr/sbin/mysqld(Z22ha_finalize_handlertonP13st_plugin_int+0x74)[0x6a0784] /usr/sbin/mysqld[0x71b482] /usr/sbin/mysqld[0x71cd5e] /usr/sbin/mysqld(Z15plugin_shutdownv+0x12a)[0x71d21a] /usr/sbin/mysqld[0x5c990c] /usr/sbin/mysqld(_Z10unireg_endv+0xe)[0x5c9b7e] /usr/sbin/mysqld(kill_server_thread+0x31d)[0x5cbc3d] /lib64/libpthread.so.0[0x374f007aa1] /lib64/libc.so.6(clone+0x6d)[0x374ece8bcd] The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains information that should help you find out what is causing the crash.

ref)
mroomga pluginに関して
http://y-ken.hatenablog.com/entry/mroonga-create-function

MySQL(Q4M) + DRBD + HA(Pacemaker/corosync) 構築手順 (障害対応/復旧手順編)

先行の記事(https://ogugu.hateblo.jp/entry/2019/07/02/121645)で構築完了したが、日々の運用で発生した障害対応を行った時の情報を知見として作業記録メモを残す。
HA / DRBD(冗長化)構築に伴い、障害対応時の確認事項が多い為、参考資料として共有。

  • 以下構築要件
    • 先行の記事参照

■ 障害状況

# crm_mon
Last updated: Fri Jun 21 17:05:18 2019
Last change: Fri Jun 21 16:26:10 2019
Stack: corosync
Current DC: drbd01 (176359015) - partition with quorum
Version: 1.1.12-561c4cf
2 Nodes configured
3 Resources configured


Online: [ drbd01 drbd02 ]

Full list of resources:

 Master/Slave Set: ms-drbd_data [drbd_data]
     Masters: [ drbd01 ]
     Slaves: [ drbd02 ]
fs_data (ocf::heartbeat:Filesystem):    Started drbd01

Node Attributes:
* Node drbd01:
    + master-drbd_data                  : 10000
    + ringnumber_0                      : 10.131.6.103 is UP
* Node drbd02:
    + master-drbd_data                  : 1000
    + ringnumber_0                      : 10.131.6.175 is UP

Operations:
* Node drbd02:    fs_data: migration-threshold=1 fail-count=1 last-failure='Fri Jun 21 16:49:09 2019'    + (17) monito

■ 両ノードがStandAlone状態

drbd01がプライマリ-(ro:Primary),drbd02がセカンダリー(ro:Secondary)となっており、csのステータスがどちらも「cs:StandAlone」となっていれば確認は完了です。
もし、どちらかのcsのステータスが接続待ち状態であることを示す「cs:WFConnection」となっていたら、cs:WFConnectionとなっているサーバで以下の切断コマンドを実行して、「StandAlone」に戻します。

# drbdadm disconnect r0

「cat /proc/drbd」コマンドを再実行して、ステータスが「cs:StandAlone」に変わったことを確認できれば準備は完了です。

drbd02のデータを破棄します。

# drbdadm -- --discard-my-data connect r0 

csのステータスが「cs: WFConnection」、roのステータスが「ro:Secondary」となったことを確認します。データを破棄したことによって、drbd02はスタンドアロン状態から「(drbd01との)接続待ち」状態に変更されました。

drbd01の状態がcsのステータスは「cs:StandAlone」、roのステータスは「ro:Primary」となっている事を確認したら、drbd01でDRBD接続コマンドを実行します。

# drbdadm connect r0 

接続コマンドを実行すると、drbd01は以下の状態に変わります。

# cat /proc/drbd 
 
version: 8.4.8-1 (api:1/proto:86-101)
GIT-hash: 22b4c802192646e433d3f7399d578ec7fecc6272 build by mockbuild@, 2016-10-13 19:58:26
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:2056 nr:0 dw:32790 dr:76120 al:2 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
 1: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
    ns:996 nr:0 dw:58900 dr:230731 al:5 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:4088
        [===================>] sync'ed:100.0% (4088/5084)K
        finish: 0:00:03 speed: 996 (996) K/sec

DRBD接続コマンド実行後のdrbd01の状態がroのステータスは「ro:Primary/Secondary」に、csのステータスは「Connected」「SyncSource」となり、drbd01は同期元として、drbd02と正しく接続されました。
接続完了と同時に、DRBDでの同期が再実行されます。

※一部引用
https://www.atmarkit.co.jp/ait/articles/1612/16/news015_3.html

◆ 実際の復旧手順

drbd01:secondary側(旧primary)
drbd02:primary側(旧secondary)

・現状ステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs          ro                 ds                 p       mounted  fstype
0:r0   StandAlone  Secondary/Unknown  UpToDate/DUnknown  r-----

[root@drbd02 ~]# /etc/init.d/drbd status
m:res  cs          ro               ds                 p       mounted  fstype
0:r0   StandAlone  Primary/Unknown  UpToDate/DUnknown  r-----  ext4

・secondary側のDRBDリソースをセカンダリ状態へ変更

[root@drbd01 ~]# drbdadm secondary r0
[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs          ro                 ds                 p       mounted  fstype
0:r0   StandAlone  Secondary/Unknown  UpToDate/DUnknown  r-----

・secondary側のメタデータを破棄

[root@drbd01 ~]# drbdadm -- --discard-my-data connect r0
[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs            ro                 ds                 p  mounted  fstype
0:r0   WFConnection  Secondary/Unknown  UpToDate/DUnknown  C

・primary側でステータス確認

[root@drbd02 ~]# /etc/init.d/drbd status
m:res  cs          ro               ds                 p       mounted  fstype
0:r0   StandAlone  Primary/Unknown  UpToDate/DUnknown  r-----  ext4

※Primary側がStandAloneの場合、Primaryへ昇格させる

[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs          ro                 ds                 p       mounted  fstype
0:r0   StandAlone  Secondary/Unknown  UpToDate/DUnknown  r-----

[root@drbd01 ~]# drbdadm Primary r0
[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs          ro               ds                 p       mounted  fstype
0:r0   StandAlone  Primary/Unknown  UpToDate/DUnknown  r-----

・primary側で手動再同期

[root@drbd02 ~]#  drbdadm connect r0
[root@drbd02 ~]# /etc/init.d/drbd status
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4

※自動マウントされてない場合、手動にて実行

# mount -t ext4 /dev/drbd0 /data/

・secondary側ステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C

■ 故障履歴の表示、クリア

・個別リソース

[root@drbd01 ~]# crm resource failcount drbd_data show drbd01
scope=status  name=fail-count-drbd_data value=0
[root@drbd01 ~]# crm resource failcount fs_data show drbd01
scope=status  name=fail-count-fs_data value=0
[root@drbd01 ~]# crm resource cleanup fs_data
Cleaning up fs_data on drbd01
Waiting for 2 replies from the CRMd.. OK
●Master/Slave の障害履歴のクリア

・確認

Online: [ drbd01 drbd02 ]

 Master/Slave Set: ms_res_drbd
     Masters: [ drbd02 ]
     Stopped: [ res_drbd:0 ]
 res_fs (ocf::heartbeat:Filesystem):    Started drbd02

・履歴クリア

[root@drbd02 ~]# crm resource cleanup ms_res_drbd

Online: [ drbd01 drbd02 ]

 Master/Slave Set: ms_res_drbd
     Masters: [ drbd02 ]
     Slaves: [ drbd01 ]
 res_fs (ocf::heartbeat:Filesystem):    Started drbd02

crm コマンドリファレンス

crm configure [リソースの定義]     # リソースの追加
crm configure delete [リソース名]  # リソースの削除
crm configure save backup.crm   # バックアップ
crm configure load update backup.crm   # 外部ファイル読み込み
crm configure show   # 設定内容確認
crm configure erase   # 設定削除

ただし、ノードが「running」ステータスでは下記のようなエラーが発生します。
WARNING: resource IPaddr2_1 is running, can't delete it
WARNING: resource pingd_gw is running, can't delete it
WARNING: resource prmVIPcheck is running, can't delete it
ERROR: CIB erase aborted (nothing was deleted)
その場合は、全ノードを「standby」ステータスに切り替え、「running」ステータス以外にする事が必要です。

crm resource start                # リソースの開始
crm resource stop                 # リソースの停止
crm resource cleanup [リソース名] [ノード名]  # 故障履歴の削除
crm node list                     # ノードの一覧
crm node delete [ノード名]         # ノードの削除
crm node standby server1   # ノードstandby
crm node online server1   # ノードonline

ref)
http://infra.blog.shinobi.jp/Entry/44/
https://hogem.hatenablog.com/entry/20080706/1215341445
https://linux-ha.osdn.jp/wp/archives/1338#i-3

MySQL(Q4M) + DRBD + HA(Pacemaker/corosync) 構築手順 (インストール編)

オンプレ環境でMySQL+DRBD+HA構成を検証する機会があり、クラウド全盛のタイミングだが低レイヤーの知見として作業記録メモを残す。
クラウドのマネージドサービスを使用した場合、クラウドベンダー範疇の為意識されてないが参考資料として共有。
基本となる構成は、サービスを提供する「アクティブサーバ」と、いざという時のために予備機として待機している「スタンバイサーバ」の2台で構成される「アクティブ/スタンバイ」型のHA環境です。

  • 以下構築要件
    • OS:CentOS6.9 x86_84
    • クラスタソフト:Pacemaker 1.1.12 / Corosync 2.3.4
    • データ同期:DRBD8.3.16
    • 制御対象:仮想IP / MySQL
    • 監視用インターフェース:eth1 (eth0はサービス用ポート)

◎ 導入〜動作確認までの手順

■ DRBD構成

パーティション確認

[root@drbd01 ~]# fdisk -l

ディスク /dev/sda: 32.2 GB, 32212254720 バイト
ヘッド 255, セクタ 63, シリンダ 3916
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x0008a1d3

デバイス ブート      始点        終点     ブロック   Id  システム
/dev/sda1   *           1          66      524288   83  Linux
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2              66         334     2150400   82  Linux スワップ / Solaris
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sda3             334        3917    28781568   83  Linux

ディスク /dev/sdb: 107.4 GB, 107374182400 バイト
ヘッド 255, セクタ 63, シリンダ 13054
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

●epelレポジトリ追加

[root@drbd01 ~]# yum install http://ftp.kddilabs.jp/Linux/RPMS/elrepo/elrepo/el6/x86_64/RPMS/elrepo-release-6-8.el6.elrepo.noarch.rpm

● DRBDインストール

[root@drbd01 ~]# yum install --enablerepo=elrepo drbd83 kmod-drbd83
[root@drbd01 ~]# rpm -qa | grep drbd
drbd83-utils-8.3.16-1.el6.elrepo.x86_64
kmod-drbd83-8.3.16-3.el6.elrepo.x86_64

● /etc/hosts設定

[root@drbd01 ~]vi /etc/hosts
10.131.6.1   drbd01
10.131.6.2   drbd02

● /etc/drbd.confの作成

[root@drbd01 ~]# vi /etc/drbd.conf
# You can find an example in  /usr/share/doc/drbd.../drbd.conf.example

#include "drbd.d/global_common.conf";
#include "drbd.d/*.res";

global {
        usage-count yes;
}

common {
    protocol    C;
    startup {
        degr-wfc-timeout    0;
    }

    net {
        cram-hmac-alg   sha1;
        shared-secret   {shared-secret-key};
    }

    disk {
        on-io-error detach;
    }
    syncer {
        rate    50M;
    }
}
resource r0 {
    on drbd01 {
        device      /dev/drbd0;
        disk        /dev/sdb;
        meta-disk   internal;
        address     10.131.6.1:7788;
    }
    on drbd02 {
        device      /dev/drbd0;
        disk        /dev/sdb;
        meta-disk   internal;
        address     10.131.6.2:7788;
    }
}

※hostsで登録した名称とhostnameが一致しない場合、エラーで起動出来たい為、下記設定行う。

[root@localhost ~]# drbdadm create-md r0
'r0' ignored, since this host (localhost.localdomain) is not mentioned with an 'on' keyword.
[root@localhost ~]# hostname drbd01
[root@localhost ~]# logout

● DRBDのメタデータを初期化

[root@drbd01 ~]# drbdadm create-md r0

Writing meta data...
initializing activity log
NOT initialized bitmap
New drbd meta data block successfully created.
success

自動起動ONにする

[root@drbd01 ~]# chkconfig drbd on
[root@drbd01 ~]# chkconfig --list drbd
drbd            0:off   1:off   2:on    3:on    4:on    5:on    6:off

● DRBDサービス起動

[root@drbd01 ~]# /etc/init.d/drbd start
Starting DRBD resources: [ d(r0) s(r0) n(r0) ]..........
***************************************************************
 DRBD's startup script waits for the peer node(s) to appear.
 - In case this node was already a degraded cluster before the
   reboot the timeout is 0 seconds. [degr-wfc-timeout]
 - If the peer was available before the reboot the timeout will
   expire after 0 seconds. [wfc-timeout]
   (These values are for resource 'r0'; 0 sec -> wait forever)
 To abort waiting enter 'yes' [  12]:yes

.

● DRBDサービス起動後のステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                   ds                         p  mounted  fstype
0:r0   Connected  Secondary/Secondary  Inconsistent/Inconsistent  C

● Primary 昇格と DRBD 同期(drbd01) drbd01 を一時的に Primary へ昇格させます。

[root@drbd01 ~]# drbdadm -- --overwrite-data-of-peer primary r0

● DRBDのステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs          ro                 ds                     p  mounted  fstype
0:r0   SyncSource  Primary/Secondary  UpToDate/Inconsistent  C
...    sync'ed:    0.3%               (102116/102396)M

drbd01は"SyncSource"になっていることがわかる。

● DRBDのステータス確認(drbd02)

[root@drbd02 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs          ro                 ds                     p  mounted  fstype
0:r0   SyncTarget  Secondary/Primary  Inconsistent/UpToDate  C
...    sync'ed:    0.6%               (101856/102396)M

drbd02は"SyncTarget"になっていることがわかる。

● 同期完了後の状態確認
sync'ed: **% が同期の進捗状況。「Inconsistent/UpToDate」ステータスになってる。
同期完了後の状態「UpToDate/UpToDate」が表示される。

[root@drbd03 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C

● DRBD ボリュームのマウント(drbd01)
DRBD ボリュームにファイルシステムを作成します。

[root@drbd01 ~]# mkfs.ext4 /dev/drbd0
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
6553600 inodes, 26213591 blocks
1310679 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
800 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
    4096000, 7962624, 11239424, 20480000, 23887872

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: ^@done

This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

● DRBDマウントポイント作成(drbd01)

[root@drbd01 ~]# mkdir /data
[root@drbd01 ~]# mount -t ext4 /dev/drbd0 /data/
[root@drbd01 ~]# df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda3      ext4    27G  2.7G   23G  11% /
tmpfs          tmpfs  1.9G     0  1.9G   0% /dev/shm
/dev/sda1      ext4   488M   39M  425M   9% /boot
/dev/drbd0     ext4    99G   60M   94G   1% /data

● DRBDのステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4
■ 動作確認

● 適当なファイルをノードAで作成(primary(drbd01))

[root@drbd01 ~]# echo "DRBD TEST from Node A" > /data/test.txt
[root@drbd01 ~]# cat /data/test.txt
DRBD TEST from Node A

● 一旦、primary→secondaryへ切替

[root@drbd01 ~]# umount /data
[root@drbd01 ~]# drbdadm secondary r0

● drbdのステータス確認

[root@drbd01 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                   ds                 p  mounted  fstype
0:r0   Connected  Secondary/Secondary  UpToDate/UpToDate  C

※ここで、一旦ノードB(secondary(drbd02))で作業に切り替える

● ノードBでステータス確認(secondary(drbd02))の為、マウントする

[root@drbd02 ~]# mkdir /data
[root@drbd02 ~]# mount -t ext4 /dev/drbd0 /data/

● drbdのステータス確認(primary側を停止(secondaryへ切替)した為、primaryへ昇格してる)

[root@drbd02 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4

● ノードA(旧primary(drbd01))で書き込みしたデータの同期確認

[root@drbd02 ~]# cat /data/test.txt
DRBD TEST from Node A

● データ同期確認用にデータ書き込み

[root@drbd02 ~]# echo "DRBD TEST from Node B" >> /data/test.txt

● ノードBをsecondaryへ切替

[root@drbd02 ~]# umount /data
[root@drbd02 ~]# drbdadm secondary r0

● drbdのステータス確認

[root@drbd02 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                   ds                 p  mounted  fstype
0:r0   Connected  Secondary/Secondary  UpToDate/UpToDate  C

※ここで、ノードA(primary(drbd01))へ作業を切り替える

● secondary→primaryへ切替

[root@drbd01 ~]# drbdadm primary r0
[root@drbd01 ~]# mount -t ext4 /dev/drbd0 /data/

● ノードB(secondary(drbd02))で書き込みしたデータが正常に同期してるか確認

[root@drbd01 ~]# cat /data/test.txt
DRBD TEST from Node A
DRBD TEST from Node B

● drbdのステータス確認(primaryへ切替してる事を確認)

[root@drbd01 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Primary/Secondary  UpToDate/UpToDate  C  /data    ext4

※ここで、ノードB(secondary(drbd02))へ作業を切り替える

● drbdのステータス確認(primaryが復旧した為、「Secondary/Primary」へ切替済みを確認)

[root@drbd02 ~]# /etc/init.d/drbd status
drbd driver loaded OK; device status:
version: 8.3.16 (api:88/proto:86-97)
GIT-hash: a798fa7e274428a357657fb52f0ecf40192c1985 build by phil@Build64R6, 2014-11-24 14:51:37
m:res  cs         ro                 ds                 p  mounted  fstype
0:r0   Connected  Secondary/Primary  UpToDate/UpToDate  C

● 同期パーティション設定のmountポイントが解除されているか確認

[root@drbd02 ~]# df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/sda3      ext4    27G  2.7G   23G  11% /
tmpfs          tmpfs  1.9G     0  1.9G   0% /dev/shm
/dev/sda1      ext4   488M   39M  425M   9% /boot

■ HA構成

● Pacemakerリポジトリを取得、インストール

[root@drbd01 tmp]# wget https://ja.osdn.net/projects/linux-ha/downloads/62369/pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm
[root@drbd01 tmp]# rpm -ivh pacemaker-repo-1.1.12-1.1.el6.x86_64.rpm
[root@drbd01 tmp]# yum install pacemaker-all

● /etc/corosync/corosync.conf設定

[root@drbd01 tmp]# /etc/corosync/corosync.conf

● /etc/corosync/corosync.conf設定

compatibility: whitetank

aisexec {
       user: root
       group: root
}

service {
       name: pacemaker
       ver: 0
       use_mgmtd: yes
}

amf {
       mode: disabled
}

totem {
       version: 2
       secauth: off
       threads: 0
       rrp_mode: none
       clear_node_high_bit: yes
       token: 4000
       censensus: 7000
       join: 60
       interface {
               member {
                       memberaddr: 10.131.6.103    #ノードA
               }
               member {
                       memberaddr: 10.131.6.175    #ノードB
               }
               ringnumber: 0
               bindnetaddr: 10.131.0.0         #ネットワークアドレス
               mcastport: 5405
               ttl: 1
       }
       transport: udpu
}

logging {
       fileline: off
       to_logfile: yes
       to_syslog: no
       logfile: /var/log/cluster/corosync.log
       debug: off
       timestamp: on
       logger_subsys {
               subsys: AMF
               debug: off
       }
}

quorum {
       provider: corosync_votequorum
       expected_votes: 2
       two_node: 1
}

※ Pacemaker/Corosync の設定値について
https://www.sraoss.co.jp/tech-blog/pacemaker/pacemaker-config-values/

自動起動ONにする

[root@drbd01 tmp]# chkconfig pacemaker on
[root@drbd01 tmp]# chkconfig corosync on

● サービス起動
Pacemaker, Corosync起動(初回のみ)
両方のノードで起動する

[root@drbd01 tmp]# /etc/init.d/corosync start
[root@drbd01 tmp]# /etc/init.d/pacemaker start

※ 手動で停止するときはこの順番で停止すること

[root@drbd01 tmp]# /etc/init.d/pacemaker stop
[root@drbd01 tmp]# /etc/init.d/corosync stop

● Pacemakerの起動状態確認(片方のノードで実行すればよい)

[root@drbd01 tmp]# crm_mon -Aro

Last updated: Fri Jun 21 14:49:37 2019
Last change: Fri Jun 21 14:43:01 2019
Stack: corosync
Current DC: drbd03 (176359015) - partition with quorum
Version: 1.1.12-561c4cf
2 Nodes configured
0 Resources configured


Online: [ drbd01 drbd02 ]

Full list of resources:


Node Attributes:
* Node drbd01:
* Node drbd02:

Operations:
* Node drbd01:
* Node drbd02:

CRM設定
片方のノードで実行すればよい

[root@drbd01 tmp]# crm configure
crm(live)configure#
crm(live)configure# property no-quorum-policy=ignore stonith-enabled=false
crm(live)configure# rsc_defaults resource-stickiness=INFINITY migration-threshold=1
crm(live)configure# commit
crm(live)configure# exit

● DRBDを死活監視対象に設定

[root@drbd01 tmp]# crm configure
crm(live)configure# primitive drbd_data ocf:linbit:drbd params drbdconf=/etc/drbd.conf drbd_resource=r0 \
op start interval=0s timeout=240s \
op monitor interval=10 role=Slave \
op monitor interval=11 role=Master \
op stop interval=0 timeout=100s on-fail=block

crm(live)configure# ms ms-drbd_data drbd_data meta notify=true
crm(live)configure# primitive fs_data ocf:heartbeat:Filesystem params run_fsck=no device=/dev/drbd0 directory=/data fstype=ext4 \
op start interval=0s timeout=60s \
op monitor interval=15 timeout=40s \
op stop interval=0 timeout=60s on-fail=ignore

crm(live)configure# colocation coloc-drbd_fs inf: fs_data ms-drbd_data:Master
crm(live)configure# order order-drbd_fs inf: ms-drbd_data:promote fs_data:start

● 設定反映 上記を実行すると設定のみ追加され、まだ登録されていません。
次の内容を実行して、設定を登録反映します。

crm(live)configure# commit
crm(live)configure# exit

● 設定の確認

[root@drbd01 ~]# crm config
crm(live)configure# show
node 176359015: drbd01
node 176359087: drbd02
primitive drbd_data ocf:linbit:drbd \
    params drbdconf="/etc/drbd.conf" drbd_resource=r0 \
    op start interval=0s timeout=240s \
    op monitor interval=10 role=Slave \
    op monitor interval=11 role=Master \
    op stop interval=0 timeout=100s on-fail=block
primitive fs_data Filesystem \
    params run_fsck=no device="/dev/drbd0" directory="/data" fstype=ext4 \
    op start interval=0s timeout=60s \
    op monitor interval=15 timeout=40s \
    op stop interval=0 timeout=60s on-fail=ignore
ms ms-drbd_data drbd_data \
    meta notify=true
colocation coloc-drbd_fs inf: fs_data ms-drbd_data:Master
order order-drbd_fs inf: ms-drbd_data:promote fs_data:start
property cib-bootstrap-options: \
    dc-version=1.1.12-561c4cf \
    cluster-infrastructure=corosync \
    no-quorum-policy=ignore \
    stonith-enabled=false \
    last-lrm-refresh=1561106859
rsc_defaults rsc-options: \
    resource-stickiness=INFINITY \
    migration-threshold=1

● Pacemakerステータス確認

[root@drbd01 tmp]# crm_mon

Last updated: Fri Jun 21 15:46:29 2019
Last change: Fri Jun 21 15:44:25 2019
Stack: corosync
Current DC: drbd01 (176359015) - partition with quorum
Version: 1.1.12-561c4cf
2 Nodes configured
3 Resources configured


Online: [ drbd01 drbd02 ]

 Master/Slave Set: ms-drbd_data [drbd_data]
     Masters: [ drbd01 ]
     Slaves: [ drbd02 ]
fs_data (ocf::heartbeat:Filesystem):    Started drbd01

● 仮想IP作成/ha resources設定
MySQLのリソースの追加
primitive mysqld lsb:mysqld
→「lsb」というのは、Linux Standard Baseの略。Linux標準で提供される/etc/init.d以下にある起動スクリプトのこと

◆ リソースのグループ、リソース間の制約・順序の設定
最後に、リソースのグループ、リソース間の制約(colocation(関連性)・順序の設定する。

group mysql fs_mysql ip_mysql mysqld
colocation mysql_on_drbd inf: mysql ms_drbd_mysql:Master
order mysql_after_drbd inf: ms_drbd_mysql:promote mysql:start

設定の意味は、
1行目は「ファイルシステムと共有IPとMySQLをグループ『mysql』に指定」
2行目は「mysqlグループとDRBDのマスターは同時に存在しなくてはならない」
3行目は「DRBDのマスターが起動した後に、mysqlグループが起動しなくてはならない」

ref)
https://qiita.com/fetaro/items/9a836ed0922c82f53a25

◆ 実際の追加手順

[root@drbd04 ~]# crm config

crm(live)configure# primitive vip1 ocf:heartbeat:IPaddr2 \
params ip=10.131.xxx.xxx nic=eth1 cidr_netmask=24 \
op start interval=0s timeout=20s \
op stop interval=0s timeout=20s \
op monitor interval=30s
crm(live)configure# primitive q4m lsb:q4m
crm(live)configure# group grpora fs_data vip1 q4m
INFO: resource references in colocation:coloc-drbd_fs updated
INFO: resource references in order:order-drbd_fs updated
crm(live)configure# commit
crm(live)configure# exit
  • crm(live)configure# group {グループ名} fs_data vip1 q4m ← groupを作成しリソース追加
  • INFO: resource references in colocation:coloc-drbd_fs updated ← 既存のcolocationに追加
  • INFO: resource references in order:order-drbd_fs updated ← 既存のorderに追加

colocation制約は複数のリソースを同一ノードで起動させる制約として用い、order制約はリソース同士のアクション(起動及び停止など)の順序を指定します。リソースグループは上記の制約を合わせたようなもので、同じリソースグループに指定したリソースは同一ノードで起動され、起動順序も指定されます。

● Pacemakerステータス確認

[root@drbd01 ~]# crm_mon

Last updated: Tue Jun 25 14:14:14 2019
Last change: Tue Jun 25 14:13:47 2019
Stack: corosync
Current DC: drbd01 (176359015) - partition with quorum
Version: 1.1.12-561c4cf
2 Nodes configured
5 Resources configured


Online: [ drbd01 drbd02 ]

 Master/Slave Set: ms-drbd_data [drbd_data]
     Masters: [ drbd01 ]
     Slaves: [ drbd02 ]
 Resource Group: {グループ名}
     fs_data    (ocf::heartbeat:Filesystem):    Started drbd01
     vip1   (ocf::heartbeat:IPaddr2):   Started drbd01
     q4m        (lsb:q4m):  Started drbd01
[lsb経由でのサービス起動に関して]

lsb経由でのリソース起動は下記仕様に準拠し作成する必要がある。

lsb:initスクリプト名 /etc/init.d/initスクリプト名 に配置されたスクリプトをRAとして使用します。 Linuxに付属のinitスクリプトをRAとして使用することができます。 ただし、initスクリプトがLSBと呼ばれる仕様に準拠している必要があります。

▲例:q4mをlsb経由で管理出来るようにinitd起動スクリプト修正
変更前)

...
condrestart(){
    [ -e /var/lock/subsys/q4m ] && restart || :
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status mysqld
    ;;
  restart)
    restart
    ;;
  condrestart)
    condrestart
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|condrestart|restart}"
    exit 1
esac

exit $?  

変更後)

...
condrestart(){
    [ -e /var/lock/subsys/q4m ] && restart || :
}


function stop_q4m() {
         stop
         return 0
}

function status_q4m() {
        ps -p `cat $mypidfile` > /dev/null 2>&1
        RETVAL=$?
         if [ $RETVAL -eq 0 ] ; then
          return 0
         else
          return 3
         fi
}

function monitor_q4m() {
        ps -p `cat $mypidfile` > /dev/null 2>&1
        RETVAL=$?
         if [ $RETVAL -eq 0 ] ; then
          return 0
         else
          return 3
         fi
}

case $1 in
        start ) start ;;
        stop ) stop_q4m ;;
        status ) status_q4m ;;
        monitor ) monitor_q4m ;;
esac

exit $?

ref)
●インストール方法
http://infra.blog.shinobi.jp/Entry/44/ https://www39.atwiki.jp/th0901/pages/20.html https://hogem.hatenablog.com/entry/20080706/1215341445 https://qiita.com/hkajikawa/items/b911a92365e4a7b70164#%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E3%81%8C%E5%A3%8A%E3%82%8C%E3%81%9F%E6%99%82%E3%81%AE%E5%AF%BE%E5%BF%9C%E3%81%A8%E5%A3%8A%E3%82%8C%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E5%8B%95%E4%BD%9C%E3%82%92%E7%A2%BA%E8%AA%8D

●pcs を用いたインストール方法
https://knowledge.sakura.ad.jp/19690/
https://centossrv.com/pacemaker_drbd.shtml

crmコマンドに関しては下記サイトがわかりやすい
https://dexlab.net/pukiwiki/index.php?Memo/Linux/Pacemaker

●DRBDエンジニアサイ
https://blog.3ware.co.jp/

crm リソースのメタオプション
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/configuring_the_red_hat_high_availability_add-on_with_pacemaker/s1-resourceopts-haar

●lsbに関して
https://linux-ha.osdn.jp/wp/archives/3855#lsb
http://www.kurobuti.com/blog/?p=4667
http://server-helper.doorblog.jp/archives/4142815.html