thinkphp laravel 主从复制读写分离配置

首先thinkphp 有分布式数据库支持
需要做读写分离,根据官方文档配置数据库即可!
官方文档:
https://www.kancloud.cn/manual/thinkphp/1733

首先我们需要两个mysql服务器,考虑到像小编这样,电脑有不可关闭的防火墙,外网各种端口被限制,空余时间只能在本地玩玩。。。这类型的人还是有很多的!为了大家都能体验,本教程就教大家在本地安装两个mysql服务,模拟不同的mysql服务器

1、小编使用的是phpstudy,进入安装目录,将mysql 复制一份,修改名字为mysql1

这里写图片描述

2、进入 MySQL1 修改my.ini

这里写图片描述
修改port、basedir、datadir 与原来的mysql 区分开来

3、 win + R 输入cmd 进入mysql1的bin目录

这里写图片描述

4、输入 mysqld install mysql1
–defaults-file=”D:\phpStudy\PHPTutorial\MySQL1\my.ini” 执行安装mysql1 服务
5、 win + R 输入services.msc 打开 window服务 找到mysql1 并启动

这里写图片描述

mysql服务器准备完毕!
现在配置thinkphp 的配置文件
//分布式数据库配置定义
    'DB_DEPLOY_TYPE'=> 1, // 设置分布式数据库支持
    'DB_RW_SEPARATE'=>true,//配置读写分离
    'DB_TYPE' => 'mysql', // 数据库类型
    'DB_HOST' => '127.0.0.1,127.0.0.1', // 服务器地址 这个需要注意,根据官方文档相同的写一次就行,但是服务器地址相同也不能只写一个,否则操作的都是第一个服务器
    'DB_NAME' => 'dt', // 数据库名
    'DB_USER' => 'root', // 用户名
    'DB_PWD' => 'cm9vdA==', // 密码
    'DB_PORT' => '3306,3307', // 端口
    'DB_CHARSET' => 'utf8',
    'DB_PREFIX'  => 'dt_',    // 数据库表前缀

在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,如果设置了DB_MASTER_NUM参数,则可以支持多个主服务器写入。其它的都是从数据库的配置信息,负责读取数据,数量不限制。每次连接从服务器并且进行读取操作的时候,系统会随机进行在从服务器中选择。

还可以设置DB_SLAVE_NO 指定某个服务器进行读操作。

'DB_MASTER_NUM'         =>  1, // 读写分离后 主服务器数量
'DB_SLAVE_NO'           =>  '', // 指定从服务器序号

服务器配置完毕,在进行数据库操作时,框架会为我们选择数据库!
可以自行进行数据库操作与查询测试下是否读写分离了!
开始测试!
先看下原始数据
这里写图片描述
我们先写一个数据
这里写图片描述
打印一下结果
这里写图片描述
在主服务器查询下结果
这里写图片描述
是的,已经成功了!已经读写分离了
问题来了!读写分离完成了,那自从复制在哪里配置呢?
框架也没有说明!
因为这个配置是要在你的数据库自行配置的!
小编找了一个配置主从复制的案例:
https://blog.csdn.net/lamp_yang_3533/article/details/52264784
好的!跟着步骤来一遍!

数据库服务器的参数:
主服务器(master): IP为127.0.0.1,端口为3306
从服务器(slave): IP为127.0.0.1,端口为3307
这里写图片描述
主服务器配置:
这里写图片描述
从服务器配置:
这里写图片描述
根据教程,小编配置返回的结果并不如意!
如果 Slave_IO_Running 和 Slave_SQL_Running 的值都为 Yes,则说明主从复制的所有配置已成功,即从服务器已经可以自动与主服务器的数据库数据实现同步了。
但是小编的 Slave_IO_Running 为 NO
然后小编找了解决这个问题的方法:https://www.jb51.net/article/27220.htm
小编在D:\phpStudy\PHPTutorial\MySQL1\data\v_jingzhili-PC1.err 找到了错误信息 ,错误信息如下:

180823 15:35:53 [Warning] Neither --relay-log nor --relay-log-index were used; so replication may break when this MySQL server acts as a slave and has his hostname changed!! Please use '--relay-log=v_jingzhili-PC1-relay-bin' to avoid this problem.
180823 15:35:53 [Note] 'CHANGE MASTER TO executed'. Previous state master_host='', master_port='3306', master_log_file='', master_log_pos='4'. New state master_host='127.0.0.1', master_port='3306', master_log_file='mysql-bin.000008', master_log_pos='498'.
180823 15:36:46 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000008' at position 498, relay log '.\v_jingzhili-PC1-relay-bin.000001' position: 4
180823 15:36:46 [Note] Slave I/O thread: connected to master 'user01@127.0.0.1:3306',replication started in log 'mysql-bin.000008' at position 498
180823 15:36:46 [ERROR] Error reading packet from server: Could not find first log file name in binary log index file ( server_errno=1236)
180823 15:36:46 [ERROR] Slave I/O: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: 1236
180823 15:36:46 [Note] Slave I/O thread exiting, read up to log 'mysql-bin.000008', position 498

根据介绍小编的报错原因是因为
服务器读mysql-bin.000008这个Log的498这个位置时发生错误,这个位置不存在,于是无法同步。
之所以错误,原来是小编忽略了这一步
这里写图片描述
小编的是mysql-bin.000001,373
却直接执行了教程的 master_log_file=’mysql-bin.000008’,master_log_pos=498;

好的知道原因那就重新执行一次

SLAVE STOP; 
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=373; 
SLAVE START; 

这里写图片描述
成功了!
开始测试!
这里写图片描述
哈哈!数据进来了!
到mysql看下主数据库数据表
这里写图片描述
从服务器
这里写图片描述
哈哈!成功了!
然后小编根据laravel的官方文档,也配置了下laravel的读写分离,也是成功的!
赶紧也是体验一次!开心一下吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值