Maison  >  Article  >  développement back-end  >  Comment réaliser la séparation de la lecture et de l'écriture de la base de données dans Phalapi

Comment réaliser la séparation de la lecture et de l'écriture de la base de données dans Phalapi

*文
*文original
2017-12-23 16:41:181934parcourir

La séparation lecture-écriture est une solution couramment utilisée dans de nombreux projets à grande échelle. Elle peut résoudre le problème de goulot d'étranglement de la base de données lorsqu'un grand nombre d'opérations de lecture se produisent. Alors, comment créer une distribution de base de données avec séparation en lecture et en écriture, et comment le terminal effectue-t-il les opérations de séparation en lecture et en écriture ? Cet article explique la mise en œuvre de la séparation en lecture et en écriture basée sur les phalapi à partir d'exemples. J'espère qu'il sera utile à tout le monde.

1. Séparation de la lecture et de l'écriture

Nous sommes confrontés à des problèmes simultanés tout le temps dans notre vie, tels que des problèmes de circulation aux heures de pointe après avoir quitté le travail. le problème (mais c'est très douloureux) C'est la même chose que bloquer lors d'une requête. Il faut 10 secondes pour effectuer une opération de mise à jour et 10 secondes pour effectuer une opération de sélection.) Ensuite, les gens ont pensé à une méthode d'itinéraire surélevé. est cohérent avec l'itinéraire normal (les données sont les mêmes). La division surélevée Il y a deux routes et les voitures sur une route ne peuvent pas aller sur l'autre route (séparation de la lecture et de l'écriture). Cela résout nos problèmes de concurrence habituels

<.>En fait, il semble que la solution ci-dessus soit meilleure, mais ce n'est pas le cas. De cette façon, il y a deux routes mais leurs largeurs sont en fait différentes. Ici, nous appelons l'une la route d'écriture et l'autre la route de lecture. vouloir faire un chemin de lecture et doubler sa largeur, c'est très simple (c'est-à-dire plusieurs bibliothèques esclaves), mais on peut établir un chemin d'écriture, mais il est plus difficile d'élargir ce chemin d'écriture, et on ne le fait généralement pas. ceci.

Configuration maître-esclave mysql 1.1

J'ai utilisé le service de bibliothèque multi-lecture d'Alibaba Cloud Voici une référence à l'expérience de Baidu dans le traitement maître-esclave mysql

<.>


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


MYSQL [Configuration maître-esclave de plusieurs instances sur un seul hôte]

1.

Entrez dans la base de données MySQL et créez une base de données esclave pour le compte de sauvegarde

Pour plus de détails sur cette commande, veuillez vous référer à la commande Grant Create User
mysql>GRANT REPLICATION SLAVE ON *.* TO &#39;slave_test&#39;@&#39;10.19.194.57&#39; IDENTIFIED BY &#39;Password@123456&#39;;
mysql>FLUSH PRIVILEGES;   ---刷新


2. S'il y a déjà une instance en cours d'exécution (car mysql a été installé au début, il y a donc une valeur par défaut), alors démarrez une autre instance comme suit :

(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 Ceci est un autre répertoire. Cette étape consiste à initialiser le répertoire et à créer une instance

. 3. Configurez /etc/my.cnf. La méthode de configuration est la suivante

[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 =&#39;wzj_slave_test&#39;
#master-pass =&#39;Password@123456&#39;
#master-port =3306
#master_connect_retry=60
#replicate-do-db =mysql_wzj
#replicate-ignore-db=mysql--------该段已注释,因为新版本中,需要用CHANGE MASTER TO 命令去设置
[Note] : Les répertoires des fichiers ci-dessus sont tous créés par le système, pas manuellement après avoir défini le fichier de configuration. , redémarrez MySQL et les fichiers seront automatiquement créés


4. Redémarrez, puis vous pourrez utiliser la commande msyql_multi pour démarrer l'instance, puis vérifier l'état du base de données principale. Binlog_Do_DB représente la base de données à sauvegarder et Binlog_Ignore_DB représente la base de données à ne pas sauvegarder

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 Entrez la base de données esclave et définissez certaines des bases de données esclaves

.

shell>slave:mysql -P 3307 -u root -p -S /tmp/mysql2.sock (密码:回车)   ---另外开个远程
mysql>CHANGE MASTER TO
mysql> MASTER_HOST=&#39;10.19.194.57&#39;,  ---主库的地址
mysql>MASTER_USER=&#39;wzj_slave_test&#39;,  ---主库用户
mysql>MASTER_PASSWORD=&#39;Password@123456&#39;,   ---主库的密码
mysql>MASTER_LOG_FILE=&#39;bin-log.000013&#39; ,  ---此参数为master status中的File值
mysql>MASTER_LOG_POS=120;   ---此数值为Position数值
6. Après le réglage, exécutez start slave. Si la ligne rouge dans la figure ci-dessous est OUI, c'est réussi. Sinon, vérifiez si le fichier de configuration est correct ou incorrect.

slave_io_running  :yes
slave_sql_running :yes
7. Vous pouvez afficher les informations du processus MySQL sous la bibliothèque esclave

mysql>show processlist;
Test

Créer une nouvelle base de données sur la bibliothèque principale et puis créez une nouvelle base de données dans la bibliothèque esclave Vérifiez s'il y a synchronisation~

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


1.2 Commencer à réaliser le

réfléchi. Nous avons fini d'en parler. Je pense que tout le monde a plus ou moins compris. Mais comment implémenter la séparation lecture-écriture dans phalapi

1. pour créer un fichier de configuration read.php, comme dbs.php, qui se connecte uniquement à cette bibliothèque de lecture d'éléments de configuration, et enregistrez

//读库
DI()->read = function (){
    $debug = !empty($_GET[&#39;__sql__&#39;]) ? true : false;
    return new PhalApi_DB_NotORM(DI()->config->get(&#39;read&#39;), $debug);
};
2 Modify getORM dans le fichier PhalApi_Model_NotORM

.
/**
 * 快速获取ORM实例,注意每次获取都是新的实例
 */
protected function getORM($id = NULL){
    $table = $this->getTableName($id);
    if($id == &#39;read&#39;){
        return DI()->read->$table;
    }
    return DI()->notorm->$table;
}
3. Lorsque nous utilisons $this->getORM('read '), la bibliothèque de lecture sera utilisée, et $this->getORM() utilisera la bibliothèque d'écriture par défaut

//select操作
$this->getORM(&#39;read&#39;)->select(&#39;*&#39;)->where(&#39;aId&#39;, $aId)->fetchAll();
//insert,update,delete操作
$this->getORM()->insert();
2. Traitement multi-bibliothèques

Certaines personnes se demanderont pourquoi si nous devons effectuer un traitement multi-bases de données, sera-t-il bientôt possible de regrouper toutes les tables dans une seule base de données ?

Lors de la reconstruction originale des projets d'externalisation d'autres personnes, j'ai rencontré une base de données avec 100 tables, sans notes ni documents, ce qui était presque impossible. Écoutez, lorsque je travaillais sur un projet relativement volumineux, j'ai également pris en compte la décomposition de la bibliothèque. dans les sous-bibliothèques en fonction de l'activité. Cela peut très bien éviter le problème d'un trop grand nombre de tables et de structures confuses, et nous pouvons en ajouter n'importe quelle à tout moment. Après avoir transplanté la sous-bibliothèque, lorsqu'un mysql supporte beaucoup de pression, Je peux décomposer la sous-bibliothèque de ce mysql en plusieurs mysql pour réaliser le déchargement de pression

Je pense que vous comprendrez après avoir lu l'introduction ci-dessus. Il va sans dire que nous comprenons les avantages de cela, mais. comment l'implémenter ? Les gens intelligents envisagent peut-être d'enregistrer une connexion à la base de données supplémentaire comme ci-dessus. En fait, tout le monde a à moitié raison. Nous devons enregistrer une connexion, mais nous avons besoin d'une spécification unifiée pour utiliser ce type d'opération.


1. Initialisez la connexion à la base de données, copiez la même copie de dbs.php pour configurer la bibliothèque de développement de connexion pour développeurs.php

2. dans le fichier PhalApi_Model_NotORM
//开发者库
DI()->developers = function (){
    $debug = !empty($_GET[&#39;__sql__&#39;]) ? true : false;
    return new PhalApi_DB_NotORM(DI()->config->get(&#39;developers&#39;), $debug);
};

3 Nous n'avons pas créé notre fichier public Général auparavant, nous construisons une telle structure
/**
 * 快速获取ORM实例,注意每次获取都是新的实例
 */
protected function getORM($id = NULL){
    $table = $this->getTableName($id);
    if($id == &#39;developers&#39;){
        return DI()->developers->$table;
    }
    return DI()->notorm->$table;
}
.
--General                   //公用目录
    --developers                //通用项目库目录
        --Domain                //项目库Domain层
        --Model             //项目库Model层

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


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

相关推荐:

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

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn