MySQL主从同步,及配置(Centos版本)
1.简介
Linux下MySQL数据库的主从同步用来实现读写分离。主数据库进行数据的插入,删除与更新;从数据库专门用来查询操作,缓解数据库的压力。让运行海量数据的时候无论是从速度还是效率上都大大提高,Mysql的主从复制至少是需要两个Mysql的服务,当然Mysql的服务是可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
2.主从同步原理
Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
Mysql主从同步,通常采用异步复制,从master复制到slave,由三个线程来完成。其中sql线程和IO线程在slave端,另一个IO线程在master端,要实现MySQL的replication首先需要打开master端的二进制log功能:
(1) master 将操作记录到二进制日志(binary log)中;
(2) master有一个I/O线程将二进制日志发送到slave;
(3) slave IO 线程 将master的binary log events读写到它的中继日志(relay log);
(4) slave SQL进程读取中继日志,将重做记录数据到数据库中。
结构图
3. 配置主从同步的基本步骤
有很多种配置主从同步的方法,可以总结为如下的步骤:
- 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
- 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
- 在开始复制进程前,在主服务器上记录二进制文件的位置信息
- 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
- 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
4.主从数据库配置
1.操作步骤
1)开启master的二进制日志
2)开启slave的二进制日志
3)将slave指向master
4)开始复制
2.开启master二进制日志
1)编辑mysql配置文件
1 [[email protected]_0_10_centos ~]# vi /etc/my.cnf
2)添加二进制日志配置,开启二进制(mysql-bin只是二进制日志名称,可以自行指定)
1 server-id=1 #id是一定要指定的,是唯一的标识(master数据库要比slave数据库的id优先级高才行) 2 log-bin=mysql-bin #开启二进制日志
3)授权
登录数据库
需要给slave数据库配置一个用户/密码的权限
1 mysql> grant replication slave on *.* to 'root'@'slave数据库ip' identified by '密码';
允许某个ip地址的某个用户以某个密码对当前数据库的所有库和表进行复制操作
配置之后需要刷新权限
1 mysql> flush privileges;
上面修改配置文件需重启服务
1 [[email protected]_0_10_centos ~]# service mysqld restart
4)查看master的状态
登录数据库
1 mysql> show master status;
file:是日志文件名称
position:日志所在位置
3.开启slave的二进制日志
登录slave服务器
1)配置my.cnf配置文件
1 [[email protected]_0_16_centos ~]# vi /etc/my.cnf
2)添加slave二进制日志配置,开启二进制(mysql-bin只是二进制日志名称,可以自行指定)
1 server-id=2 2 log-bin=mysql-bin
注意:每一台指定唯一的一个server-id标识
修改完配置服务需重启服务
1 [[email protected]_0_16_centos ~]# service mysqld restart
3)配置slave指向master
登录数据库
1 mysql> change master to 2 -> master_host='master数据库ip', 3 -> master_user='master授权账号', 4 -> master_password='授权密码', 5 -> master_log_file='master日志文件(mysql-bin.000001)', 6 -> master_log_pos=master日志所在位置(154);
master的日志文件名称可以在master数据库使用show master status;查看到
4.开启主从复制
在slave服务器上执行
1 mysql> start slave;
查看slave运行状态
1 mysql> show slave status\G;
可看到如下内容
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 106.53.73.200 Master_User: root Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 154 Relay_Log_File: VM_0_16_centos-relay-bin.000002 Relay_Log_Pos: 320 Relay_Master_Log_File: mysql-bin.000001 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: 154 Relay_Log_Space: 536 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: f8100725-c3e5-11e9-ae45-525400da2f1f Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates 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 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: 1 row in set (0.00 sec) ERROR: No query specified
能查看到这两个为yes则成功
1 Slave_IO_Running: Yes #表示slave的日志读取线程开启 2 Slave_SQL_Running: Yes #表示SQL执行线程开启