首页 理论教育PHPMVC开发实战中的ThinkPHP读写分离实现

PHPMVC开发实战中的ThinkPHP读写分离实现

【摘要】:事实上,ThinkPHP已经完美地解决了读写分离功能,本节将会详细介绍。本例中主数据库的ip地址为192.168.2.1;从数据库的ip地址为192.168.2.2,读者可以使用虚拟机来模拟上述环境。配置完成后,保存配置文件,重启MySQL数据库。接下来将结合ThinkPHP实现数据的读写分离。ThinkPHP提供了完善的读写分离功能,开发人员不需要手动切换数据库。

前面介绍过多数据库动态切换可以实现数据库读写分离,但这种方式是需要手动切换的,也就是说读的时候需要开发人员指定数据库,写的时候也是如此。事实上,ThinkPHP已经完美地解决了读写分离功能,本节将会详细介绍。

读写分离的本质是数据主从同步,所以要想真正实现读写分离,还必须要在数据库系统内首先实现主从同步复制。由于主从复制在每种数据库上实现的方式都不尽相同,而且涉及数据库系统知识,这不是本书介绍对象,所以接来下不会深入介绍数据库主从复制的原理,只简单介绍实现一个简单的数据库主从复制过程。

1.配置数据库主从复制

仍然以MySQL为例,介绍MySQL主从复制的配置过程。要实现MySQL主从复制,需要确保主MySQL服务器的版本号大于或等于从MySQL服务器的版本号,并且需要确保版本号大于5.1。除此之外还需要确保开启了数据库bin-log二进制日志和慢查询日志。前者是必需的,而后者是可选的,用于数据库维护和调优。

由于bin-log日志是主从复制的关键,所以这里有必要进行简单介绍(更多资料可以参阅MySQL官方手册或者相关书籍)。bin-log是MySQL数据库中非常有用的一种高级日志,它完全地记录了数据库系统对数据库所有的增、删、改、查行为,但不会记录服务器本身的健康状态。假设程序执行了select*from tpk_user where id=5语句,那么bin-log将会完整地记录,并且为该操作添加上position值。

所有bin-log日志默认存放于数据库存放目录里(默认为data或var),bin-log日志是一种二进制文件,使用一般的文本编辑器无法打开(如记事本、vi等)。MySQL提供了MySQLbinlog管理工具用于查看bin-log日志。利用bin-log存放完整SQL语句的特性,系统管理人员可以轻易地从bin-log日志中恢复数据。同样的原理,MySQL主从复制并不是真正地复制数据表中的信息,而是复制主数据库中的bin-log日志,然后再从这些日志中恢复数据,实现数据的复制。所以要实现主从复制首要前提就是开启bin-log日志,并且确保主从数据库之间的master bin-log日志中的position值相同。

下面将使用两台MySQL数据库服务器为例,简单介绍主从复制的过程,满足本章后续的学习需要。本例中主数据库的ip地址为192.168.2.1;从数据库的ip地址为192.168.2.2,读者可以使用虚拟机来模拟上述环境。下面首先配置主数据库。

(1)配置主MySQL服务器

前面多次提到要实现主从复制,首先需要开启bin-log日志功能,无论主服务器还是从服务器都一样。首先查看主服务器的bin-log日志状态。

978-7-111-42852-7-Part02-261.jpg

如果结果为ON则表示bin-log日志已经处于激活状态,否则需要打开MySQL配置文件,开启bin-log功能,如以下代码所示。

978-7-111-42852-7-Part02-262.jpg

作为主服务器,还需要配置服务器的server-id,该值是唯一性的,是主从服务的重要标识,通常情况下主服务器的server-id设置为1,如以下代码所示。

978-7-111-42852-7-Part02-263.jpg

配置完成后,保存配置文件,重启MySQL数据库。至此,主服务器就基本配置完成了,剩下的只需要配置一个专用于同步数据的用户即可。为了安全,在此只赋给同步用户复制数据的权限,读者可以使用可视化的phpmyadmin来设置,也可以使用命令行操作,命令如下代码所示。

978-7-111-42852-7-Part02-264.jpg

如果使用phpmyadmin管理工具,创建的用户只需要确保REPLICATION SLAVE被打“√”即可,如图7-6所示。

978-7-111-42852-7-Part02-265.jpg

图7-6 选择REPLICATION SLAVE

通过前面的步骤,主服务器就配置完成了,最后将数据库tp中的表和数据导出,以便导入到从服务器,确保主从数据库中的数据一致。读者可以使用mysqldump导出,也可以使用phpmyadmin导出。mysqldump命令如下。

978-7-111-42852-7-Part02-266.jpg

以上是Linux的导出路径,如果是Windows系统,需要做对应的更改。mysqldump工具位于MySQL安装路径的bin目录(例如/usr/local/mysql/bin)。(www.chuimin.cn)

(2)配置从MySQL服务器

首先创建一个数据库用于存放主数据库中的数据,这里将从服务器的数据库命名为tp(5.1.7后的版本需要确保主从一致),然后将前面导出的tp.sql数据导入到该数据库中,接着将tp.sql文件复制到从服务器上,最后执行导入步骤,如以下代码所示。

978-7-111-42852-7-Part02-267.jpg

读者也可以使用可视化的phpmyadmin导入数据。但如果使用phpmyadmin导入时,主从数据库都需要使用reset master命令重置bin-log日志。

导入数据之后,根据前面讲述的方式查看是否已经启动bin-log日志。如果没有,需要打开配置文件开启bin-log日志功能,然后设置配置文件中的server-id为2,如以下代码所示。

978-7-111-42852-7-Part02-268.jpg

修改配置文件后,需要重新启动MySQL,以便让新配置生效。最后进入MySQL命令行工具,执行同步操作,如以下代码所示。

978-7-111-42852-7-Part02-269.jpg

现在可以使用show slave status命令查看同步状态,如果Slave_IO_Running和Slave_SQL_Running这两项都为yes则表示同步成功,如以下代码所示。

978-7-111-42852-7-Part02-270.jpg

978-7-111-42852-7-Part02-271.jpg

读者可以在主数据库中对tpk_user数据表进行增、删、改、查等操作,从数据库(192.168.2.10)中的tpk_user数据表同样也会跟着发生改变。接下来将结合ThinkPHP实现数据的读写分离。

‰ 提示:在5.1.7以前的版本中,从服务器的同步配置是需要在MySQL配置文件中进行配置的。但新版只需要在配置文件中配置server-id和指定需要同步的表及不需要同步的表,然后使用命令执行同步操作即可,这点与老版本区别较大,需要读者注意。

2.实现读写分离

前面只是配置了数据库主从同步功能,主从同步通常用于数据库读写分离。ThinkPHP提供了完善的读写分离功能,开发人员不需要手动切换数据库。什么时候读,什么时候写系统会自动判断。读数据时系统会操作从服务器,而写数据时系统会操作主服务器。最终由数据库实现同步,这就是一个最典型的数据库读写分离,下以将以前面配置好的两台主从数据库为例,详细介绍实现读写分离。

首先打开项目下的数据库配置文件,修改其中的数据库连接参数。要实现多数据库连接,只需要使用“,”分隔多台服务器即可,如以下代码所示。

978-7-111-42852-7-Part02-272.jpg

如上述代码所示,要启用读写分离只需要设置DB_RW_SEPARATE为true即可。然后其他的配置信息和普通的配置信息相差不大。DB_HOST用于配置服务器ip,多个服务器使用“,”隔开,排在第1个位置的表示主服务器(即写入服务器),排在后面的默认都会被分配为从服务器(读服务器);DB_USER用于配置服务登录用户,顺序与DB_HOST相对应,如果分布式数据库所有登录用户都相同,可以只输入一个登录名即可;DB_PWD与DB_HOST配置过程一样,在此不再细述。

配置文件配置好后,现在就可以在动作中测试读写分离了,如以下代码所示。

978-7-111-42852-7-Part02-273.jpg

add动作执行后,读者可以首先查看192.168.2.1主服务器,然后再观察192.168.2.10从服务器,可以看到这两台服务器的数据是同步更新的。通过读写分离,能够有效地提高数据库的负载能力。