ThinkPHP主从读写分离+MySQL底层配置半自动复制同步

多站点为了保证服务器的效率,数据库读写分离是有必要的。百度了很多,全都是说不到重点COPY来COPY去的。 
不啰嗦,上代码。MySQL 5.7+版本:

TP 配置主从数据库

return [
    //数据库连接配置
    'DB_DEPLOY_TYPE'        =>  1, //是否启用分布式
    'DB_RW_SEPARATE'        =>  true, //是否启用智能读写分离
    'DB_TYPE'               =>  'mysql',     // 数据库类型
    'DB_HOST'               =>  '192.168.20.128,192.168.20.129', // 服务器地址
    'DB_NAME'               =>  'master,slave',         // 数据库名
    'DB_USER'               =>  'master,slave',     // 用户名
    'DB_PWD'                =>  'master,slave',   // 密码
    'DB_PORT'               =>  '3306',        // 端口
    'DB_PREFIX'             =>  'abc_',//表名前缀
    'DB_PARAMS'             =>  array(), // 数据库连接参数
    'DB_DEBUG'              =>  TRUE, // 数据库调试模式 开启后可以记录SQL日志
    'DB_FIELDS_CACHE'       =>  true,// 启用字段缓存
    'DB_CHARSET'            =>  'utf8',// 数据库编码默认采用utf8
];

 

这样,TP框架的工作就完成了,这里经常有人就会问,“为什么我现在主从数据库里面的数据不同步啊?”这里是对配置的一个误解,主从服务器之间的数据同步是由MySQL自己通过自己的机制完成的。显然我们的工作还没完成,继续。

配置如下

1、 主从的各个节点都要安装半自动复制插件,方法是登陆MySQL执行一下脚本:

主库:

install plugin rpl_semi_sync_master soname 'semisync_master.so';

从库:

INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';

2、在主从数据库的/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=db1
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=db1
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 'XXXXXX'; #主数据库授权同步账户
FLUSH PRIVILEGES; #刷新权限
SHOW MASTER STATUS; #查看主服务状态

ThinkPHP主从读写分离+MySQL底层配置半自动复制同步_第1张图片

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='XXXXXX',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=601;

start slave; #开启SLAVE同步

show slave status \G; #查看下slave状态

ThinkPHP主从读写分离+MySQL底层配置半自动复制同步_第2张图片

当Slave_IO_Running和Slave_SQL_Running都为Yes,说明主从复制配置成功,如果有必要停止或者撤销 
同步账号的权限,还可操作。

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” 换成 “from” 即可:

你可能感兴趣的:(数据库技术)