<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>フェイルオーバー &#8211; エンジニア見習い</title>
	<atom:link href="https://otonan-syusyoku.work/archives/tag/%E3%83%95%E3%82%A7%E3%82%A4%E3%83%AB%E3%82%AA%E3%83%BC%E3%83%90%E3%83%BC/feed" rel="self" type="application/rss+xml" />
	<link>https://otonan-syusyoku.work</link>
	<description>三流プログラマー</description>
	<lastBuildDate>Sat, 22 Feb 2025 05:59:22 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://otonan-syusyoku.work/wp-content/uploads/2023/10/cropped-名称未設定のデザイン-16-32x32.png</url>
	<title>フェイルオーバー &#8211; エンジニア見習い</title>
	<link>https://otonan-syusyoku.work</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>RDSでフェイルオーバー試してみたよ</title>
		<link>https://otonan-syusyoku.work/archives/1448</link>
					<comments>https://otonan-syusyoku.work/archives/1448#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Wed, 18 Oct 2023 13:52:33 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RDS]]></category>
		<category><![CDATA[サーバー]]></category>
		<category><![CDATA[フェイルオーバー]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1448</guid>

					<description><![CDATA[DBのあるべき姿の冗長構成 みなさんはDBの冗長構成を取っていますか？ 冗長構成とは簡単に言うと、 システムやサービスの障害が発生した場合に、自動的に別のバックアップシステムやリソースに切り替え、中断を最小限に抑える仕組 [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>DBのあるべき姿の冗長構成</h2>
<p>みなさんはDBの冗長構成を取っていますか？</p>
<p>冗長構成とは簡単に言うと、<br />
<strong>システムやサービスの障害が発生した場合に、自動的に別のバックアップシステムやリソースに切り替え、中断を最小限に抑える仕組み</strong><br />
になります。</p>
<p>&nbsp;</p>
<p>冗長構成を取っていると <span class="sc_marker blue"><strong>DB に障害が発生した際でも被害を最小限に抑えてシステム運用することが可能</strong></span>となっています。</p>
<p>データに破損が起きると案件次第では損害賠償に発展したり、ユーザーへの悪影響が生じたりするなどビジネスチャンスを失ってしまいます。</p>
<p>可能な限り冗長構成を取るようにしましょう〜</p>
<h2>RDS for MySQL でフェイルオーバー試してみた</h2>
<div class="sc_frame_wrap inline orange">
<div class="sc_frame_title"><span class="sc_frame_icon"><i class="fa fa-bolt" aria-hidden="true"><span>fa-bolt</span></i></span>注意</div>
<div class="sc_frame note">
<p>RDS はちゃんとお金かかります！<br />
自分で払える範囲のスペックで構築してください！<br />
後、検証が終わったら RDS は閉じてください！！！<br />
※RDS は停止してもお金がかかります。。。。(インスタンス料金, データベースストレージ料金, バックアップストレージ料金)</p>
</div>
</div>
<h3>事前準備</h3>
<p>EC2 と RDS の構築は済まして置いてください。</p>
<p>その上で1秒毎にDBへデータを登録する処理を PHP で書いていきます。</p>
<pre class="line-numbers"><code class="language-php">&lt;?php
ini_set('mysqlnd.net_read_timeout', 3);
$i = 0;
$end_time = time() + 600;
while (time() &lt; $end_time) {
  $result = hoge();
  sleep(1);
  echo $i . ":" . $result . "\n";
  $i++;
}

function hoge () {
  $result = 'connectionWaiting';
  try {
    $dbh = new PDO(
      'mysql:host=database-1.cizcjskkh2r7.ap-northeast-1.rds.amazonaws.com;dbname=testDB;charset=UTF8mb4',
      'admin',
      'password',
    );
    $dbh-&gt;setAttribute(PDO::ATTR_TIMEOUT, 3);
    $sql = "INSERT INTO testTable (created) VALUES ('" . date('Y-m-d h:i:s') . "')";
    if ($dbh-&gt;query($sql)) {
      $result = 'Succees';
    } else {
      $result = 'Faile';
    }
  } catch (PDOException $e) {
    $request = 'Die';
  }
  return $result;
}
?&gt;</code></pre>
<h3>いざ実行</h3>
<h4>PHPの実行</h4>
<pre class="line-numbers"><code class="language-php">php index.php</code></pre>
<h4>RDS の再起動</h4>
<p>RDS はフェイルオーバー での再起動ができるので、フェイルオーバーのオプションを付けて再起動を行います。</p>
<p>まずはデータ登録処理のPHPを実行します。<br />
フェイルオーバー実行前のデータ↓</p>
<pre class="line-numbers"><code class="language-other">mysql&gt; select * from testTable;
+----+---------------------+
| id | created             |
+----+---------------------+
| 1 | 2023-10-18 10:39:07 |
| 2 | 2023-10-18 10:39:08 |
| 3 | 2023-10-18 10:39:09 |
| 4 | 2023-10-18 10:39:10 |
| 5 | 2023-10-18 10:39:11 |
| 6 | 2023-10-18 10:39:12 |
+----+---------------------+</code></pre>
<p>&nbsp;</p>
<p>フェイルオーバー実行後のデータ↓</p>
<pre class="line-numbers"><code class="language-other">mysql&gt; select * from testTable;
+----+---------------------+
| id | created |
+----+---------------------+
| 50 | 2023-10-18 10:39:57 |
| 51 | 2023-10-18 10:39:58 |
| 52 | 2023-10-18 10:39:59 |
| 53 | 2023-10-18 10:40:00 |
| 54 | 2023-10-18 10:40:01 |
| 55 | 2023-10-18 10:40:02 |
| 56 | 2023-10-18 10:40:03 |
| 57 | 2023-10-18 10:40:04 |        ← 再起動で止まったところと思われる箇所
| 58 | 2023-10-18 10:41:10 |        ← 再起動完了したところと思われる箇所
| 59 | 2023-10-18 10:41:11 |
| 60 | 2023-10-18 10:41:12 |
| 61 | 2023-10-18 10:41:14 |
| 62 | 2023-10-18 10:41:15 |
| 63 | 2023-10-18 10:41:16 |
| 64 | 2023-10-18 10:41:17 |
| 65 | 2023-10-18 10:41:18 |
| 66 | 2023-10-18 10:41:19 |
| 67 | 2023-10-18 10:41:20 |
| 68 | 2023-10-18 10:41:21 |
| 69 | 2023-10-18 10:41:22 |
+----+---------------------+</code></pre>
<h3>わかったこと</h3>
<ul>
<li>データは途切れるが、DB の復旧とともにデータ登録が可能となる
<ul>
<li>被害が大きくなりにくい</li>
<li>エンドポイントが変更されないので、プログラム側で特別な処理は不要（超嬉しい）</li>
</ul>
</li>
<li>難しい設定は不要
<ul>
<li>天下の Oracle 様が解説している高可用性構成の作り方<br />
<a href="https://www.oracle.com/jp/a/tech/docs/technical-resources/120127-mysql-ha.pdf">https://www.oracle.com/jp/a/tech/docs/technical-resources/120127-mysql-ha.pdf</a><br />
<a href="https://downloads.mysql.com/presentations/01_201311_MySQL_JP_Tech-Tour.pdf">https://downloads.mysql.com/presentations/01_201311_MySQL_JP_Tech-Tour.pdf</a></li>
</ul>
</li>
</ul>
<h3>わかっていないこと</h3>
<ul>
<li>大量のデータになった場合の復旧時間
<ul>
<li>今回の検証でもすぐに終わるときもあれば、３分以上かかる場合もあった</li>
</ul>
</li>
<li>PHP 側に `ini_set(‘mysqlnd.net_read_timeout’, 3)` を入れないと再起動が完了しても処理が継続しない
<ul>
<li>RDS 側でデッドロックが走っている？</li>
<li>接続先を探している？</li>
<li>RDS 側に設定が必要？</li>
<li>とりあえずプログラムでちょっとした工夫は必要そう</li>
</ul>
</li>
</ul>
<h2>まとめ</h2>
<p>今回の検証で RDS を使用して冗長性を確保することができたのではないかなぁという所感です〜</p>
<p>実際に検証を通して冗長性のある構成とはこんな感じなんだなぁと言うのがしれたのはかなり大きいです。笑</p>
<p>&nbsp;</p>
<p>実際、 DB を使わないシステムは限りなく少ないので DB が死んでも大丈夫と言える構成を取ることでビジネスチャンスを失わないというのはかなり大切だと考えています。</p>
<p>引き続き検証を続けていく必要がありそうです〜</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1448/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>僕が考えるRDSを激推する理由</title>
		<link>https://otonan-syusyoku.work/archives/1426</link>
					<comments>https://otonan-syusyoku.work/archives/1426#respond</comments>
		
		<dc:creator><![CDATA[hrokig2]]></dc:creator>
		<pubDate>Thu, 21 Sep 2023 14:42:53 +0000</pubDate>
				<category><![CDATA[インフラ]]></category>
		<category><![CDATA[業務]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RDS]]></category>
		<category><![CDATA[フェイルオーバー]]></category>
		<guid isPermaLink="false">https://otonan-syusyoku.work/?p=1426</guid>

					<description><![CDATA[僕が考えるRDS を激推する理由 バックアップが楽ちん RDS を推したい理由の上位にくるのがバックアップの手軽さです。 AWS の公式にも記載がある通り、バックアップを自動で取ってくれます。 過去に クラウドサーバー  [&#8230;]]]></description>
										<content:encoded><![CDATA[<h2>僕が考えるRDS を激推する理由</h2>
<h3>バックアップが楽ちん</h3>
<p>RDS を推したい理由の上位にくるのが<strong>バックアップの手軽さ</strong>です。</p>
<p>AWS の公式にも記載がある通り、バックアップを自動で取ってくれます。</p>
<p>過去に クラウドサーバー 上にインストールした MySQL のバックアップ手法として、<strong>cron にて AWS SDK for PHP を用いて S3にダンプファイルを保管</strong>する手法を取っていた自分からすると RDS のバックアップはかなり楽ちんです。<br />
だって、以下の設定が不要になりますからね。笑</p>
<ol>
<li>AWS SDK for PHP のインストール</li>
<li>cron にて日次の実行処理を記述</li>
<li>S3 に送信処理を記述</li>
</ol>
<blockquote><p>デフォルトで有効になっている Amazon RDS の自動バックアップ機能により、データベースとトランザクションログがバックアップされます。Amazon RDS では DB インスタンスのストレージボリュームのスナップショットを自動的に作成し、個々のデータベースだけではなく、その DB インスタンス全体をバックアップします。</p>
<p>このバックアップは、バックアップウィンドウと呼ばれるユーザーが設定可能な 30 分間隔の時間に 1 日 1 回行われます。自動バックアップは、お客様が設定した日数の間、保持されます (バックアップ保持期間と呼ばれます)。自動バックアップの保持期間は、最大 35 日間まで設定できます。</p>
<p><cite class="blockquote_ref"> <a href="https://aws.amazon.com/jp/rds/features/backup/#%E8%87%AA%E5%8B%95%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97" target="_blank" rel="noopener noreferrer">Amazon RDS のバックアップと復元</a> </cite></p></blockquote>
<p>&nbsp;</p>
<p>また、 RDS には自動バックアップに加えてポイントインタイムリカバリという機能があり、特定の時点に戻すことができます。（5分毎にデータベースの変更ログのアーカイブが自動で実行されます）</p>
<p>これは、データの損失を最小限に抑えることのできる機能となっており、ポカしやすい人には必需品と言えるほどの機能となっています。</p>
<p>先程申し上げた日次のバックアップだけでは不足しているバックアップ分を補填しているので、個人的にはすごく好きです。</p>
<blockquote><p>DB インスタンスを特定の時点に復元し、新しい DB インスタンスを作成できます。</p>
<p><cite class="blockquote_ref"> <a href="https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIT.html" target="_blank" rel="noopener noreferrer">DB インスタンスを特定の時点に復元し、新しい DB インスタンスを作成できます。</a> </cite></p></blockquote>
<h3>死活監視が楽ちん</h3>
<p>RDS はデフォルトでメトリクスデータを1分間隔で CloudWatch に送信してくれます。<br />
（CloudWatch はメトリクスの収集、アラームの設定、ログの収集と監視などを対応してくれるサービスです）</p>
<p>&nbsp;</p>
<p>これも自分ごとではありますが、死活監視をするために以下のようなインフラを構築しました。</p>
<table style="border-collapse: collapse; width: 100%; height: 519px;">
<tbody>
<tr style="height: 45px;">
<td style="width: 50%; text-align: center; height: 45px;">イメージ</td>
<td style="width: 50%; text-align: center; height: 45px;">設定手順</td>
</tr>
<tr style="height: 474px;">
<td style="width: 50%; height: 474px;"><img fetchpriority="high" decoding="async" src="https://otonan-syusyoku.work/wp-content/uploads/2023/09/アプリケーションを監視するサーバーを監視するサーバー.png" alt="監視構成" width="1000" height="500" class="aligncenter size-full wp-image-1443" srcset="https://otonan-syusyoku.work/wp-content/uploads/2023/09/アプリケーションを監視するサーバーを監視するサーバー.png 1000w, https://otonan-syusyoku.work/wp-content/uploads/2023/09/アプリケーションを監視するサーバーを監視するサーバー-300x150.png 300w, https://otonan-syusyoku.work/wp-content/uploads/2023/09/アプリケーションを監視するサーバーを監視するサーバー-768x384.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></td>
<td style="width: 50%; height: 474px;">
<ol>
<li>アプリケーションサーバー構築</li>
<li>アプリケーションサーバーを監視するサーバー（監視サーバー A）を構築
<ol>
<li>Zabbix をインストール</li>
<li>アプリケーションサーバーに 監視サーバーA のエージェントをインストール</li>
</ol>
</li>
<li>監視サーバーA にて監視設定</li>
<li>監視サーバーAを監視する監視サーバーBを構築
<ol>
<li>Zabbix をインストール</li>
<li>監視サーバーAに監視サーバーBのエージェントをインストール</li>
</ol>
</li>
<li>監視サーバーBにて監視設定</li>
</ol>
</td>
</tr>
</tbody>
</table>
<p>[getpost id=&#8221;1243&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;][getpost id=&#8221;1220&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<p>&nbsp;</p>
<p>手順書いてみたんですけど、すっげー面倒くさいですね。。。</p>
<p>その反面、 RDS では上記のような面倒くさい事をしなくても死活監視が簡単にできてしまうんです。</p>
<p>下記のあたりを見てれば DBが生きているかどうかを判別することができるので、すごく楽です。</p>
<ul>
<li>データベースの稼働状況</li>
<li>CPU使用率</li>
<li>メモリ使用率</li>
<li>ディスクストレージ</li>
<li>データベースのクエリおよびスロークエリ</li>
</ul>
<p>これらに対して閾値を設定して異常状態を感知できるようにすれば、僕が構築したよく分からない事はしなくても済むなんて素敵すぎる！！！！</p>
<h3>フェイルオーバーが楽ちん</h3>
<p>フェイルオーバー の構成を取っていると何らかの障害が起きた際に被害を最小限に止めることができます。</p>
<p>実際に手動で組み込んだことはないのですが、天下の Oracle 様の解説記事を読んでみるとごちゃごちゃと設定が必要そうで、適切な冗長構成を取るのが難しそうな印象を受けました。</p>
<p>&nbsp;</p>
<p>対して RDS は以下の条件を満たせば、冗長構成を取ることが可能となっています。</p>
<ul>
<li>マルチアベイラビリティーゾーン</li>
<li>ホットスタンバイオプションの有効化</li>
</ul>
<p>実際の手法を確認したい方はこちらの記事をご確認ください。</p>
<p>[getpost id=&#8221;1448&#8243; cat_name=&#8221;1&#8243; date=&#8221;0&#8243;]</p>
<h2>まとめ</h2>
<p>単純なDBを構築したい場合、<strong>RDS を使うことで楽に安全に構築することができます</strong>。</p>
<p>過去の自分に戒めを込めて、 RDS 使うと幸せになれることを胸張って伝えていきたいです。笑</p>
<p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://otonan-syusyoku.work/archives/1426/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
