今天给大家带来关于laravel8 Mysql主从复制/读写分离的实现过程 首先我们准备两个库 这里我用的是子系统,所以是做了端口的区别
我们今天本地的库作为主库,linux系统的库作为从库
首先修改主库的配置
# 这里是默认的serverid,再主从复制中,这个id是唯一的
server_id=1
# 配置要跟Slave同步的数据库
binlog-do-db=gin
# 启用二进制日志
log-bin=master-bin
不用给Slave同步的数据库,Mysql自带的数据库就不用给Slave同步了
binlog-ignore-db=information_schema
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
清理30天以前记录
`expire_logs_days=30``
这几个配置要放在[mysqld]中
这个时候我们可以选择用 show variables like '%log_bin%';来查看一下binlog是否启用 log_bin 返回 ON的时候就是开启成功了
然后重启mysql服务,重启完成后用show master status 来查看主库的状态,我们主要看的是框里的数据,这两个东西在后面配置从库要用到
下一步是创建一个用户,来进行同步
如果有数据库工具的话 比如 naviat 可以直接在数据库界面进行操作
设置好账号密码之后,点击服务器权限
如果没有工具,那可以用命令来创建用户和授权
# 创建用户名backup 密码backup
create user '用户名'@'%' IDENTIFIED BY '密码';
# 分配权限
grant file on *.* to 'backup'@'%';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* to 'backup'@'%';
# 刷新权限
flush privileges;
到这里,主库就配置完成了,接下来就可以去配置从库
从库配置
同样在[mysqld]中配置
# 这里的server_id同样是唯一的
server-id = 2
# 加上以下参数可以避免更新不及时,SLAVE 重启后导致的主从复制出错。
read_only = 1
master_info_repository=TABLE
relay_log_info_repository=TABLE
配置好后重启服务器,开始进行最后一步
在命令行中输入 stop slave 来关闭slave服务
stop slave
然后如果主服务器的mysql有重启操作,则在主服务器重新获取show master status 然后执行CHANGE MASTER TO 配置主服务器。
# master_host 主服务器IP
CHANGE MASTER TO master_host = '***.***.***.9',
# 主服务器端口号
master_port = 3307,
# 刚刚创建的用户名
master_user = 'user',
# 刚刚创建的密码
master_password = 'password',
# show master status 获取到的 File
master_log_file = 'binlog.000006',
# show master status 获取到的 Position
master_log_pos = 154;
返回结果如下就说明成功了
接着执行 start slave 开启服务
start slave
返回如下说明成功了
最后执行show slave status检查一下 slave binlog 功能是否正常开启
show slave status
返回信息中主要看这两个信息,他们必须都是Yes
现在就可以测试一下了我们现在在主库运行一个sql
此时从库也已经备份成功
laravel8 设置读写分离
首先来到config/database.php找到connections 中的mysql
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
读写分离就是要从这里来进行配置,修改后:
'mysql' => [
'read' => [
[
'host' => '***.**.***.**',
'username' => env('DB_READ1_USERNAME', 'gin'),
'password' => env('DB_READ1_PASSWORD', ''),
'port' => env('DB_READ1_PORT', '3306')
],//从库1
// ['host' => '***.***.*.**','password' => env('DB_READ2_PASSWORD', '')],//从库2
],
'write' => [
'host' => '127.0.0.1',//主库
'username' => env('DB_WRITE_USERNAME', 'root'),
'password' => env('DB_WRITE_PASSWORD', ''),
'port' => env('DB_WRITE_PORT', '3307')
],
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'database' => env('DB_DATABASE', 'gin'),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
这里是读取的env配置,所以此时我们也要在env进行配置
DB_CONNECTION=mysql
# 数据库名称
DB_DATABASE=gin
# 主库
DB_HOST=127.0.0.1
DB_WRITE_PORT=3307
DB_WRITE_USERNAME=root
DB_WRITE_PASSWORD=root
# 从库1
DB_READ1_PORT=3306
DB_READ1_USERNAME=gin
DB_READ1_PASSWORD=rCCrNPsydsh8An3y
DB_PREFIX=lq_
这就是今天给大家分享的东西啦,有什么错误欢迎留言指正~