1. はじめに
同時実行性の高い Web アプリケーションを構築する場合、アプリケーション層で負荷分散ソリューションを採用することに加えて、データベースも高可用性と高同時実行性をサポートする必要があります。最も一般的に使用されるデータベース最適化ソリューションは、マスター/スレーブ レプリケーションを通じてデータを同期し、読み取りと書き込みの分離 (MySQL-Proxy) を通じてデータベースの同時負荷容量を向上させることです。
1. レプリケーションオプションと読み取りと書き込みの分離
Sequelize は読み取り/書き込みの分離をサポートしており、読み取りと書き込みのそれぞれに Sequelize インスタンスを作成するのがより便利です。インスタンスを作成するには、レプリケーション オプションを使用して読み取り/書き込みデータベースを個別に指定します。
Sequelize で読み取り/書き込みレプリケーションを使用するには、Sequelize の初期化時にオブジェクトをそのレプリケーション オプションに渡すことができます。このオブジェクトには読み取りと書き込みの 2 つのプロパティがあります。 write は単一のオブジェクト (つまり、書き込みは単一のサーバーによって処理されます) ですが、read はオブジェクトを含む配列です (つまり、読み取りは複数のサーバーによって処理されます)。各読み取りおよび書き込みサーバーには次の属性を含めることができます:
· host - データベース サーバーのホスト
· port - データベース サーバーのホスト ポート
· username - 検証ユーザー名
· パスワード - 検証パスワード
· データベース - 接続するデータベース
2. Sequelize 読み取り/書き込み分離の例
マスター/スレーブ レプリケーションを使用する複数のデータベース クラスターでは、レプリケーション オブジェクトの読み取り属性に設定できます。サーバー接続の 1 つ以上のコピーを渡すことができる配列。読み取り操作は、すべての SELECT クエリ操作 (読み取り操作) を処理する、データベース クラスター内のスレーブ ノードでの操作と同等です。レプリケーション オブジェクトの書き込み属性は、サーバー接続を表すオブジェクトであり、書き込み操作はすべての挿入、更新、および削除操作 (書き込み操作) を処理します。
var sequelize = new Sequelize('database', null, null, { dialect: 'mysql', port: 3306 replication: { read: [ { host: '192.168.1.33', username: 'itbilu.com', password: 'pwd' }, { host: 'localhost', username: 'root', password: null } ], write: { host: 'localhost', username: 'root', password: null } }, pool: { // 如果需要重写链接池,请在 pool 选项中修改 maxConnections: 20, maxIdleTime: 30000 }, })
すべてのグローバル設定はすべてのノードのコピーに適用されるため、インスタンスごとに個別に指定する必要はありません。上記の例では、データベース名とポート番号がすべてのノード レプリカに適用され、ユーザー名とパスワードのオプションも同様に適用されます。ノード レプリカがグローバル設定を使用しない場合は、レプリケーション オプションで個別に指定する必要があります。
注: Sequelize はマスター/スレーブ レプリケーション ノードとノード間のデータ同期 (レプリケーション) をセットアップしません。これらの操作は実際には MySQL (または使用するデータベース) によって完了します。 Sequelize は、マスター ノードとスレーブ ノードからのデータの書き込みまたは読み取りのみを担当します。
Sequelize は接続プールを使用してノードのコピーを管理します。
デフォルトのオプションは次のとおりです:
{ maxConnections: 10, minConnections: 0, maxIdleTime:1000 }