目次
背景紹介
最近、Keepalivedを使用してAlibaba CloudでVIP(仮想IP)を提供することはできず、フェイルオーバーはVIPなしでは自動的に完了できないため、MySQL高可用性アーキテクチャをAlibaba Cloud ECSにデプロイする必要があります。調査の結果、Alibabaが判明しました。クラウド製品のSLBは、おおまかに需要を満たすことができます。SLBトラフィック分散を実行して、単一の障害ポイントを排除し、高いサービス可用性を実現できます。そのため、VIPの代わりにAlibaba Cloud製品のSLB(負荷分散)を使用する予定です。このブログは主に、メインデータベースサービスがSLBアクティブ/スタンバイモードでダウンしている場合に、データベースの書き込み要求とクエリ要求をスタンバイデータベースに自動的に転送できるかどうかを確認することを目的としています。可能であれば、次のECSの高可用性ソリューションは、SLB + MHAを使用して、メインライブラリの高可用性を実現することです。
Alibaba CloudSLBの概要
Server Load Balancerは、トラフィックを複数のクラウドサーバーに分散する負荷分散サービスです。負荷分散は、トラフィック分散を通じてアプリケーションシステムの外部サービス機能を拡張し、単一障害点を排除することでアプリケーションシステムの可用性を向上させることができます。
注意:
SLBを作成するときは、アクティブサーバーとスタンバイサーバーのグループを使用する必要があります。プライマリサーバーはMHAのプライマリデータベースサーバーに対応し、スタンバイサーバーはMHAのスタンバイマスターに対応するため、通常のトラフィックは次のようになります。プライマリデータベースに送信され、障害が発生すると、トラフィックがスタンバイマスターに送信されます。それ以外の場合は、会社のOPの同僚またはAlibabaCloudの技術スタッフに相談できます。
環境紹介
IP | SLBでの役割 | データベースアーキテクチャ(MHA)での役割 | 略語 |
---|---|---|---|
10.96.0.202 | SLBアドレス | VIP | 202 |
10.96.1.114 | メインサーバー | メインライブラリサーバー | 4 |
10.96.1.115 | スタンバイサーバー | スタンバイマスターサーバー | 5 |
10.96.1.116 | SLBに追加されていません | スレーブライブラリサーバー | 6 |
テストテーブルを作成する
テーブル構造の説明:タイムスタンプの列をテストテーブルに追加します。これは、挿入時間を記録し、比較のためにログを切り替えるのに便利です。他のフィールドはnumタイプであり、forループを使用してテーブルにデータを継続的に挿入できます。 。
create database test;
use test;
CREATE TABLE `hatest` (
`ID` BIGINT (20) NOT NULL AUTO_INCREMENT,
num BIGINT (20) NOT NULL,
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`UPDATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`ID`)
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8 ROW_FORMAT = DYNAMIC COMMENT = '用户表';
テストスクリプトの準備
依存パッケージをインストールします。
pip install PyMySQL
# Author admin
# DATE 2020/9/10
# -*- coding:UTF-8 -*-
import pymysql
import time,datetime
import logging
import os
logging.basicConfig(filename=os.path.join(os.getcwd(),'ha.log'),level=logging.DEBUG)
def insert():
while True:
try:
conn = pymysql.connect(host='10.96.0.202',port=3306,user='dba',password='dba',database='test',charset='utf8')
cursor = conn.cursor()
for num in range(0,10000000):
data_time = time.strftime("%Y-%m-%d %H:%M:%S")
sql1="insert into hatest(num) values(%d);"%num
sql2 = "show variables like 'server_id';"
cursor.execute(sql1)
data_time = datetime.datetime.now()
cursor.execute(sql2)
server_id = cursor.fetchone()
logging.warning('%s server_id is %s'%(datetime.datetime.now(),server_id[1]))
conn.commit()
cursor.close()
except Exception as e:
logger_info = "%s %s" %(datetime.datetime.now(),e)
logging.warning(logger_info)
insert()
スクリプトの説明:SLBアドレス10.96.0.202を使用して1,000万個のデータをデータベースに挿入し、挿入中に4サーバーのデータベースサービスを手動で停止し、5がSLB切り替え後もデータを挿入し続けることができることを確認します。データが挿入されるたびに、データベースのserver_Idがログに記録されて、どのデータベースが書き込まれているかが識別され、切り替え中のエラーがログに記録されます。
フェイルオーバーをシミュレートする
起動スクリプト
4でmysqlサービスを手動で停止します
テーブル内のログとデータを観察します
テスト
22:17スクリプトの連続書き込みを開始します
22:18:11 4上 停止数据库 /etc/init.d/mysqld stop 日志和数据库的表中都显示在18分11秒停止写入
ha.log
データベース内のテーブル
22:18:11は22:18:20に続き、データベースに書き込むことができません 22:18:20 SLB完成主备切换 5数据库开始写入 ,日志数据库表中显示在18分20秒开始写入5环境
22:19 4上启动 /etc/init.d/mysqld start
22:19:10秒4環境データベースサービスが開始され、5環境が書き込みを停止しましたが、4環境が書き込みを開始しませんでした
検証が完了しました