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.1J'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 Usermysql>GRANT REPLICATION SLAVE ON *.* TO 'slave_test'@'10.19.194.57' IDENTIFIED BY 'Password@123456'; mysql>FLUSH PRIVILEGES; ---刷新
[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 命令去设置
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语句要用到,用于设置从库
.
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数值
slave_io_running :yes slave_sql_running :yes
mysql>show processlist;
//读库 DI()->read = function (){ $debug = !empty($_GET['__sql__']) ? true : false; return new PhalApi_DB_NotORM(DI()->config->get('read'), $debug); };
/** * 快速获取ORM实例,注意每次获取都是新的实例 */ protected function getORM($id = NULL){ $table = $this->getTableName($id); if($id == 'read'){ return DI()->read->$table; } return DI()->notorm->$table; }
//select操作 $this->getORM('read')->select('*')->where('aId', $aId)->fetchAll(); //insert,update,delete操作 $this->getORM()->insert();
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
//开发者库 DI()->developers = function (){ $debug = !empty($_GET['__sql__']) ? true : false; return new PhalApi_DB_NotORM(DI()->config->get('developers'), $debug); };
/** * 快速获取ORM实例,注意每次获取都是新的实例 */ protected function getORM($id = NULL){ $table = $this->getTableName($id); if($id == 'developers'){ return DI()->developers->$table; } return DI()->notorm->$table; }
--General //公用目录 --developers //通用项目库目录 --Domain //项目库Domain层 --Model //项目库Model层
然后我们在这里的Model进行的操作都是使用$this->getORM('developers')进行操作
这样规范的好处就是在与共享和模块化 让正常的一个Model层不会使用到任何不同库的操作,我们多个项目用到其他的一个库可以进行代码复用,
相关推荐:
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!