分散データベース (クエリビルダー 20)


分散サポート

データ アクセス層は、読み取りと書き込みの分離を含む分散データベースをサポートします。分散データベースを有効にするには、デプロイ パラメータを有効にする必要があります。

return [
    // 启用分布式数据库
    'deploy'    =>  1,
    // 数据库类型
    'type'        => 'mysql',
    // 服务器地址
    'hostname'    => '192.168.1.1,192.168.1.2',
    // 数据库名
    'database'    => 'demo',
    // 数据库用户名
    'username'    => 'root',
    // 数据库密码
    'password'    => '',
    // 数据库连接端口
    'hostport'    => '',
];

分散データベースを有効にした後は、ホスト名パラメータがキーとなります。ホスト名の数によって分散データベースの数が決まります。デフォルトでは、最初のアドレスがメイン サーバーです。

マスター/スレーブ サーバーは、次のようなさまざまな接続パラメータの設定をサポートします。

接続パラメータ
#ユーザー名
パスワード
ホストポート
データベース
dsn
charset

マスター サーバーとスレーブ サーバーの上記のパラメーターが一貫している場合は、1 つだけ設定する必要があります。異なるパラメーターについては、個別に設定できます。例:

return [
    // 启用分布式数据库
    'deploy'   => 1,
    // 数据库类型
    'type'     => 'mysql',
    // 服务器地址
    'hostname' => '192.168.1.1,192.168.1.2,192.168.1.3',
    // 数据库名
    'database' => 'demo',
    // 数据库用户名
    'username' => 'root,slave,slave',
    // 数据库密码
    'password' => '123456',
    // 数据库连接端口
    'hostport' => '',
    // 数据库字符集
    'charset'  => 'utf8',
];

覚えておいてください。同じか、それぞれを設定する必要があります。

分散データベース パラメーターは、配列定義の使用をサポートしています (通常、複数のアカウントとパスワードの解析ミスを避けるため)。例:

return [
    // 启用分布式数据库
    'deploy'   => 1,
    // 数据库类型
    'type'     => 'mysql',
    // 服务器地址
    'hostname' =>[ '192.168.1.1','192.168.1.2','192.168.1.3'],
    // 数据库名
    'database' => 'demo',
    // 数据库用户名
    'username' => 'root,slave,slave',
    // 数据库密码
    'password' => ['123456','abc,def','hello']
    // 数据库连接端口
    'hostport' => '',
    // 数据库字符集
    'charset'  => 'utf8',
];

読み取りと書き込みの分離

分散データベースの読み取りと書き込みを分離するかどうかも設定できます。デフォルトでは、読み取りと書き込みは分離されていません。つまり、各サーバーが読み取りと書き込みの操作を実行できます。マスター/スレーブ データベースの場合, 読み取りと書き込みの操作を設定する必要があります。書き込みの分離は次の設定によって実現できます:

    'rw_separate' => true,

読み取りと書き込みの分離の場合、デフォルトの最初のデータベース構成はメイン サーバーの構成情報ですmaster_num パラメータが設定されている場合、複数のマスター サーバーへの書き込みをサポートできます (一度に 1 つのマスター サーバーにランダムに接続します)。他のアドレスはすべてデータベースからのものであり、データの読み取りを担当し、数に制限はありません。スレーブ サーバーに接続して読み取り操作を実行するたびに、システムはスレーブ サーバーからランダムに選択します。同じデータベース接続に対する各リクエストはマスター サーバーとスレーブ サーバーに 1 回だけ接続され、特定のリクエストのスレーブ サーバーが接続できない場合は、自動的にマスター サーバーに切り替えてクエリ操作を実行します。

ランダムな読み取りを望まない場合、または他のスレーブ サーバーが一時的に利用できない場合は、slave_no を設定して読み取り操作用の固定サーバーを指定することもできます。slave_no で指定されたシリアル番号は、スレーブ サーバーのシリアル番号を表します。ホスト名のデータベース アドレス。0 から始まります。

クエリ クラスまたはモデルの CURD 操作を呼び出すと、システムは現在実行されているメソッドが読み取り操作であるか書き込み操作であるかを自動的に判断し、マスター サーバーとスレーブ サーバーを自動的に接続します。ネイティブ SQL を使用する場合は、システムに注意する必要があります。 デフォルト ルール: 書き込み操作はデータベースの実行メソッドを使用し、読み取り操作はデータベースのクエリ メソッドを使用する必要があります。そうしないと、マスター/スレーブの読み取りと書き込みの混乱が発生します。

次の状況が発生した場合、メイン サーバーは自動的に接続されます:

1. データベースの書き込み操作メソッドが使用されます (実行/挿入/更新/削除および派生メソッド)。

2. データベース トランザクション メソッドが呼び出されると、自動的にメイン サーバーに接続されます;

3. スレーブ サーバーの接続が失敗した場合は、自動的にメイン サーバーに接続されます。

##4. クエリ コンストラクターは lock メソッドと呼ばれます;

5. クエリ コンストラクターの master/readMaster メソッドは呼ばれます

マスター/スレーブ データベースのデータ同期作業フレームワークには実装されていないため、データベースは独自の同期またはレプリケーション メカニズムを考慮する必要があります。大量のデータの書き込み後、または特殊な状況下で同期遅延が発生する可能性がある場合は、master() メソッドを呼び出してメイン データベースにクエリを実行できます。

実際の運用環境では、多くのクラウド ホストのデータベース分散実装メカニズムはローカル開発とは異なりますが、通常は次の 2 つの方法が使用されます。

最初の方法: 書き込みの提供IP と読み取り IP (通常は仮想 IP) は、データベースの読み取り操作と書き込み操作を分離するために使用されます。

2 番目のタイプ: データベースに接続するために常に同じ IP を維持し、読み取りと書き込みの分離された IPスケジューリングは内部で実行されます (Alibaba Cloud はそのように動作します)。

メインライブラリの読み取り

場合によっては、メイン データベースからデータを直接読み取る必要があります。たとえば、データが書き込まれた直後、スレーブ データベースのデータを同期する時間がありません。

を使用できます。
Db::name('user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);
Db::name('user')
    ->master(true)
    ->find(1);

ただし、実際の状況はこれよりもはるかに複雑です。後続のメソッドに関連するクエリ操作がまだ存在するかどうかわからないため、複雑です。この時点で、read_master 構成パラメータを設定して、データベース。

// 开启自动主库读取
'read_master' => true,

これをオンにすると、データ テーブルに書き込むと、現在のリクエスト内のテーブルに対する後続のすべてのクエリがメイン ライブラリを使用して読み取ります。