多站点为了保证服务器的效率,数据库读写分离是有必要的。百度了很多,总结记录一下。

不啰嗦,上代码。MySQL 5.7+版本:

TP 配置主从数据库


return [
    // 数据库类型
    'type'            => 'mysql',
    // 服务器地址
    'hostname'        => ['192.168.61.129','192.168.40.219'],
    // 数据库名
    'database'        => 'fastadmin',
    // 用户名
    'username'        => 'root,root',
    // 密码
    'password'        => ['Mc4GdBkM6PhC','Mc4GdBPhCS5nZ'],
    // 端口
    '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';

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=fastadmin
binlog-do-db=db1
binlog-do-db=db2
expire_logs_days=1 #自动清理1天前的log文件

3、在从数据库的/etc/my.cnf文件中加入如下配置:

[mysqld]
rpl_semi_sync_slave_enabled=1
server-id=2 #服务器id
#要从主机同步的库
binlog-do-db=fastadmin
binlog-do-db=db1
binlog-do-db=db2

4、修改之后,重启MySQL主数据库和MySQL从数据库的服务

service mysqld restart

5、配置主服务器的主数据库

GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.61.129' IDENTIFIED BY 'pwd'; #主数据库授权同步账户
FLUSH PRIVILEGES; #刷新权限
SHOW MASTER STATUS; #查看主服务状态
 
 
注:SLAVE          => 给从库起个别名
   MASTER         => 主库别名
   192.168.20.129 => 从库ip
   root           => 从库数据库账号
   pwd            => 从库密码

1650783122(1).jpg

6、配置从服务器的从数据库

配置和改变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状态

1650783389(1).jpg

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

上图,我的Slave_IO_Running=Connecting,解决办法:

mysql>stop slave;#先停止复制线程
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> slave start;#再开启复制

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

image.png

Slave_IO_Running还是Connecting,错误提示:Last_IO_Error:Master command COM_REGISTER_SLAVE failed: Access denied for user

登陆主服务器,查询复制用户的权限:

1650783837(1).jpg

USAGE:链接登录权限,明显权限不对,修改权限如下:

1650783912(1).jpg

当权限显示为REPLICATION SLAVE是方才正确。此时,登陆从服务器再次执行start slave命令即可。

image.png

双yes,成功。

点赞(2) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿
立即
联系

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部