Thinkphp + Mysql 实现读写分离 主从同步
内容清单,thinkphp环境+两个mysql
读写分离,主从同步优势
- 可以实时灾备,用于故障切换;
- 读写分离,提供查询服务,实现负载均衡;
- 数据热备,避免影响业务。
读写分离,主从同步原理
- 主服务器 MySQL 服务将所有的写操作记录在 binlog 日志中,并生成 log dump 线程,将 binlog 日志传给从服务器 MySQL 服 务的 I/O 线程。
- 从服务器 MySQL 服务生成两个线程,一个是 I/O 线程,另一个是 SQL 线程。
- 从库 I/O 线程去请求主库的 binlog 日志,并将 binlog 日志中的文件写入 relaylog(中继日志)中。
- 从库的 SQL 线程会读取 relaylog 中的内容,并解析成具体的操作,来实现主从的操作一致,达到最终两个数据库数据一致的目的。
Thinkphp配置
- 修改config/database.php
// 启用分布式数据库 'deploy' => 1, // 数据库类型 'type' => 'mysql', // 服务器地址 'hostname' => '192.168.1.1,192.168.1.2', // 数据库名 'database' => 'demo1,demo2', // 数据库用户名 'username' => 'root1,root2', // 数据库密码 'password' => 'pass1,pass2', // 数据库连接端口 'hostport' => '3306', //开启读写分离 'rw_separate' => true,
Mysql配置
这里 'deploy' => 1,表示启用分布式数据库 'rw_separate' => true,开启读写分离
demo1,demo2代表你两个数据库名,其他类似。
-
配置mysql主从同步
- 修改mysql配置文件,我用的宝塔安装的在(etc/my.cnf)下
log-bin=mysql-bin
打开server-id = 1
这个表示主库和从库要不一样,随便取值。- 以上操作主库从库都要配置
-
主库配置
- 创建用户,每一个从服务器都需要用到一个账户名和密码来连接主服务器,可以为每一个从服务器都创建一个账户,也可以让全部服务器使用同一个账户。下面就为同一个ip网段的所有从服务器创建一个只能进行主从同步的账户。首先登陆mysql,然后创建一个用户名为master,密码为123456的账户,该账户可以被192.168.1.1使用,且该账户只能进行主从同步
CREATE USER 'master'@'192.168.1.1' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'master'@'1192.168.1.1' IDENTIFIED BY '123456' WITH GRANT OPTION;
-
从库配置
-
在从库服务器Mysql上
CHANGE MASTER TO
MASTER_HOST='192.168.1.1',
MASTER_USER='master',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000097',
MASTER_LOG_POS=1507;
-
查看LOG_FILE和POS在主服务器上mysql输入
show master status\G
即可看到,千万不要直接复制我上面的配置,如果你已经复制并执行了,那你可以stop slave
关闭服务,然后再重新执行新的配置,重启mysql即可。
-