sql >> データベース >  >> RDS >> MariaDB

MariaDBクラスターを使用したAmazonAWSでのホットスタンバイの構築

    Galera Cluster4.0はMariaDB10.4の一部として最初にリリースされ、このバージョンのリリースには多くの重要な改善があります。このリリースで最も印象的な機能は、次の問題を処理するように設計されたストリーミングレプリケーションです。

      長いトランザクションの問題 大規模なトランザクションの問題 テーブルのホットスポットに関する問題

    以前のブログでは、2部構成のシリーズブログ(パート1とパート2)の新しいストリーミングレプリケーション機能について詳しく説明しました。 Galera 4.0のこの新機能の一部は、GaleraClusterノードとストリーミングレプリケーションで処理されたログのクエリとチェックに非常に役立つ新しいシステムテーブルです。

    以前のブログでも、AWSにMySQL Galera Clusterをデプロイする簡単な方法と、AmazonAWSEC2にMySQLGaleraCluster4.0をデプロイする方法を紹介しました。

    Perconaは、Percona XtraDB Cluster(PXC)8.0のGAをまだリリースしていません。これは、MySQL wsrep関数WSREP_SYNC_WAIT_UPTO_GTIDなど、まだ存在していないように見える一部の機能がまだ開発中であるためです(少なくともPXC 8.0.15-5-27dev.4.2バージョン)。それでも、PXC 8.0がリリースされると、次のような優れた機能が満載されます...

      改善された復元力のあるクラスター クラウドフレンドリークラスター 改善されたパッケージング 暗号化のサポート アトミックDDL

    PXC 8.0 GAのリリースを待っている間、このブログでは、MariaDBを使用してAmazonAWSでGaleraCluster4.0のホットスタンバイノードを作成する方法について説明します。

    ホットスタンバイとは何ですか?

    ホットスタンバイは、特に高度に分散されたシステムでは、コンピューティングの一般的な用語です。これは、1つのシステムが同一のプライマリシステムと同時に実行される冗長性の方法です。プライマリノードで障害が発生すると、ホットスタンバイがすぐにプライマリシステムの交換を引き継ぎます。データは両方のシステムにリアルタイムでミラーリングされます。

    データベースシステムの場合、ホットスタンバイサーバーは通常、強力なリソース(マスターと同じ)で実行されているプラ​​イマリマスターに続く2番目のノードです。このセカンダリノードは、正しく機能するためにプライマリマスターと同じくらい安定している必要があります。

    マスターノードまたはクラスター全体がダウンした場合、データ回復ノードとしても機能します。ホットスタンバイノードは、クライアントからの要求に継続的に対応しながら、障害のあるノードまたはクラスターを置き換えます。

    Galera Clusterでは、クラスターの一部であるすべてのサーバーがスタンバイノードとして機能できます。ただし、リージョンまたはクラスター全体がダウンした場合、これにどのように対処できますか?クラスタの特定のリージョンまたはネットワークの外部にスタンバイノードを作成することは、ここでの1つのオプションです。

    次のセクションでは、MariaDBを使用してAWSEC2でスタンバイノードを作成する方法を示します。

    AmazonAWSでのホットスタンバイの導入

    これまで、AWSでGaleraクラスターを作成する方法を説明しました。 Galera 4.0を初めて使用する場合は、「MySQL GaleraCluster4.0をAmazonAWSEC2にデプロイする」をお読みください。

    ホットスタンバイノードのデプロイは、同期レプリケーションを使用する別のガレラクラスターのセット(このブログをチェックしてください。リレーノードを使用したMySQLガレラクラスターによるダウンタイムゼロネットワーク移行)または非同期MySQL/MariaDBノードをデプロイします。 。このブログでは、Galeraノードの1つから非同期に複製するホットスタンバイノードをセットアップして展開します。

    ガレラクラスターのセットアップ

    このサンプルセットアップでは、MariaDB10.4.8バージョンを使用して3ノードクラスターをデプロイしました。このクラスターは米国東部(オハイオ)地域で展開されており、トポロジは次のとおりです。

    非同期スレーブのマスターとして、172.31.26.175サーバーを使用しますこれはスタンバイノードとして機能します。

    ホットスタンバイノード用のEC2インスタンスのセットアップ

    AWSコンソールで、[コンピューティング]セクションの下にあるEC2に移動し、[インスタンスの起動]をクリックして、以下のようにEC2インスタンスを作成します。

    このインスタンスは、米国西部(オレゴン)地域で作成します。 OSの種類に応じて、好きなサーバー(Ubuntu 18.04が好きです)を選択し、好みのターゲットの種類に基づいてインスタンスの種類を選択できます。この例では、高度なセットアップを必要とせず、このサンプル展開専用であるため、t2.microを使用します。

    前述したように、ホットスタンバイノードは別のリージョンに配置し、同じリージョン内に配置しないことをお勧めします。そのため、地域のデータセンターがダウンしたり、ネットワークが停止したりした場合、問題が発生したときにホットスタンバイをフェイルオーバーのターゲットにすることができます。

    続行する前に、AWSでは、さまざまなリージョンに独自の仮想プライベートクラウド(VPC)と独自のネットワークがあります。 Galeraクラスターノードと通信するには、最初にVPCピアリングを定義して、ノードがAmazonインフラストラクチャ内で通信できるようにし、ネットワークの外部に出てオーバーヘッドとセキュリティ上の懸念を追加する必要がないようにする必要があります。

    まず、ホットスタンバイノードが存在するVPCに移動し、次にピアリング接続に移動します。次に、スタンバイノードのVPCとGaleraクラスターのVPCを指定する必要があります。以下の例では、us-west-2がus-east-2に相互接続しています。

    作成すると、ピアリング接続の下にエントリが表示されます。ただし、この例ではus-east-2にあるGaleraクラスターVPCからのリクエストを受け入れる必要があります。以下を参照してください

    受け入れたら、CIDRをルーティングテーブルに追加することを忘れないでください。 VPCピアリングの後にそれを行う方法については、この外部ブログVPCPeeringを参照してください。

    では、戻ってEC2ノードの作成を続けましょう。セキュリティグループに、開く必要のある正しいルールまたは必要なポートがあることを確認してください。詳細については、ファイアウォール設定マニュアルを確認してください。この設定では、これは単なるテストであるため、すべてのトラフィックを受け入れるように設定しました。以下を参照してください

    インスタンスを作成するときに、正しいVPCを設定していることを確認してください。適切なサブネットを定義しました。それについて助けが必要な場合は、このブログをチェックしてください。

    MariaDB非同期スレーブのセットアップ

    ステップ1

    まず、リポジトリを設定し、リポジトリキーを追加して、リポジトリキャッシュのパッケージリストを更新する必要があります。

    $ vi /etc/apt/sources.list.d/mariadb.list
    
    $ apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
    
    $ apt update
    ステップ2

    MariaDBパッケージとそれに必要なバイナリをインストールします

    $ apt-get install mariadb-backup  mariadb-client mariadb-client-10.4 libmariadb3 libdbd-mysql-perl mariadb-client-core-10.4 mariadb-common mariadb-server-10.4 mariadb-server-core-10.4 mysql-common
    ステップ3

    次に、xbstreamを使用してバックアップを取り、Galeraクラスター内のノードの1つからネットワークにファイルを転送しましょう。

    ##ホットスタンバイノードに新しくインストールされたMySQLのデータディレクトリを消去します。

    $ systemctl stop mariadb
    
    $ rm -rf /var/lib/mysql/*

    ##次に、ホットスタンバイノードで、これをターミナルで実行します。

    $ socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/netcat.log | mbstream -x -C /var/lib/mysql

    ##次に、ターゲットマスター、つまりガレラクラスター内のノードの1つ(この例ではノード172.31.28.175)で、これをターミナルで実行します。

    $ mariabackup  --backup --target-dir=/tmp --stream=xbstream | socat - TCP4:172.32.31.2:9999

    ここで、172.32.31.2はホストスタンバイノードのIPです。

    ステップ4

    MySQL構成ファイルを準備します。これはUbuntuにあるので、/ etc / mysql / my.cnfのファイルを編集しており、ClusterControlテンプレートから取得した次のサンプルmy.cnfを使用しています。

    [MYSQLD]
    
    user=mysql
    
    basedir=/usr/
    
    datadir=/var/lib/mysql
    
    socket=/var/lib/mysql/mysql.sock
    
    pid_file=/var/lib/mysql/mysql.pid
    
    port=3306
    
    log_error=/var/log/mysql/mysqld.log
    
    log_warnings=2
    
    # log_output = FILE
    
    
    
    #Slow logging    
    
    slow_query_log_file=/var/log/mysql/mysql-slow.log
    
    long_query_time=2
    
    slow_query_log=OFF
    
    log_queries_not_using_indexes=OFF
    
    
    
    ### INNODB OPTIONS
    
    innodb_buffer_pool_size=245M
    
    innodb_flush_log_at_trx_commit=2
    
    innodb_file_per_table=1
    
    innodb_data_file_path = ibdata1:100M:autoextend
    
    ## You may want to tune the below depending on number of cores and disk sub
    
    innodb_read_io_threads=4
    
    innodb_write_io_threads=4
    
    innodb_doublewrite=1
    
    innodb_log_file_size=64M
    
    innodb_log_buffer_size=16M
    
    innodb_buffer_pool_instances=1
    
    innodb_log_files_in_group=2
    
    innodb_thread_concurrency=0
    
    # innodb_file_format = barracuda
    
    innodb_flush_method = O_DIRECT
    
    innodb_rollback_on_timeout=ON
    
    # innodb_locks_unsafe_for_binlog = 1
    
    innodb_autoinc_lock_mode=2
    
    ## avoid statistics update when doing e.g show tables
    
    innodb_stats_on_metadata=0
    
    default_storage_engine=innodb
    
    
    
    # CHARACTER SET
    
    # collation_server = utf8_unicode_ci
    
    # init_connect = 'SET NAMES utf8'
    
    # character_set_server = utf8
    
    
    
    # REPLICATION SPECIFIC
    
    server_id=1002
    
    binlog_format=ROW
    
    log_bin=binlog
    
    log_slave_updates=1
    
    relay_log=relay-bin
    
    expire_logs_days=7
    
    read_only=ON
    
    report_host=172.31.29.72
    
    gtid_ignore_duplicates=ON
    
    gtid_strict_mode=ON
    
    
    
    # OTHER THINGS, BUFFERS ETC
    
    key_buffer_size = 24M
    
    tmp_table_size = 64M
    
    max_heap_table_size = 64M
    
    max_allowed_packet = 512M
    
    # sort_buffer_size = 256K
    
    # read_buffer_size = 256K
    
    # read_rnd_buffer_size = 512K
    
    # myisam_sort_buffer_size = 8M
    
    skip_name_resolve
    
    memlock=0
    
    sysdate_is_now=1
    
    max_connections=500
    
    thread_cache_size=512
    
    query_cache_type = 0
    
    query_cache_size = 0
    
    table_open_cache=1024
    
    lower_case_table_names=0
    
    # 5.6 backwards compatibility (FIXME)
    
    # explicit_defaults_for_timestamp = 1
    
    
    
    performance_schema = OFF
    
    performance-schema-max-mutex-classes = 0
    
    performance-schema-max-mutex-instances = 0
    
    
    
    [MYSQL]
    
    socket=/var/lib/mysql/mysql.sock
    
    # default_character_set = utf8
    
    [client]
    
    socket=/var/lib/mysql/mysql.sock
    
    # default_character_set = utf8
    
    [mysqldump]
    
    socket=/var/lib/mysql/mysql.sock
    
    max_allowed_packet = 512M
    
    # default_character_set = utf8
    
    
    
    [xtrabackup]
    
    
    
    [MYSQLD_SAFE]
    
    # log_error = /var/log/mysqld.log
    
    basedir=/usr/
    
    # datadir = /var/lib/mysql

    もちろん、設定や要件に応じてこれを変更できます。

    ステップ5

    手順3のバックアップを準備します。つまり、以下のコマンドを実行して、ホットスタンバイノードにあるバックアップを終了します。

    $ mariabackup --prepare --target-dir=/var/lib/mysql
    ステップ6 ホットスタンバイノードのdatadirの所有権を設定します

    $ chown -R mysql.mysql /var/lib/mysql
    ステップ7

    ここで、MariaDBインスタンスを開始します

    $  systemctl start mariadb
    ステップ8

    最後に、非同期レプリケーションを設定する必要があります

    ##マスターノード、つまりGaleraクラスター内のノードにレプリケーションユーザーを作成します

    MariaDB [(none)]> CREATE USER 'cmon_replication'@'172.32.31.2' IDENTIFIED BY 'PahqTuS1uRIWYKIN';
    
    Query OK, 0 rows affected (0.866 sec)
    
    MariaDB [(none)]> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'cmon_replication'@'172.32.31.2';
    
    Query OK, 0 rows affected (0.127 sec)

    ##次のようにxtrabackup_binlog_infoからGTIDスレーブの位置を取得します。

    $  cat /var/lib/mysql/xtrabackup_binlog_info
    
    binlog.000002   71131632 1000-1000-120454

    ##次に、次のようにスレーブレプリケーションを設定します。

    MariaDB [(none)]> SET GLOBAL gtid_slave_pos='1000-1000-120454';
    
    Query OK, 0 rows affected (0.053 sec)
    
    MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.31.28.175', MASTER_USER='cmon_replication', master_password='PahqTuS1uRIWYKIN', MASTER_USE_GTID = slave_pos;

    ##ここで、スレーブのステータスを確認します

    MariaDB [(none)]> show slave status \G
    
    *************************** 1. row ***************************
    
                    Slave_IO_State: Waiting for master to send event
    
                       Master_Host: 172.31.28.175
    
                       Master_User: cmon_replication
    
                       Master_Port: 3306
    
                     Connect_Retry: 60
    
                   Master_Log_File: 
    
               Read_Master_Log_Pos: 4
    
                    Relay_Log_File: relay-bin.000001
    
                     Relay_Log_Pos: 4
    
             Relay_Master_Log_File: 
    
                  Slave_IO_Running: Yes
    
                 Slave_SQL_Running: Yes
    
                   Replicate_Do_DB: 
    
               Replicate_Ignore_DB: 
    
                Replicate_Do_Table: 
    
            Replicate_Ignore_Table: 
    
           Replicate_Wild_Do_Table: 
    
       Replicate_Wild_Ignore_Table: 
    
                        Last_Errno: 0
    
                        Last_Error: 
    
                      Skip_Counter: 0
    
               Exec_Master_Log_Pos: 4
    
                   Relay_Log_Space: 256
    
                   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: 1000
    
                    Master_SSL_Crl: 
    
                Master_SSL_Crlpath: 
    
                        Using_Gtid: Slave_Pos
    
                       Gtid_IO_Pos: 1000-1000-120454
    
           Replicate_Do_Domain_Ids: 
    
       Replicate_Ignore_Domain_Ids: 
    
                     Parallel_Mode: conservative
    
                         SQL_Delay: 0
    
               SQL_Remaining_Delay: NULL
    
           Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
    
                  Slave_DDL_Groups: 0
    
    Slave_Non_Transactional_Groups: 0
    
        Slave_Transactional_Groups: 0
    
    1 row in set (0.000 sec)
    ホットスタンバイノードをClusterControlに追加する

    ClusterControlを使用している場合は、データベースサーバーの状態を簡単に監視できます。これをスレーブとして追加するには、Galeraノードクラスターを選択し、次に示すように選択ボタンに移動してレプリケーションスレーブを追加します。

    [レプリケーションスレーブの追加]をクリックして、以下のように既存のスレーブの追加を選択します。

    私たちのトポロジーは有望に見えます。

    お気づきかもしれませんが、ノード172.32.31.2がホットスタンバイとして機能していますノードには、172.32。%us-west-2(オレゴン)というプレフィックスが付いた異なるCIDRがあり、他のノードは172.31。%us-east-2(オハイオ)にあります。それらは完全に異なるリージョンにあるため、Galeraノードでネットワーク障害が発生した場合は、ホットスタンバイノードにフェイルオーバーできます。

    結論

    AmazonAWSでのホットスタンバイの構築は簡単で簡単です。必要なのは、容量要件と、セットアップが必要なネットワークトポロジ、セキュリティ、およびプロトコルを決定することだけです。

    VPCピアリングを使用すると、パブリックインターネットにアクセスせずに、異なるリージョン間の相互通信を高速化できるため、接続はAmazonネットワークインフラストラクチャ内にとどまります。

    もちろん、1つのスレーブで非同期レプリケーションを使用するだけでは不十分ですが、このブログは、これを開始する方法の基盤として機能します。これで、非同期スレーブが複製する別のクラスターを簡単に作成し、ディザスタリカバリノードとして機能する別の一連のGaleraクラスターを作成できます。また、Galeraでgmcast.segment変数を使用して、このブログのように同期的に複製することもできます。


    1. Oracle 11gで2つの日付の間の日数を取得するにはどうすればよいですか?

    2. SalesforceおよびOktaシングルサインオン(SSO)でのODBCの使用

    3. dtexecを使用したSSISパッケージの実行

    4. PostgreSQLで暗号化されたパスワードを使用してユーザーを作成する