Verteilte Datenbank (Query Builder 20)


Verteilte Unterstützung

Die Datenzugriffsschicht unterstützt verteilte Datenbanken, einschließlich Lese- und Schreibtrennung. Um verteilte Datenbanken zu aktivieren, müssen Sie den Bereitstellungsparameter in der Datenbankkonfiguration aktivieren Datei:

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

Nach der Aktivierung der verteilten Datenbank ist der Hostname-Parameter der Schlüssel. Die Anzahl der Hostnamen bestimmt die Anzahl der verteilten Datenbanken. Standardmäßig ist die erste Adresse der Hauptserver.

Die Master- und Slave-Server unterstützen die Einstellung verschiedener Verbindungsparameter, darunter:

连接参数
username
password
hostport
database
dsn
charset

Wenn die oben genannten Parameter des Master- und Slave-Servers konsistent sind, müssen Sie nur einen festlegen. Für verschiedene Parameter können Sie sie separat festlegen, zum Beispiel:

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',
];

Denken Sie daran Entweder gleich oder jeder muss eingerichtet werden.

Verteilte Datenbankparameter unterstützen die Verwendung von Array-Definitionen (normalerweise, um ein falsches Sparen mehrerer Konten und Passwörter zu vermeiden), zum Beispiel:

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',
];

Lesen und Schreiben Trennung

Sie können auch festlegen, ob das Lesen und Schreiben der verteilten Datenbank getrennt ist. Standardmäßig sind Lesen und Schreiben nicht getrennt, dh jeder Server kann Lese- und Schreibvorgänge ausführen . Für eine Master-Slave-Datenbank müssen Sie eine Lese-Schreib-Trennung einrichten. Dies können Sie über die folgenden Einstellungen tun:

    'rw_separate' => true,

Bei der Lese-/Schreib-Trennung ist die standardmäßige erste Datenbankkonfiguration die Konfiguration Informationen des Hauptservers, der für das Schreiben von Daten verantwortlich ist. Wenn der Parameter master_num gesetzt ist, können mehrere Master-Server zum Schreiben unterstützt werden (jedes Mal wird ein Master-Server zufällig verbunden). Die anderen Adressen stammen alle aus der Datenbank und sind für das Lesen von Daten verantwortlich. Die Anzahl ist nicht begrenzt. Jedes Mal, wenn Sie eine Verbindung zum Slave-Server herstellen und einen Lesevorgang durchführen, wählt das System zufällig einen Slave-Server aus. Bei jeder Anfrage für dieselbe Datenbankverbindung werden der Master-Server und der Slave-Server nur einmal verbunden. Wenn der Slave-Server für eine bestimmte Anfrage nicht verbunden werden kann, wechselt er für Abfragevorgänge automatisch zum Master-Server.

Wenn Sie kein zufälliges Lesen wünschen oder in einigen Fällen andere Slave-Server vorübergehend nicht verfügbar sind, können Sie auch „slave_no“ festlegen, um einen festen Server für Lesevorgänge anzugeben. Die durch „slave_no“ angegebene Seriennummer stellt die Seriennummer dar Die Datenbankadresse im Hostnamen, beginnend bei 0.

Wenn Sie die CURD-Operation einer Abfrageklasse oder eines Abfragemodells aufrufen, ermittelt das System automatisch, ob es sich bei der aktuell ausgeführten Methode um eine Leseoperation oder eine Schreiboperation handelt, und stellt gegebenenfalls eine Verbindung zum Master-Slave-Server her Wenn Sie natives SQL verwenden, müssen Sie auf die Standardregel des Systems achten: Schreibvorgänge müssen die Ausführungsmethode der Datenbank verwenden, und Lesevorgänge müssen die Abfragemethode der Datenbank verwenden. Andernfalls kommt es zu einem Master-Slave-Lese- und Schreibchaos.

Wenn die folgenden Situationen auftreten, wird automatisch eine Verbindung zum Hauptserver hergestellt:

1. Verwenden Sie die Datenbank-Schreiboperationsmethode (Ausführen/Einfügen/Aktualisieren/Löschen und abgeleitete Methoden); >

2. Wenn die Datenbanktransaktionsmethode aufgerufen wird, wird automatisch eine Verbindung zum Hauptserver hergestellt

3. Wenn die Verbindung vom Slave-Server fehlschlägt, wird automatisch eine Verbindung zum Master-Server hergestellt.

Die Sperrmethode des Abfragekonstruktors wird aufgerufen Der Abfragekonstruktor heißt

Die Datensynchronisationsarbeit der Master-Slave-Datenbank ist nicht im Framework implementiert, und die Datenbank muss ihren eigenen Synchronisations- oder Replikationsmechanismus berücksichtigen. Wenn es nach dem Schreiben großer Datenmengen oder unter besonderen Umständen zu einer Synchronisierungsverzögerung kommen kann, können Sie die Methode master () aufrufen, um die Hauptdatenbank abzufragen.

In tatsächlichen Produktionsumgebungen unterscheidet sich der datenbankverteilte Implementierungsmechanismus vieler Cloud-Hosts von der lokalen Entwicklung, aber normalerweise werden die folgenden zwei Methoden verwendet:

Die erste: Bereitstellung der Schreib-IP und Lese-IP (normalerweise eine virtuelle IP) wird verwendet, um die Lese- und Schreibvorgänge der Datenbank zu trennen.

Der zweite Typ: Behalten Sie immer die gleiche IP bei, um eine Verbindung zur Datenbank herzustellen, und lesen und schreiben Sie getrennte IP-Planungen intern durchgeführt werden (Alibaba Cloud So funktioniert es).

Aus der Hauptbibliothek lesen

In einigen Fällen müssen Sie Daten direkt aus der Hauptdatenbank lesen. Nachdem die Daten gerade geschrieben wurden, hatten die Daten der Slave-Datenbank beispielsweise keine Zeit, synchronisiert zu werden. Sie können

Db::name('user')
    ->where('id', 1)
    ->update(['name' => 'thinkphp']);
Db::name('user')
    ->master(true)
    ->find(1);
<🎜 verwenden > Die tatsächliche Situation ist jedoch weitaus komplizierter, da Sie nicht wissen, ob in den nachfolgenden Methoden noch verwandte Abfragevorgänge vorhanden sind. Zu diesem Zeitpunkt können wir den Konfigurationsparameter read_master konfigurieren, um die Datenbank zu öffnen. Nachdem

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

aktiviert ist und wir in eine Datentabelle schreiben, verwenden alle nachfolgenden Abfragen an die Tabelle in der aktuellen Anforderung die Hauptbibliothek zum Lesen.