MySQL读写分离案例实现:
搭建M-S复制
主从复制的原理:主服务器开启bin-log(记录了写操作),从服务器获取到主服务器的bin-log,记录到relay-log中。从服务器在通过异步的线程方式,对于relay-log进行重放操作。
服务器名称 | IP地址 |
server02 | 192.168.17.108 |
server06 | 192.168.17.112 |
1、master配置:
1)在master服务器授权,slave服务器replication slave权限。
slave是通过MySQL连接登录到master上来读取二进制日志的,因此要在master给slave配置权限:
- grant replication slave on *.* to 'slave'@'192.168.17.112' identified by '123456';
- flush privileges;
然后在另外slave服务器上进行下登录测试:
这个slave是到master服务器上读日志文件的,所以它的权限是有限的。
2)master服务器上打开bin-log日志,并标识server-id:
server-id=1,不是图中的下划线。
log_bin: 以主机名命名。
然后是重启mysql使配置生效。
systemctl restart mysql
检查生成的日志文件:
制作一个完整的备份:
如果确认主从的数据库,默认开始数据是一致的,可以不做备份。
mysqldump -uroot -p'123456' --all-databases > /root/mysql.sql
查看master上的bin-log及其position位置:
show master status;
查看并记录File的值,Position的值。之后需要在服务器上,指向这些信息。
slave配置:
恢复备份文件:
如果slave和master的数据本身就是相同的,可以不选择备份和导入。
配置server-id,标识服务器:
vim /etc/my.cnf
由于是克隆获取的MySQL实例,所以auto.conf里面记录的UUID一样,需要删除/usr/local/mysql/data/auto.conf文件,否则主从无法识别互相身份,重新自动生成新的即可。
我这边还需要了一个问题,就是mysql启动不成功,然后我把虚拟机重新进行了启动,把mysql的问题解决了。这个问题得到了解决。
配置slave replication:
help change master to
参数说明
master_host 主master的IP
master_user 主master允许登录,拥有replication slave权限
master_password 用户的密码
需要通过mysql > show master status; 在master执行
master_log_file 主master记录的bin-log日志文件名称
master_log_pos 主master记录的bin-log日志文件对应的位置
然后再检查下show slave status\G;
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 192.168.17.108
- Master_User: slave
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-index.000003
- Read_Master_Log_Pos: 120
- Relay_Log_File: server06-relay-bin.000002
- Relay_Log_Pos: 285
- Relay_Master_Log_File: mysql-index.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Replicate_Do_DB:
- Replicate_Ignore_DB:
- Replicate_Do_Table:
- Replicate_Ignore_Table:
- Replicate_Wild_Do_Table:
- Replicate_Wild_Ignore_Table:
- Last_Errno: 0
- Last_Error:
- Skip_Counter: 0
- Exec_Master_Log_Pos: 120
- Relay_Log_Space: 461
- Until_Condition: None
- Until_Log_File:
- Until_Log_Pos: 0
- Master_SSL_Allowed: No
- Master_SSL_CA_File:
- Master_SSL_CA_Path:
- Master_SSL_Cert:
- Master_SSL_Cipher:
- Master_SSL_Key:
- Seconds_Behind_Master: 0
- Master_SSL_Verify_Server_Cert: No
- Last_IO_Errno: 0
- Last_IO_Error:
- Last_SQL_Errno: 0
- Last_SQL_Error:
- Replicate_Ignore_Server_Ids:
- Master_Server_Id: 1
- Master_UUID: e7e1e13c-48c0-11ee-97ef-000c2961eeaf
- Master_Info_File: /usr/local/mysql/data/master.info
- SQL_Delay: 0
- SQL_Remaining_Delay: NULL
- Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
- Master_Retry_Count: 86400
- Master_Bind:
- Last_IO_Error_Timestamp:
- Last_SQL_Error_Timestamp:
- Master_SSL_Crl:
- Master_SSL_Crlpath:
- Retrieved_Gtid_Set:
- Executed_Gtid_Set:
- Auto_Position: 0
- 1 row in set (0.00 sec)
-
- ERROR:
- No query specified
-
- mysql>
查看到两个yes,主从复制成功。否则,查看显示最下面信息,通过error信息进行排查问题。
那么现在做一个测试:
1)在master上建一个库,进行测试:
slave上已经看到有testslave这个数据库了。
然后再看查看相关信息,可以看到日志也发生了一些变化:
两个线程遇到的问题:
IO error:正常是查找不到文件。
SQL error: 一般是重放的时候出问题。