ThinkPHP5主从读写分离+MySQL底层配置半自动复制同步
·
多站点为了保证服务器的效率,数据库读写分离是有必要的。百度了很多,全都是说不到重点COPY来COPY去的。
不啰嗦,上代码。MySQL 5.7+版本:
TP 配置主从数据库
return [
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => ['192.168.61.128','192.168.40.214'],
// 数据库名
'database' => 'fbs',
// 用户名
'username' => 'root,root',
// 密码
'password' => ['9945wk','9945wk'],
// 端口
'hostport' => '',
// 连接dsn
'dsn' => '',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => '',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 1,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 自动读取主库数据
'read_master' => false,
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'sql_explain' => false,
// Builder类
'builder' => '',
// Query类
'query' => '\\think\\db\\Query',
// 是否需要断线重连
'break_reconnect' => false,
// 断线标识字符串
'break_match_str' => [],
];
这样,TP框架的工作就完成了,这里经常有人就会问,“为什么我现在主从数据库里面的数据不同步啊?”这里是对配置的一个误解,主从服务器之间的数据同步是由MySQL自己通过自己的机制完成的。显然我们的工作还没完成,继续配置mysql服务。
配置如下
1、 主从的各个节点都要安装半自动复制插件,方法是登陆MySQL执行一下脚本:mysql -uroot -p
主库:
install plugin rpl_semi_sync_master soname 'semisync_master.so';
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
在主从数据库的/etc/my.cnf文件中加入如下配置:
主数据库
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 #此单位是毫秒
log-bin=mysql-bin #打开日志(主机需要打开)
server-id=1 #服务器id
#给从机同步的库,可以多个
binlog-do-db=fbs
binlog-do-db=db2
binlog-do-db=test
expire_logs_days=1 #自动清理1天前的log文件
从数据库
[mysqld]
rpl_semi_sync_slave_enabled=1
server-id=2 #服务器id
#要从主机同步的库
replicate-do-db=fbs
replicate-do-db=db2
replicate-do-db=test
3、修改之后,重启MySQL主数据库和MySQL从数据库的服务
service mysqld restart
4、配置主服务器的主数据库
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.20.129' IDENTIFIED BY 'pwd'; #主数据库授权同步账户
FLUSH PRIVILEGES; #刷新权限
SHOW MASTER STATUS; #查看主服务状态
注:SLAVE => 给从库起个别名
MASTER => 主库别名
192.168.20.129 => 从库ip
root => 从库数据库账号
pwd => 从库密码

5、配置从服务器的从数据库
{配置和改变slave服务器用于连接master服务器的参数【注意,MASTER_LOG_FILE=‘mysql-bin.000001’,MASTER_LOG_POS=601是通过前面的主数据库SHOW MASTER STATUS;得到】}
CHANGE MASTER TO MASTER_HOST='192.168.20.128',MASTER_USER='root', MASTER_PASSWORD='pwd',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=601;
注:
MASTER =>主库别名
MASTER_HOST =>主库host
192.168.20.128 =>主库ip
root => 主库数据库账号
pwd =>主库密码
MASTER_LOG_FILE => 主日志文件(mysql-bin.000001跟主库查询到的文件名一致)
MASTER_LOG_POS => 主日志位置 (查询到的主库一致 例子:601)
start slave; #开启SLAVE同步
show slave status \G; #查看下slave状态

当Slave_IO_Running和Slave_SQL_Running都为Yes,说明主从复制配置成功,如果有必要停止或者撤销
同步账号的权限,还可操作。
如图中我的io连接未成功,所有继续调试(注:此处可能是数据库uuid重复,因为我是复制的镜像导致的)
stop slave; #停止slave同步
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.20.129' IDENTIFIED BY 'XXXXXX';# 撤销已经赋予给MySQL同步账户的权限
REVOKE REPLICATION SLAVE ON *.* FROM 'root'@'192.168.20.129';#revoke 跟 grant 的语法差不多,只需要把关键字 “to”
出现一些错误:Slave_SQL_Running: No
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.8.201
Master_User: xiaokai
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 5383
Relay_Log_File: xiaokai-PC-relay-bin.000002
Relay_Log_Pos: 1028
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
解决办法:
mysql>stop slave;#先停止复制线程
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;#再开启复制
问题解决。
更多推荐
所有评论(0)