主从配置的前提条件
1、MySQL版本一致;
2、MySQL中的数据一致;

主:192.168.16.135
从:192.168.16.137

在虚拟机中建两台服务器,两个都安装宝塔,将两个服务器的放火墙关闭

systemctl stop firewalld.service

两台虚拟机服务需要相互ping的通

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_服务器


1:配置主服务器mysql

#[必须]启用二进制日志 
log-bin=mysql-bin 
#[必须]服务器唯一ID,默认是1,一般取IP最后一段 
server-id=135

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_thinkphp_02


重启。。进入mysql命令行

##创建帐户'slave'使用 "%" 所有从服务的ip
grant replication slave on *.* to 'slave'@'%' identified by '123456';

##创建帐户'slave'使用从服务的ip
##grant replication slave on *.* to 'slave'@'192.168.16.137' identified by '123456';

查询用户

select user, host, password, from mysql.user;

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_服务器_03


查询master(主服务器)的状态, 需要用到 file position

show master status;

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_thinkphp_04


2、配置slave(从服务器)mysql

#[可选]启用二进制日志 
log-bin=mysql-bin 
#[必须]服务器唯一ID,默认是1,一般取IP最后一段 
server-id=137

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_mysql_05


重启mysql服务…进入mysql命令行

启动从服务器复制功能

change master to master_host='192.168.16.135',master_user='slave',master_password='123456',master_log_file='mysql-bin.000019',master_log_pos=3887;
  • master_host=主服务器IP master_user=在主服务器上创建的备份用户名
  • master_password=备份用户密码
  • master_log_file=查询master(主服务器)的状态得到的File列的值
  • master_log_pos=Position列的值

然后 启动从服务器复制功能

start slave

检查从服务器复制功能状态

show slave status\G

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_mysql_06

##正确 这两个一定要yes
Slave_IO_Running: Yes 
lave_SQL_Running: Yes

Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中 connect 和 NO均属错误)。

到这里就配置完成了,然后在主从服务器创建数据库和表,从服务器的mysql也会有数据库和表。

3:TP6配置分布式数据库

在database.php中:

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_mysql_07


两边的服务mysql用户名密码我都是一样的

如果不一样可以按照这样设置

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_服务器_08


测试:

public function add(){
        $data = [];
        for($i=0;$i<5;$i++){
            array_push($data,['name'=>'name_'.($i+1)]);
        }
        $res = Db::name("student")->insertAll($data);       //主库
        dump('插入成功条数:' . $res);
    }

    public function list(){
        $res = Db::table('student')->where('id','=',1)->find();  //从库
        dump($res);
        $row = Db::table('student')->where('id','=',$res['id'])->update(['name' => 'name_4']);  //主库
        echo $row;

        // 在配置中 开启自动主库读取
        //'read_master' => true,
        //$res2 = Db::table('student')->where('id','=',1)->find(); //主库

        
        $res2 = Db::table('student')->where('id','=',1)->master(true)->find(); //主库
        dump($res2);
    }

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_服务器_09

宝塔 mysql 权限 所有人 远程连接不能用 宝塔 数据库同步_mysql_10


可以看到读写都使用了不同的服务器。

以上就是数据库读写分离、主从同步的框架内文件配置、数据库服务器文件配置和代码示例。