その1:GI構築編
その2:MySQL構築編
その3:機能確認編
はじめに
前回の記事ではOracle Grid Infrastructure(GI)のインストールと、MySQL用の ACFS の作成まで完了しました。
続けて、MySQL をインストールし、GI のクラスターリソースとして登録するところまでを確認してみます。
- MySQL 8.0 EE インストール
- XAG Agent インストール
- MySQLをクラスターリソースへ登録
- MySQL インスタンス起動
1. MySQL 8.0 EE インストール
MySQL と GI との仲介機能である Grid Infrastructure Agent(XAG Aent)の公式リファレンスガイドによれば、XAG Agentは MySQL インストールパターンの RPM(yum)、Tar ball いずれでも対応しています。
ただし、実際構築してみたところ、以下の相違点があることが確認できました。つまりMySQLのインストールの方法によってこれ以降のインストール・設定手順が異なってきますので、詳しく見ていきます。
RPMインストール | Tar ball インストール | |
---|---|---|
インストール先 | 固定される(製品デフォルト) | 任意の場所にインストール可能 |
起動 | systemd (systemctl start mysqld) | mysqld_safe |
停止 | systemd (systemctl stop mysqld) | mysqladmin shutdown |
死活監視 | systemd (systemctl status mysqld) | mysqladmin status |
監視用DBユーザー | 不要 | 必要 |
RPMインストールの場合
今回は Yum Repositoryを用いた手順としています。
/tmp
に MySQL 8.0.17 EE インストールメディアファイル(V983227-01.zip)を配置済みの状態です。
メディア解凍後、アーカイブをACFS上に展開し、クラスターメンバーノードから参照できるローカルレポジトリとするための準備を行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
[node1] # cd /u02/app/mysql/product # mkdir -p /u02/app/mysql/product/repo # cd /u02/app/mysql/product/repo # ls -l /tmp/V983227-01.zip # unzip /tmp/V983227-01.zip # tar xvf mysql-commercial-8.0.17-1.1.el7.x86_64.repo.tar.gz # rm -rf mysql-commercial-8.0.17-1.1.el7.x86_64.repo.tar.gz* # rm -f README.txt [node1,2] # cat > /etc/yum.repos.d/mysql.repo <<EOF [mysql-8.0] name=mysql-8.0 baseurl=file:///u02/app/mysql/product/repo/mysql-8.0/ gpgkey=file:///u02/app/mysql/product/repo/RPM-GPG-KEY-mysql gpgcheck=1 enabled=0 [mysql-8.0.17] name=mysql-8.0.17 baseurl=file:///u02/app/mysql/product/repo/mysql-8.0/8.0.17/ gpgkey=file:///u02/app/mysql/product/repo/RPM-GPG-KEY-mysql gpgcheck=1 enabled=1 EOF # ls -l /etc/yum.repos.d/mysql.repo # yum clean all |
yum コマンドでインストールします。
1 2 |
# cd /u02/app/mysql/product/repo # yum install -y mysql-commercial-{server,client,common,libs}-* |
なお、これ以降の手順は、マルチインスタンス構成でインスタンスごとにmy.cnf
を分ける場合の例となっています。
もし、シングルインスタンス構成で、my.cnf
はデフォルトの /etc/my.cnf
を利用するので構わなければ、以下の手順でサービス起動を確認し、2. XAG Agent インストールに進んでください。
1. /etc/my.cnf を編集(datadir
にACFSマウントポイントを設定)
2. systemctl start mysqld
で起動
まず、デフォルトのsystemd mysqld サービスは今回利用しないので、自動起動を無効化しておきます。
1 2 3 |
# systemctl is-enabled mysqld.service # systemctl disable mysqld.service # systemctl is-enabled mysqld.service |
次に、インスタンス1用の my.cnf を作成します。
datadir
などの/u02/app/mysql/datastore/${INSTANCE_NAME}
と共有ディスク(ACFS)の領域を指定している箇所が重要ですが、あとのパラメーターはお好みで変えても問題有りません。
また、今回の検証では性能検証を行っていないため、その辺りのパラメーターはデフォルトにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# INSTANCE_NAME=instance1 # NUM_PORT=3306 # cat > /u02/app/mysql/datastore/${INSTANCE_NAME}/my.cnf <<EOF [mysqld] server-id = 1 datadir = /u02/app/mysql/datastore/${INSTANCE_NAME}/data tmpdir = /u02/app/mysql/datastore/${INSTANCE_NAME}/tmp default_authentication_plugin = mysql_native_password log-output = FILE log-error = /u02/app/mysql/datastore/${INSTANCE_NAME}/logs/mysqld.log log_timestamps = SYSTEM port = ${NUM_PORT} socket = /u02/app/mysql/datastore/${INSTANCE_NAME}/tmp/mysql.sock innodb_buffer_pool_size = 512M innodb_flush_log_at_trx_commit = 1 binlog_format = ROW log-bin = /u02/app/mysql/datastore/${INSTANCE_NAME}/binlog/mysql-bin binlog_expire_logs_seconds = 86400 sync_binlog = 1 skip-ssl mysqlx = OFF EOF # ls -l /u02/app/mysql/datastore/${INSTANCE_NAME}/my.cnf |
パラメーターに合わせて必要なディレクトリを作成します。
1 2 3 4 5 |
# cd /u02/app/mysql/datastore/${INSTANCE_NAME} # mkdir data tmp logs binlog # chown mysql:oinstall /u02/app/mysql/datastore/${INSTANCE_NAME}/* # chmod 770 /u02/app/mysql/datastore/${INSTANCE_NAME}/* # ls -l |
systemd のサービス設定を行います。
デフォルトのサービス(mysqld.service)ではなく、マルチインスタンス用のサービス(mysqld@.service)を使うのですが、my.cnfを分けて任意の場所に配置する場合は少し細工が必要になります。
- まず、ノード1で実施します。
ExecStartPre
で実行される/usr/bin/mysqld_pre_systemd
スクリプトがデータディレクトリ初期化処理を実行する際、素の状態だと/etc/my.cnf
を読み込んでしまうため、
初回起動時のみMYSQL_HOME
環境変数を設定することで、初期化の際に利用する my.cnf を明示的に指定します。($MYSQL_HOME/my.cnf
を参照するようにします)123[node1,2]# mv /etc/my.cnf /etc/my.cnf.org# systemctl set-environment MYSQL_HOME="/u02/app/mysql/datastore/instance1"- インスタンス1用のPIDファイルとして
PIDFile
と--pid-file
、my.cnfを指定するために--defaults-file
を追加します。※オーバーライドで設定します。
※PIDファイルの格納先は任意の場所で構いません。12345678910# systemctl edit mysqld@※エディタモードになるので、以下の内容を入力し保存します。[Service]Group=oinstallPIDFile=/u02/app/mysql/datastore/%I/mysqld_%I.pidExecStart=ExecStart=/usr/sbin/mysqld --defaults-file=/u02/app/mysql/datastore/%I/my.cnf --defaults-group-suffix=@%I --pid-file=/u02/app/mysql/datastore/%I/mysqld_%I.pid $MYSQLD_OPTS# systemctl daemon-reload - 上記2点を設定後、ノード1でサービスを起動します。起動に成功したら、systemd 環境変数
MYSQL_HOME
を削除して、サービス再起動します。
再起動も成功したら、いったんノード1側でサービスを停止させます。123456[node1]# systemctl status mysqld@instance1# systemctl start mysqld@instance1# systemctl unset-environment MYSQL_HOME# systemctl restart mysqld@instance1# systemctl stop mysqld@instance1
- 次にノード2で実施します。
- 初回起動時にデータディレクトリの初期化は不要とするフラグ
NO_INIT=true
を/etc/sysconfig/mysql
に設定しておき、起動できたら/etc/sysconfig/mysql
をクリアして再起動します。123456789[node2]# mv /etc/my.cnf /etc/my.cnf.org# echo "NO_INIT=true" > /etc/sysconfig/mysql# systemctl edit mysqld@※ノード1と同じ内容をオーバーライド設定する。# systemctl daemon-reload# systemctl start mysqld@instance1# echo -n > /etc/sysconfig/mysql# systemctl restart mysqld@instance1
- 初回起動時にデータディレクトリの初期化は不要とするフラグ
なお、mysqld@.service はデフォルトで自動起動は無効になっていますが、念の為確認しておきます。(最終的にクラスターで起動させるため)
1 2 |
[node1,2] # systemctl is-enabled mysqld@ |
Tar ball インストールの場合
Tar ball を ACFS上の /u02/app/mysql/products
に格納しておき、インストールベースディレクトリはローカルの /u01/app/mysql
にしています。
1 2 3 4 5 6 7 8 9 10 11 |
[node1,2] # cd /u02/app/mysql/products # unzip /tmp/V983202-01.zip # rm -f mysql-commercial-8.0.17-el7-x86_64.tar.gz.* README.txt # cd /u01/app # tar zxvf /u02/app/mysql/products/mysql-commercial-8.0.17-el7-x86_64.tar.gz # mv mysql-commercial-8.0.17-el7-x86_64 mysql-commercial-8.0.17 # chown -R mysql:oinstall mysql-commercial-8.0.17 # chmod -R 750 mysql-commercial-8.0.17 # ln -s mysql-commercial-8.0.17 mysql |
つぎに、my.cnf ですが、こちらではmysqladmin
セクションに以下を追加し、監視用DBユーザーを指定します。
1 2 3 |
[mysqladmin] user = mysql EOF |
データディレクトリの初期化、SSL-RSAセットアップを実行し、mysqld_safe でプロセスを起動させます。
mysql_secure_installation
も実行しておきます。
1 2 3 4 5 6 |
# cd /u01/app/mysql # bin/mysqld --defaults-file=/u02/app/mysql/datastore/${INSTANCE_NAME}/my.cnf --initialize --user=mysql # bin/mysql_ssl_rsa_setup --datadir=/u02/app/mysql/datastore/${INSTANCE_NAME}/data # bin/mysqld_safe --defaults-file=/u02/app/mysql/datastore/${INSTANCE_NAME}/my.cnf --user=mysql & # grep 'temporary password' /u02/app/mysql/datastore/${INSTANCE_NAME}/logs/mysqld.log | awk '{print $NF}' # bin/mysql_secure_installation --socket=/u02/app/mysql/datastore/${INSTANCE_NAME}/tmp/mysql.sock |
DBに接続後、auth_socket認証方式でログインする監視用DBユーザーを作成します。
このあとクラスターリソースを登録する際のリソースの所有者(mysqlユーザー)が、死活監視(mysqladmin)の実行ユーザーとなります。
ちなみにパスワード認証方式にすることもでき、その場合は、my.cnfの mysqld_safe
セクションに password
を追記します。(平文で保管されるので本番環境の場合はセキュリティを考慮して格納先やファイルパーミッションを適切に設定しておくべきです)
公式リファレンスガイド(P.57)には監視用ユーザーの権限は USAGE
のみでよいと記載ありますが、実際のところ、停止(agctl stop
コマンド)と再配置(agctl relocate
コマンド)の際に XAG Agentが内部的に発行する mysqladmin shutdown
は SHUTDOWN 権限がないとエラーになり正しく動作しませんので、忘れずに権限を追加しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# bin/mysql -uroot -p --socket=/u02/app/mysql/datastore/instance1/tmp/mysql.sock mysql> SELECT plugin_name, plugin_status FROM information_schema.plugins WHERE plugin_name LIKE '%socket%'; +-------------+---------------+ | PLUGIN_NAME | PLUGIN_STATUS | +-------------+---------------+ | auth_socket | ACTIVE | +-------------+---------------+ 1 row in set (0.02 sec) mysql> CREATE USER mysql@localhost IDENTIFIED WITH auth_socket; mysql> GRANT SHUTDOWN ON *.* TO `mysql`@`localhost`; mysql> FLUSH PRIVILEGES; mysql> SHOW GRANTS FOR `mysql`@localhost; +----------------------------------------------+ | Grants for mysql@localhost | +----------------------------------------------+ | GRANT SHUTDOWN ON *.* TO `mysql`@`localhost` | +----------------------------------------------+ 1 row in set (0.00 sec) mysql> exit |
ノード1でのMySQLインストールは完了したので、MySQLを停止し、次はノード2でも同じ手順でMySQLが起動できることを確認します。
1 2 3 4 5 6 7 8 |
[node1] # bin/mysqladmin -uroot -p --socket=/u02/app/mysql/datastore/instance1/tmp/mysql.sock shutdown [node2] # /u01/app/mysql/bin/mysqld_safe --defaults-file=/u02/app/mysql/datastore/instance1/my.cnf --user=mysql & # /u01/app/mysql/bin/mysql -uroot -p --socket=/u02/app/mysql/datastore/instance1/tmp/mysql.sock # /u01/app/mysql/bin/mysqladmin -uroot -p --socket=/u02/app/mysql/datastore/instance1/tmp/mysql.sock shutdown |
2. XAG Agent インストール
rootユーザーでインストールディレクトリを作成します。任意の場所で構いませんが、今回は /u01/app/xag
としました。
1 2 3 4 |
[node1,2] # mkdir -p /u01/app/xag # chown -R grid:oinstall /u01/app/xag # chmod -R 750 /u01/app/xag |
/tmp
にインストールメディア(xagpack91.zip)を格納しておきます。gridユーザーでXAG Agentをインストールします。
--all_nodes
オプションを指定すると全クラスターメンバーノードへ、または --nodes
オプションで特定のノードへ配布リリースされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[node1] # chown grid:oinstall /tmp/xagpack91.zip # su - grid $ mkdir /products/xagpack91 $ unzip -d /products/xagpack91 /tmp/xagpack91.zip $ cd /products/xagpack91/xag $ ./xagsetup.sh --install --directory /u01/app/xag --all_nodes Installing Oracle Grid Infrastructure Agents on: node1 Installing Oracle Grid Infrastructure Agents on: node2 Done. Updating XAG resources. Successfully updated XAG resources. $ /u01/app/xag/bin/agctl query releaseversion The Oracle Grid Infrastructure Agents release version is 9.1.2 |
ノード2でもインストールされていることを確認します。
1 2 3 |
[node2] $ /u01/app/xag/bin/agctl query releaseversion The Oracle Grid Infrastructure Agents release version is 9.1.2 |
なお、公式リファレンスガイドには明記されていませんが、XAG Agentのログディレクトリのオーナーがrootになっていると、MySQLインスタンスのリソース起動時にログを書き込めない問題が発生しますので、rootユーザーでオーナー、権限を再設定しておきます。
1 2 3 |
# cd /u01/app/xag/log # chown grid:oinstall `hostname -s` # chmod 775 `hostname -s` |
3. MySQL をクラスターリソースへ登録
インストールとしては最後のステップになります。
agctl add
コマンドでクラスターリソース登録しますが、その際に指定するパラメーターは MySQL のインストール方法(RPM or Tar ball)で異なります。
公式リファレンスガイド(P.58,59)にパラメーターの説明がありますが、実物と異なっている(説明が不足している)ので実際のコマンドヘルプ内容を補足する形で説明を入れておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
agctl add mysql_server <instance_name> --service_name <service_name> | --mysql_type <mysql_type> --mysql_home <mysql_home> --datadir <datadir> ・・・ (1)必須 [--mysql_lib <mysql_lib>] ・・・ (2)任意 [--monitor_agent <monitor_agent>] ・・・ (3)任意 --server_pool <server_pool> | --nodes <node>[,...] ・・・ (4)任意 --vip_name <vip_name> | --network <network_number> --ip <ip_address> --user <user> --group <group> ・・・ (5)必須 --filesystems <filesystem>[,...] ・・・ (6)任意 ※マニュアルに記載無し --attribute <name=value>[,...] ・・・ (7)任意 --environment_vars <var=value>[,...] ・・・ (8)任意 <instance_name> Instance name --service_name <service_name> The name of MySQL Service Name --mysql_type <mysql_type> The type of MySQL for this instance Valid values are: 'MYSQL', 'MONITOR' --mysql_home <mysql_home> The location of MySQL Server installed software --datadir <datadir> The location of MySQL Server runtime data --mysql_lib <mysql_lib> The location of MySQL Library --monitor_agent <monitor_agent> The name of MySQL Monitor Enterprise Agent --server_pool <server_pool> Name of the Server pool where instance can be run --nodes <node>[,...] List of nodes where instance can be run --vip_name <vip_name> Virtual IP name --network <network_number> Network number --ip <ip_address> IP address --user <user> Operating System user name that owns the instance --group <group> Name of the group to which the Operating System user belongs --filesystems <filesystem>[,...] List of file system resource dependencies --attribute <name>=<value>[,...] Attributes that can be applied --environment_vars <var=value>[,...] Additional environment variables to set |
- (1)で指定する内容はMySQLのインストール方法によって異なります。
- RPMインストールの場合、
--service_name
に systemd で認識されるサービス名を指定します。 - Tarインストールの場合、
--mysql_type
(MySQL Severインスタンスの場合、MYSQL
を設定),--mysql_home
,--datadir
の指定は必須となります。
- RPMインストールの場合、
- (4)は
--server_pool
,--nodes
いずれか、または何も指定しなければ、すべてのクラスターメンバーノードで起動するように登録されます。 - (5)は、いずれのインストールタイプの場合にも、MySQL インスタンス1用Application VIPを指定する必要があります。
Application VIP はリソース登録の前作成しておくか、またはリソース登録と同時に作成もできます。
Application VIP を事前に作成するには root ユーザーでcrsctl add resource app.appvip
コマンドを実行する必要があります。その際に付けたVIP名を--vip_name
に指定します。
事前に作成しておいた場合、agctl add
コマンドはgridユーザーで実行できます。
特別な理由がなければ、rootユーザーでリソース登録と同時に作成する手順が1ステップで実施できるのでオススメです。その場合は、--network
,--ip
,--user
(,--group
) を指定します。
--network
は、クラスター上のネットワークリソース番号を指定します。
下記の場合、ネットワークリソースora.net1.network
の番号は1です。123456# /u01/app/19.0.0/grid/bin/crsctl stat res -t:ora.net1.networkONLINE ONLINE node1 STABLEONLINE ONLINE node2 STABLE: - (6)の
--filesystems
パラメーターには、インスタンスが使用するデータディレクトリの ACFS リソース名を指定すると、起動・停止の依存関係を組むことができます。これについては次回検証したいと思います。
RPM インストールの場合
実際のリソース登録コマンドは以下の通りとなります。
Application VIP の IPアドレスを 192.168.100.40
としています。
mysqld@.service を用いるサービスを登録する場合、--service_name
パラメーターで指定するサービスが起動している状態でないと認識しないので注意してください。
1 2 3 4 5 |
# /u01/app/xag/bin/agctl add mysql_server instance1 \ --service_name mysqld@instance1 \ --nodes node1,node2 \ --network 1 --ip 192.168.100.40 \ --user mysql --group oinstall |
agctl config
コマンドで登録された情報を確認できます。
1 2 3 4 5 |
# /u01/app/xag/bin/agctl config mysql_server instance1 Instance name: instance1 MySQL Service Name: mysqld@instance1 Configured to run on Nodes: node1 node2 Network: 1, IP:192.168.100.40, User:mysql, Group:oinstall |
リソース登録が成功したら、いったん MySQL をsystemctl で停止しておきます。
1 |
# systemctl stop mysqld@instance1 |
Tar ball インストールの場合
--environment_vars
でMYSQL_HOME=/u02/app/mysql/datastore/instance1を指定しています。
これはRPMインストール時と同じ用法で、インスタンス1用に準備したmy.cnfを起動時に認識させるための工夫となります。
1 2 3 4 5 6 7 8 |
# /u01/app/xag/bin/agctl add mysql_server instance1 \ --mysql_home /u01/app/mysql \ --datadir /u02/app/mysql/datastore/instance1/data \ --mysql_type MYSQL \ --nodes node1,node2 \ --network 1 --ip 192.168.100.40 \ --user mysql --group oinstall \ --environment_vars MYSQL_HOME=/u02/app/mysql/datastore/instance1 |
agctl config
コマンドで登録された情報を確認すると以下の通りとなっています。
1 2 3 4 5 6 7 8 9 10 |
# /u01/app/xag/bin/agctl config mysql_server instance1 Instance name: instance1 Application MySQL Server location is: /u01/app/mysql MySQL Type: MYSQL MySQL Runtime Data location: /u02/app/mysql/datastore/instance1/data MySQL Library location: MySQL Monitor Enterprise Agent: Configured to run on Nodes: node1 node2 Environment variables to set: MYSQL_HOME=/u02/app/mysql/datastore/instance1 Network: 1, IP:192.168.100.40, User:mysql, Group:oinstall |
4. MySQL インスタンス起動
agctl add
コマンド直後、agctl status
コマンドやcrsctl stat res
コマンドで状態確認してみると、クラスター管理上では停止状態になっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# /u01/app/xag/bin/agctl status mysql_server instance1 Mysql Server instance 'instance_1' is not running # /u01/app/19.0.0/grid/bin/crsctl stat res xag.instance1{-vip.vip,.mysql} -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- xag.instance_1-vip.vip 1 OFFLINE OFFLINE STABLE xag.instance_1.mysql 1 OFFLINE OFFLINE STABLE -------------------------------------------------------------------------------- |
agctl(内部的にはcrsctl)から起動させることでステータスを正しく把握させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# /u01/app/xag/bin/agctl start mysql_server instance1 # /u01/app/xag/bin/agctl status mysql_server instance1 Mysql Server instance 'instance1' is running on node1 # /u01/app/19.0.0/grid/bin/crsctl stat res xag.instance1{-vip.vip,.mysql} -t -------------------------------------------------------------------------------- Name Target State Server State details -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- xag.instance1-vip.vip 1 ONLINE ONLINE node1 STABLE xag.instance1.mysql 1 ONLINE ONLINE node1 STABLE -------------------------------------------------------------------------------- |
無事、クラスターリソースとして正常に起動することができました。
ためしに Application VIP を指定して接続してます。
1 2 3 4 5 6 7 |
mysql -utest -p -h 192.168.100.40 mysql> show variables like 'hostname'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | hostname | node1 | +---------------+-------+ |
現在のインスタンス稼働ノードである node1 へ接続できました。
まとめ
-
MySQL のインストールについては、相違点はあるものの、RPM or Tar ball のどちらの構成方法でも問題なく構成できました。
-
記事中で何点かポイントしてありますが、XAG Agent 公式リファレンスガイドを元に環境構築するには説明が少し不足しているようですので、ご注意ください。
-
次回は、肝となる高可用性の機能(フェイルオーバー・フェイルバック)と拡張性(ACFSボリューム拡張、MySQLインスタンス追加)、その他気付いた点などをレポートします。