SQL Server 2017 : Always On 可用性グループ2017/10/22 |
SQL Server on Linux の Always On 可用性グループの構成です。
当例では、以下のような環境を前提に進めます。
3台の SQL Server で Always On 可用性グループを構成します。 | |VIP:10.0.0.50 +-----------------------------+-----------------------------+ |10.0.0.51 |10.0.0.52 |10.0.0.53 +----------+-----------+ +----------+-----------+ +----------+-----------+ | [ node01.srv.world ] | | [ node02.srv.world ] | | [ node03.srv.world ] | | (Primary) | | (Secondary) | | (Secondary) | | SQL Server | | SQL Server | | SQL Server | +----------------------+ +----------------------+ +----------------------+ |
[1] | |
[2] | |
[3] | 全ノードで SQL Server for HA パッケージを追加します。また Always On 可用性グループを有効にし、データベース同期用のユーザーを作成しておきます。 'password' の箇所は任意のパスワードに置き換えてください。 |
[root@node01 ~]#
[root@node01 ~]# yum -y install mssql-server-ha /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1 SQL Server needs to be restarted in order to apply this setting. Please run 'systemctl restart mssql-server.service'. [root@node01 ~]# systemctl restart mssql-server [root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> alter event session AlwaysOn_health on server with (startup_state=on); 2> go 1> create login dbm_login with password = 'password'; 2> create user dbm_user for login dbm_login; 3> go 1> exit |
[4] | プライマリーノードとするホストで証明書を作成し、各ノードへコピーします。 'password', 'pvk_password' の箇所は任意のパスワードに置き換えてください。 |
[root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> create master key encryption by password = 'password'; 2> create certificate dbm_certificate with subject = 'dbm'; 3> backup certificate dbm_certificate 4> to file = '/var/opt/mssql/data/dbm_certificate.cer' 5> with private key ( 6> file = '/var/opt/mssql/data/dbm_certificate.pvk', 7> encryption by password = 'pvk_password' 8> ); 9> go 1> exit[root@node01 ~]# cd /var/opt/mssql/data [root@node01 data]# scp dbm_certificate.* root@node02.srv.world:/var/opt/mssql/data/ root@node02.srv.world's password: dbm_certificate.cer 100% 667 614.7KB/s 00:00 dbm_certificate.pvk 100% 1212 1.0MB/s 00:00[root@node01 data]# scp dbm_certificate.* root@node03.srv.world:/var/opt/mssql/data/ root@node03.srv.world's password: dbm_certificate.cer 100% 667 581.6KB/s 00:00 dbm_certificate.pvk 100% 1212 935.1KB/s 00:00[root@node01 data]# ssh root@node02.srv.world 'chown mssql. /var/opt/mssql/data/dbm_certificate.*' [root@node01 data]# ssh root@node03.srv.world 'chown mssql. /var/opt/mssql/data/dbm_certificate.*' |
[5] | 全セカンダリーノードで証明書を作成します。 'password' の箇所は任意のパスワードに置き換えてください。 'pvk_password' の箇所はプライマリーノードで設定した 'pvk_password' を指定します。 |
[root@node02 ~]# sqlcmd -S localhost -U SA Password: 1> create master key encryption by password = 'password'; 2> create certificate dbm_certificate authorization dbm_user 3> from file = '/var/opt/mssql/data/dbm_certificate.cer' 4> with private key ( 5> file = '/var/opt/mssql/data/dbm_certificate.pvk', 6> decryption by password = 'pvk_password' 7> ); 8> go 1> exit |
[6] | 全ノードでデータベース同期用のエンドポイントを設定します。 |
[root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> create endpoint [Hadr_endpoint] 2> as tcp (listener_ip = (0.0.0.0), listener_port = 5022) 3> for data_mirroring ( 4> role = all, 5> authentication = certificate dbm_certificate, 6> encryption = required algorithm aes 7> ); 8> alter endpoint [Hadr_endpoint] state = started; 9> grant connect on endpoint::[Hadr_endpoint] to [dbm_login]; 10> go 1> exit # Firewalld 稼働中の場合はエンドポイントに設定したポートを許可 [root@node01 ~]# firewall-cmd --add-port=5022/tcp --permanent [root@node01 ~]# firewall-cmd --reload |
[7] | プライマリーノードで可用性グループを作成します。 |
[root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> create availability group [AG01] 2> with (db_failover = on, cluster_type = external) 3> for replica on 4> N'node01' with ( 5> endpoint_url = N'tcp://10.0.0.51:5022', 6> availability_mode = synchronous_commit, 7> failover_mode = external, 8> seeding_mode = automatic 9> ), 10> N'node02' with ( 11> endpoint_url = N'tcp://10.0.0.52:5022', 12> availability_mode = synchronous_commit, 13> failover_mode = external, 14> seeding_mode = automatic 15> ), 16> N'node03' with ( 17> endpoint_url = N'tcp://10.0.0.53:5022', 18> availability_mode = synchronous_commit, 19> failover_mode = external, 20> seeding_mode = automatic 21> ); 22> alter availability group [AG01] grant create any database; 23> go 1> exit |
[8] | 全セカンダリーノードで可用性グループに参加します。 |
[root@node02 ~]# sqlcmd -S localhost -U SA Password: 1> alter availability group [AG01] join with (cluster_type = external); 2> alter availability group [AG01] grant create any database; 3> go 1> exit |
[9] | プライマリーノードで作成した可用性グループへ、データベースを追加します。 |
[root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> create database [AG01_DB]; 2> alter database [AG01_DB] set recovery full; 3> backup database [AG01_DB] to disk = N'/var/opt/mssql/data/AG01_DB.bak'; 4> alter availability group [AG01] add database [AG01_DB]; 5> go Processed 304 pages for database 'AG01_DB', file 'AG01_DB' on file 1. Processed 3 pages for database 'AG01_DB', file 'AG01_DB_log' on file 1. BACKUP DATABASE successfully processed 307 pages in 0.147 seconds (16.315 MB/sec). 1> exit # セカンダリーノードで追加したデータベースが見えるか確認 [root@node01 ~]# sqlcmd -S node02 -U SA -Q 'select name, create_date from sys.databases where name = "AG01_DB"' Password: name create_date ---------------------------- ----------------------- AG01_DB 2017-10-22 11:39:47.937 (1 rows affected) |
[10] | Pacemaker 用の SQL Server アカウントを追加しておきます。全ノードで実施します。 |
[root@node01 ~]# sqlcmd -S localhost -U SA Password: 1> use master; 2> go # [hacluster] ユーザー作成 1> create login hacluster with PASSWORD= N'password'; 2> go # [sysadmin] ロール付与 1> alter server role [sysadmin] add member hacluster; 2> go 1> exit[root@node01 ~]# echo 'hacluster' > /var/opt/mssql/secrets/passwd [root@node01 ~]# echo 'password' >> /var/opt/mssql/secrets/passwd [root@node01 ~]# chown root. /var/opt/mssql/secrets/passwd [root@node01 ~]# chmod 600 /var/opt/mssql/secrets/passwd |
[11] | プライマリーノードで SQL Server リソースを追加します。 |
# STONITH (Shoot The Other Node In The Head) オプションは無効化 [root@node01 ~]# pcs property set stonith-enabled=false
# start-failure-is-fatal オプションは無効化 [root@node01 ~]# pcs property set start-failure-is-fatal=false pcs resource create AG01_Cluster ocf:mssql:ag ag_name=AG01 --master meta notify=true Warning: flag '--master' is deprecated, use keyword 'master' instead (see the usage) [root@node01 ~]# pcs resource Master/Slave Set: AG01_Cluster-master [AG01_Cluster] Slaves: [ node01.srv.world node02.srv.world node03.srv.world ] # required_synchronized_secondaries_to_commit=1 に設定 [root@node01 ~]# pcs resource update AG01_Cluster required_synchronized_secondaries_to_commit=1
# 仮想IP追加 [root@node01 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 ip=10.0.0.50 [root@node01 ~]# pcs constraint colocation add VIP AG01_Cluster-master INFINITY with-rsc-role=Master [root@node01 ~]# pcs constraint order promote AG01_Cluster-master then start VIP
# node01 をプライマリーにする [root@node01 ~]# pcs resource move AG01_Cluster-master node01.srv.world --master # しばらくするとリソースが開始する [root@node01 ~]# pcs resource Master/Slave Set: AG01_Cluster-master [AG01_Cluster] Masters: [ node01.srv.world ] Slaves: [ node02.srv.world node03.srv.world ] VIP (ocf::heartbeat:IPaddr2): Started node01.srv.world |
[12] | プライマリーノードをフェールオーバーさせるには pcs resource move を利用します。 |
# node02 をプライマリーにする [root@node01 ~]# pcs resource move AG01_Cluster-master node02.srv.world --master # しばらくするとフェールーバー完了する [root@node01 ~]# pcs resource Master/Slave Set: AG01_Cluster-master [AG01_Cluster] Masters: [ node02.srv.world ] Slaves: [ node01.srv.world node03.srv.world ] VIP (ocf::heartbeat:IPaddr2): Started node02.srv.world # 仮想IPアドレス宛てにアクセスして確認 [root@node01 ~]# sqlcmd -S 10.0.0.50 -U SA -Q 'select @@servername' Password: -------------------------------------- node02 (1 rows affected) |
Sponsored Link |