关于laravel8 Mysql主从复制/读写分离的实现过程

845 阅读3分钟

今天给大家带来关于laravel8 Mysql主从复制/读写分离的实现过程 首先我们准备两个库 这里我用的是子系统,所以是做了端口的区别

image.png

我们今天本地的库作为主库,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的时候就是开启成功了

image.png

然后重启mysql服务,重启完成后用show master status 来查看主库的状态,我们主要看的是框里的数据,这两个东西在后面配置从库要用到

image.png

下一步是创建一个用户,来进行同步

如果有数据库工具的话 比如 naviat 可以直接在数据库界面进行操作

image.png 设置好账号密码之后,点击服务器权限

图片.png

图片.png 如果没有工具,那可以用命令来创建用户和授权

# 创建用户名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;

返回结果如下就说明成功了

image.png

接着执行 start slave 开启服务

start slave

返回如下说明成功了

image.png

最后执行show slave status检查一下 slave binlog 功能是否正常开启

show slave status

返回信息中主要看这两个信息,他们必须都是Yes

image.png

现在就可以测试一下了我们现在在主库运行一个sql

image.png

此时从库也已经备份成功

image.png

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_

这就是今天给大家分享的东西啦,有什么错误欢迎留言指正~