Heim  >  Artikel  >  Backend-Entwicklung  >  So erreichen Sie die Trennung von Datenbanklesen und -schreiben in Phalapi

So erreichen Sie die Trennung von Datenbanklesen und -schreiben in Phalapi

*文
*文Original
2017-12-23 16:41:181934Durchsuche

Die Lese-Schreib-Trennung ist in vielen Großprojekten eine gängige Lösung. Sie kann das Problem des Datenbankengpasses lösen, wenn eine große Anzahl von Lesevorgängen auftritt. Wie baut man also eine Datenbankverteilung mit Trennung von Lesen und Schreiben auf und wie führt das Terminal die Trennung von Lesen und Schreiben durch? Dieser Artikel erklärt die Implementierung der Lese- und Schreibtrennung anhand von Beispielen. Ich hoffe, dass er für alle hilfreich ist.

1. Trennung von Lesen und Schreiben

Wir sind ständig mit gleichzeitigen Problemen konfrontiert, wie zum Beispiel Verkehrsproblemen während der Hauptverkehrszeit nach der Arbeit. Menschen nutzen Ampeln, um einen Teil davon zu lösen Das Problem (aber es ist sehr schmerzhaft) Es ist dasselbe wie das Blockieren beim Abfragen, das Ausführen des Aktualisierungsvorgangs in 10 Sekunden und das Ausführen des Auswahlvorgangs in 10 Sekunden. Dann haben sich die Leute eine erhöhte Methode ausgedacht, die erhöhte Route ist konsistent Mit der normalen Route (die Daten sind gleich), erhöhte Punkte Es gibt zwei Straßen und Autos auf einer Straße können nicht auf die andere Straße fahren (Trennung von Lesen und Schreiben. Dies löst unsere regelmäßigen Parallelitätsprobleme

In). Tatsächlich scheint die obige Lösung besser zu sein, aber sie ist es nicht. Auf diese Weise gibt es zwei Straßen, deren Breite jedoch unterschiedlich ist. Hier nennen wir eine die Schreibstraße und die andere die Lesestraße Eine Lesestraße und die Verdoppelung ihrer Breite sind sehr einfach (d. h. mehrere Slave-Bibliotheken), aber wir können einen Schreibpfad einrichten, aber es ist schwieriger, diesen Schreibpfad zu erweitern, und wir tun dies im Allgemeinen nicht 🎜>

1.1 MySQL-Master-Slave-Konfiguration

Ich habe den Multi-Read-Bibliotheksdienst von Alibaba Cloud verwendet. Hier ist ein Verweis auf Baidus Erfahrung in der MySQL-Master-Slave-Verarbeitung


------ --------------------------------------- ----------- ------------------------- --------


MYSQL [Master-Slave-Konfiguration mehrerer Instanzen auf einem Host]

1. Erstellen Sie ein Konto

Geben Sie die MySQL-Datenbank ein und erstellen Sie eine Slave-Datenbank für das Sicherungskonto

mysql>GRANT REPLICATION SLAVE ON *.* TO 'slave_test'@'10.19.194.57' IDENTIFIED BY 'Password@123456';
mysql>FLUSH PRIVILEGES;   ---刷新
Einzelheiten zu diesem Befehl finden Sie im Befehl grant create user


2. Wenn bereits eine Instanz ausgeführt wird (da MySQL zu Beginn installiert wurde, es also eine Standardeinstellung gibt), dann starten Sie eine weitere Instanz wie folgt:

(1) Shell> cd /usr/local/mysql/

(2) shell>mkdir -pv / data/mysql2

(3)shell>chown -R mysql.mysql /data/mysql2

(4)shell>./scripts/mysql_install_db --user=mysql --datadir=/ data/mysql2 Dies ist ein weiteres Verzeichnis und das Erstellen einer Instanz

3 /etc/my.cnf. Die Konfigurationsmethode ist wie folgt:

[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = root
[mysqld] ## 本来mysql配置
server-id = 1
port = 3306
socket = /data/mysql/mysql.sock
datadir = /data/mysql
pid-file = /data/mysql/wzj.pid
log-error = /data/mysql/wzj.err
log-bin = /data/mysql/log/bin-log
log-bin-index = /data/mysql/log/mysql-bin.index
user = mysql
[mysqld2]  ##创建实例配置
server-id = 2
port = 3307
socket = /tmp/mysql2.sock
datadir = /data/mysql2/                         //mysql2存储数据库的地方,也就是实例
pid-file = /data/mysql2/mysql2.pid       //mysql2的pid文件记录
log-error = /data/mysql2/mysql2.err     //为错误日志文件的地方
user = mysql
#master-host =10.19.194.57
#master-user ='wzj_slave_test'
#master-pass ='Password@123456'
#master-port =3306
#master_connect_retry=60
#replicate-do-db =mysql_wzj
#replicate-ignore-db=mysql--------该段已注释,因为新版本中,需要用CHANGE MASTER TO 命令去设置

[Hinweis]: Die Verzeichnisse für die oben genannten Dateien werden alle vom System erstellt, nicht manuell. Starten Sie MySQL neu , und die Dateien werden automatisch erstellt


4. Starten Sie neu, und dann können Sie die Instanz mit dem Befehl msyql_multi starten und dann den Status der Masterdatenbank überprüfen. Binlog_Do_DB stellt die zu sichernde Datenbank dar und Binlog_Ignore_DB stellt die nicht zu sichernde Datenbank dar

shell>/etc/rc.d/init.d/mysqld start/stop/restart
shell>/usr/local/mysql/bin/mysqld_multi start 1-2  启动实例 (1-2表示启动1、2两个实例)
shell>mysql master: mysql -P 3306 -u root -p -S /data/mysql/mysql.sock (密码:1)
mysql>show master status; or show master status \G;   显示主库的状态,其中File 和Position 数值要记住,下面的mysql语句要用到,用于设置从库

5. Geben Sie die Slave-Datenbank ein und legen Sie einige der Slave-Datenbanken fest

6. Führen Sie nach der Einstellung den Start-Slave aus. Wenn die rote Linie in der Abbildung unten JA ist, ist der Vorgang erfolgreich. Überprüfen Sie andernfalls, ob die Konfigurationsdatei korrekt oder falsch ist.
shell>slave:mysql -P 3307 -u root -p -S /tmp/mysql2.sock (密码:回车)   ---另外开个远程
mysql>CHANGE MASTER TO
mysql> MASTER_HOST='10.19.194.57',  ---主库的地址
mysql>MASTER_USER='wzj_slave_test',  ---主库用户
mysql>MASTER_PASSWORD='Password@123456',   ---主库的密码
mysql>MASTER_LOG_FILE='bin-log.000013' ,  ---此参数为master status中的File值
mysql>MASTER_LOG_POS=120;   ---此数值为Position数值

7. Sie können die MySQL-Prozessinformationen unter der Slave-Bibliothek anzeigen
slave_io_running  :yes
slave_sql_running :yes

8. Erstellen Sie eine neue Datenbank in der Hauptbibliothek Erstellen Sie dann eine neue Datenbank in der Slave-Bibliothek. Überprüfen Sie, ob eine Synchronisierung erfolgt ~
mysql>show processlist;

-------------- ---------------------------------------------------------------- ---------------- ----------

1.2 Beginnen Sie mit der Verwirklichung des


dachte. Ich glaube, jeder hat mehr oder weniger Verständnis dafür, wie wir die Trennung von Lesen und Schreiben in Phalapi umsetzen können. Wir müssen eine Konfigurationsdatei read.php erstellen, die nur eine Verbindung zu diesen Lesekonfigurationselementen herstellt, und getORM in der Datei PhalApi_Model_NotORM registrieren

3. Wenn wir $this->getORM('read ') verwenden, wird die Lesebibliothek verwendet und $this->getORM() verwendet standardmäßig die Schreibbibliothek

2. Verarbeitung mehrerer Bibliotheken

//读库
DI()->read = function (){
    $debug = !empty($_GET['__sql__']) ? true : false;
    return new PhalApi_DB_NotORM(DI()->config->get('read'), $debug);
};
Manche Leute werden sich fragen: Wenn wir eine Verarbeitung mehrerer Datenbanken durchführen müssen, wird es dann bald möglich sein, alle Tabellen in einer Datenbank zusammenzufassen?

Bei der ursprünglichen Rekonstruktion der Outsourcing-Projekte anderer Leute stieß ich auf eine Datenbank mit 100 Tabellen, ohne Notizen und ohne Dokumente, was fast unmöglich war. Als ich an einem relativ großen Projekt arbeitete, habe ich auch einige Überlegungen zur Zerlegung angestellt Die Bibliothek kann entsprechend dem Unternehmen in Unterbibliotheken unterteilt werden. Dies kann das Problem zu vieler Tabellen und verwirrender Strukturen sehr gut vermeiden, und wir können jederzeit eine beliebige Unterbibliothek hinzufügen, wenn eine MySQL-Bibliothek viele enthält Druck, ich kann die Unterbibliothek auf diesem MySQL in mehrere MySQL zerlegen, um eine Druckverlagerung zu erreichen.
/**
 * 快速获取ORM实例,注意每次获取都是新的实例
 */
protected function getORM($id = NULL){
    $table = $this->getTableName($id);
    if($id == 'read'){
        return DI()->read->$table;
    }
    return DI()->notorm->$table;
}

Ich glaube, Sie werden es verstehen, nachdem Sie die obige Einführung gelesen haben. Es versteht sich von selbst, dass wir die Vorteile dieser Vorgehensweise verstehen. Aber wie kann man es implementieren? Kluge Leute denken vielleicht darüber nach, eine zusätzliche Datenbankverbindung wie oben zu registrieren. Tatsächlich haben wir halbwegs recht. Wir müssen eine Verbindung registrieren, aber wir benötigen eine einheitliche Spezifikation >

//select操作
$this->getORM('read')->select('*')->where('aId', $aId)->fetchAll();
//insert,update,delete操作
$this->getORM()->insert();

1. Initialisieren Sie die Datenbankverbindung, kopieren Sie dieselbe Kopie von dbs.php, um die Verbindungsentwicklerbibliothek für „developers.php“ zu konfigurieren.

2 getORM in der PhalApi_Model_NotORM-Datei

3 Wir haben unsere öffentliche allgemeine Datei vorher nicht erstellt, wir bauen eine solche Struktur

--General                   //公用目录
    --developers                //通用项目库目录
        --Domain                //项目库Domain层
        --Model             //项目库Model层

然后我们在这里的Model进行的操作都是使用$this->getORM('developers')进行操作


这样规范的好处就是在与共享和模块化 让正常的一个Model层不会使用到任何不同库的操作,我们多个项目用到其他的一个库可以进行代码复用,

相关推荐:

详解MySQL的主从复制、读写分离、备份恢复

php实现带读写分离功能的MySQL类完整实例

phalapi-缓存的使用以及redis拓展

Das obige ist der detaillierte Inhalt vonSo erreichen Sie die Trennung von Datenbanklesen und -schreiben in Phalapi. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn