2つのサーバーがあります:1-マスター、2-スレーブ。 フォールトトレラントシステムを構成する必要があります。このシステムは、1番目のサーバーやデータベースが落ちた場合に、最小のダウンタイムで2番目に自動的に切り替わります。 マスターの回復後、彼はスレーブになり、スレーブになります-マスター。 OS FreeBSD。
「魚」について少し。
手始めに、CARPに対処しましょう
CARP (英語のCommon Address Redundancy Protocol)は、ネットワークセグメント内の複数のホストが単一のIPアドレスを使用することを主なタスクとするネットワークプロトコルです。 // ウィキペディアから取得
## 192.168.10.1-マスター1
## 192.168.10.2-スレーブ2
1. carpを構成に追加し、カーネルを再構築します。
master1#ee / usr / src / sys / i386 / conf / MYKERNEL
device carp#共通アドレス冗長プロトコル
master1#cd / usr / src /
master1#make biuldkernel KERNCONF = MYKERNEL
master1#makekernel KERNCONF = MYKERNELを作成します
// 2番目のサーバーでも同じことを行います。
2.次に、次のエントリをMaster1の/etc/rc.confに追加します。
master1#ee /etc/rc.conf
## CARPを構成する
clone_interfaces = "carp0"
ifconfig_carp0 = "vhid 1 advskew 100 pass seCret 192.168.10.3/24"
#vhidは、インターフェースが機能するグループの番号です。
#passは、グループ内の認証用のパスワードです。
#advskewは優先度が低く、重要度が低いほど重要です。
#192.168.10.3 / 24-これは一般的なIPです。
2番目のサーバー(Slave2という名前にします)で、/ etc / rc.confに次のエントリを追加します。
slave2#ee /etc/rc.conf
## CARPを構成する
clone_interfaces = "carp0"
ifconfig_carp0 = "vhid 1 advskew 200 pass seCret 192.168.10.3/24"
3.次に、両方のマシンでsysctlオプションを設定します
master1#sysctl net.inet.carp.preempt = 1
slave2#sysctl net.inet.carp.preempt = 1
/etc/sysctl.confの両方のサーバーでこのオプションを追加します。
net.inet.carp.preempt = 1
#システムが正常にシャットダウンすると、カープインターフェイスに切断信号を送信します。
4.サーバーを再起動します。 再起動後
マスターシステム上のifconfig carp0:
carp0:フラグ= 49メトリック0 mtu 1500
inet 192.168.10.3ネットマスク0xffff0000
コイ:マスターvhid 1 advbase 1 advskew 100
スレーブシステムでifconfig carp0を作成します。
carp0:フラグ= 49メトリック0 mtu 1500
inet 192.168.10.3ネットマスク0xffff0000
コイ:バックアップvhid 1 advbase 1 advskew 200
「魚」が完成したら、レプリケーションのセットアップに移りましょう。
レプリケーション構成
mySQLレプリケーションの詳細についてはここで説明しているので、すぐに構成に移りましょう。
両方のサーバーで、ポートからmySQLをインストールします。
Master1#cd / usr / ports / databases / mysql55-server
Master1#インストールをクリーンにし、再ハッシュする
例から設定をコピーします
Master1#cp /usr/local/share/mysql/my-huge.cnf /etc/my.cnf
1. Wizard1でconfig /etc/my.cnfを開き、追加します
[mysqld]セクションへ
##マスター1
auto_increment_increment = 2
auto_increment_offset = 1
サーバーID = 1
relay-log = mysql-relay-bin
log_slave_updates = 1
skip_slave_start
relay-log-space-limit = 1G
log-bin = mysql-bin
2.スレーブ2で、構成/etc/my.cnfに追加します
##マスター2
auto_increment_increment = 2
auto_increment_offset = 2
log-bin = mysql-bin
サーバーID = 2
relay-log = mysql-relay-bin
log_slave_updates = 1
skip_slave_start
relay-log-space-limit = 1G
//もちろん、設定を使用してmySQLの作業を最適化するには、「ファイル」を使用する必要があります。 誰が非常に怠け者であるか、設定の複雑さを知りたくない場合は、デフォルトのままにしておくことができます。 しかし、設定にはPercona Serverの便利なtools.percona.comサービスを使用することをお勧めします。ところで、mySQL-serverの代わりにperconを使用できます。
3. mysqlを起動します
/usr/local/etc/rc.d/mysql-server start
mysqlを起動しています。
3. Master1でmysqlを入力します。
mysql @ master1>マスターステータスを表示。
+ ------------------ + ---------- + -------------- + ---- -------------- +
| ファイル| 位置| Binlog_Do_DB | Binlog_Ignore_DB |
+ ------------------ + ---------- + -------------- + ---- -------------- +
| mysql-bin.000001 | 499 | | |
+ ------------------ + ---------- + -------------- + ---- -------------- +
セット内の1行(0.00秒)
4. Slave2でmysqlと入力します。
mysql @ slave2>マスターステータスを表示。
+ ------------------ + ---------- + -------------- + ---- -------------- +
| ファイル| 位置| Binlog_Do_DB | Binlog_Ignore_DB |
+ ------------------ + ---------- + -------------- + ---- -------------- +
| mysql-bin.000002 | 499 | | |
+ ------------------ + ---------- + -------------- + ---- -------------- +
セット内の1行(0.00秒)
5. master1でmysqlを入力し、ユーザーを追加します。
mysql @ master1> GRANT REPLICATION SLAVE ON *。* to repl@192.168.10.1 IDENTIFIED BY 'replpass';
mysql @ master1> GRANT REPLICATION SLAVE ON *。* REPL@192.168.10.2 TO 'replpass'で識別;
mysql @ master1>フラッシュ特権;
6.同様にslave2でも:
mysql @ slave2> GRANT REPLICATION SLAVE ON *。* to repl@192.168.10.1 IDENTIFIED BY 'replpass';
mysql @ slave2> GRANT REPLICATION SLAVE ON *。* to repl@192.168.10.2 IDENTIFIED BY 'replpass';
mysql @ slave2>フラッシュ特権;
7. slave2で:
mysql @ slave2> MASTER_HOST = "192.168.10.1"、MASTER_USER = "repl"、MASTER_PASSWORD = "replpass"、MASTER_LOG_FILE = "mysql-bin.000001"、MASTER_LOG_POS = 499に変更します。
mysql @ slave2>スレーブを開始します。
8. Master1で:
mysql @ master1> MASTERをMASTER_HOST = "192.168.10.2"、MASTER_USER = "repl"、MASTER_PASSWORD = "replpass"、MASTER_LOG_FILE = "mysql-bin.000002"、MASTER_LOG_POS = 499に変更します。
mysql @ master1>スレーブを開始します。
9.両方のマスターで以下を実行します。
mysql @ master1>スレーブの状態を表示\ G
必要な情報はSlave_IO_RunningとSlave_SQL_Runningです
Slave_IO_Running: はい
Slave_SQL_Running: はい
やったー マスター-マスター複製の準備ができました。
スクリプト
現時点では、束はほぼ準備ができており、残りの1つの瞬間があります。
Master1がネットワーク上に落ちた場合、パッシブスレーブ2はCARP手段を使用してアクティブマスターになります。 ここで、データベースが落ちた場合に、パッシブスレーブ->アクティブマスターで行う「魚」を教える必要があります。
簡単なスクリプトを書きましょう。
スレーブ2#cd / tmp
スレーブ2#touch switch_script.sh && chmod + x switch_script.sh
Slave2#ee switch_script.sh
#!/bin/sh HOST1='192.168.10.1'; # master on server1 HOST2='192.168.10.2'; # slave on server2 GENERAL='192.168.10.3'; # General IP-adress MYSQL='/usr/local/bin/mysql' # Create infinite loop x=1 while [ $x -le 5 ]; do ${MYSQL} -s -h${HOST1} -urepl -preplpass --connect-timeout=10 -e 'SELECT VERSION()' > /dev/null out=$? if [ $out -eq 0 ]; then echo "server ${HOST1} is OK" sleep 60 # delay 1 min else /usr/local/bin/mysqladmin stop-slave /sbin/ifconfig carp0 ${GENERAL} vhid 1 advskew 50 echo "FAILED, cannot connect to mySQL" echo "This host ${HOST2} became a MASTER " exit 0 fi done
スクリプトを実行します。
スレーブ2#./switch_script.sh
まとめると。
mySQL Mater-Master(Active-Passive)レプリケーションとCARPネットワークプロトコルに基づいた、非常にシンプルで効果的なフェイルセーフシステムを取得しました。
ご清聴ありがとうございました。