ThinkPHP实现MySQL读写分离
ThinkPHP提供了完善的读写分离功能,不需要手动切换数据库。什么时候读,什么时候写系统会自动判断。读数据时系统会操作从服务器,而写数据时系统会操作主服务器。最终由数据库实现同步,这就是一个最典型的数据库读写分离,下以将配置好的两台主从数据库为例,详细介绍实现读写分离。
首先打开项目下的数据库配置文件,修改其中的数据库连接参数。要实现多数据库连接,只需要使用”,”分隔多台服务器即可,如以下代码所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?php return array( //'配置项'=>'配置值' 'URL_CASE INSENSITIVE' =>true, "DB_DEPLOY_TYPE"=>1, //是否启用分布式 'DB_RW_SEPARATE'=>true, //是否启用智能读写分离 'DB_TYPE' => 'mysql', //数据库类型 'DB_HOST' => '192.168.2.1,192.168.2.10', //服务器地址 'DB_NAME' => 'tp', //数据库名 'DB_USER' => 'root,root', //用户名 'DB_PWD' => 'root , root', //密码 'DB_PREFIX' => 'tpk_', //数据库表前缀 "project_name"=>"项目名称", 'TMPL_L_DELIM' => '<!--{', 'TMPL_R_DELIM' => '}-->', 'LAYOUT_ON'=>true, ); ?> |
注意事项:
1、当采用原生态的sql语句进行写入操作的时候,要用execute,读操作要用query。
2、MySQL数据主从同步还是要靠MySQL的机制来实现,所以这个时候MySQL主从同步的延迟问题是需要优化,延迟时间太长不仅影响业务,还影响用户体验。
下面是MySQL主从数据库配置:
环境:
A: 192.168.1.1 作为master,没有数据
B: 192.168.1.2 作为slave,没有数据
一:主服务器上:
注意:mysql参数
binlog-do-db = 数据库名 (你要备份的数据库)
binlog-ignore-db = 数据库名 (你不需要备份的数据库)
如果没有在/etc/my.cnf添加以上2个参数,那就是说明备份所有数据库
(1) 确保/etc/my.cnf 中有如下参数,一般情况下都是都有的,但是以确保实验的成功率还是检查一下比较好。假如没有如下参数,自己手动添加,并重启mysql服务器
[mysqld]
log-bin=mysql-bin (启动二进制文件)
server-id=1 (服务器ID)
( 2 ) :登录mysql服务器,添加一个叫做beifen的用户,并授权给从服务器
[root@localhost ~]# mysql -uroot –p123456 登录mysql
这里需要指明一下啊 这个123456是我的mysql的密码
mysql> grant replication slave on *.* to ‘beifen’@’192.168.1.2′ identified by ’123′; 创建 beifen用户,密码设置为123 并授权给192.168.1.2使用。
( 3 )查询主数据库的状态,并记下File和Position的值,这个在配置从数据库的时候用的到
二:从服务器上
(1) 修改配置文件/etc/my.cnf 将service-id=1修改为server-id=2
(2) 并重启mysql服务器
[root@localhost ~]# mysqladmin -p123456 shutdown
[root@localhost ~]# mysqld_safe –user=mysql &
(3)登录mysql服务器
[root@localhost ~]# mysql -uroot –p123456
mysql>change master to master_host=’192.168.1.1′,master_user=’beifen’,master_password=’123′,master_log_file=’mysql-bin.000010′,master_log_pos=257;
( 4 ) 启动slave同步
mysql > start slave;
(5) 检查主从同步,如果您看到Slave_IO_Running和Slave_SQL_Running均为Yes,则主从复制连接正常。
mysql > show slave status\G
如下图:
OK! 主从复制完成,现在可以去验证了
验证方法:去主服务器上新建一个数据库,然后登录从服务器看看刚才在主服务器新建的数据库在不在
注意:如果master服务器上做主从之前已经有数据了,我们就必须要把数据库导出来 然后导入从数据库 。
- PHP操作Mysql数据库读写分离的例子
- MySQL如何让一个存储过程定时执行(转)