- 什么是主从复制:
通过将Mysql的某一台主机的 数据复制到其它主机,复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slave)。进行复制时,所有对数据表的写操作必须在主服务器上进行。否则,因为主服务器不会同步从服务器的数据,会导致主从数据不一致的问题。mysql的主从复制功能是构建高性能大型应用服务器的基础
- 主从复制的作用:
1.辅助实现数据的备份
2.实现数据服务的高可用和异地容灾
3.实现多个服务器分摊负载
- 主从复制的实现原理:
实现整个复制过程主要由三个线程来完成,其中slave端两个线程(Sql线程和IO线程) ,master端一个线程(IO线程)
1.master将数据库改变的记录到二进制日志(binary log)中
2.slave的IO线程向master请求二进制日志中的事件
3.master服务器的IO线程将slave服务器的IO线程请求的数据相应给对方
4.slave的IO线程接收到数据并依次写入到中继日志里面
5.slave的SQL线程检测到中继日志发生改变,解析出master发生改变执行的sql语句并在自身执行一遍
- 主从复制类别:
1.基于语句的复制:每一条会修改数据的语句都会记录到master的二进制中。slave在复制的时候SQL线程会解析成和原来master端执行过的相同的语句来再次执行
优点:不需要记录每一行数据的变化,减少二进制日志量,节约了IO成本,提高了性能。
缺点:由于他是记录的执行语句,所以,为了让这些语句在slave端也能正确执行,那么他还必须记录每条语句在执行的时候的一些相关信息,也就是上下文信息,以保证所有语句在slave端杯执行的时候能够得到和在master端执行时候相同的结果。当master的某个SQL语句中执行了一些特殊函数,再复制到slave来执行可能会导致值不一样。例如:master表中的某个字段了插入一条select now();的执行结果,当这条语句再复制到slave上去执行的时候,结果数据就无法被正确复制。
2.基于行的复制:二进制日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。
优点:二进制日志中可以不记录执行的sql语句的上下文相关的信息,仅仅只需要记录那一条记录被修改了,修改成什么样了。所以RowLevel的日志内容会非常清楚的记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程,或函数,以及触发器的调用和触发无法被正确复制的问题
缺点:所有的执行的语句当记录到BinaryLog中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如有这样一条update语句:update user_info set sal=15000 where user_id >= 3,执行之后,日志中记录的不是这条update语句所对应的事件(MySQL以事件的形式来记录BinaryLog日志),而是这条语句所更新的每一条记录的变化情况,这样就记录成很多条记录被更新的很多个事件,增加了IO负担。
3.混合方式:基于语句+基于行的混合方式 中和了前两种方式的优缺点,是一种相对比较理想的复制方式
mysql的这个复制级别也就是通过配置二进制日志的记录格式来决定的。
- mysql主从复制配置:
环境说明:
master和slave数据初始都是没有数据的
master:
操作系统:centos6.7
mysql版本:mysql5.7.10
主机地址:192.168.1.223
slave:
操作系统:centos6.7
mysql版本:mysql5.7.10
主机地址:192.168.1.222
1.master端配置工作
启动二进制日志
选择一个唯一的server-id
vi /etc/my.cnf log-bin=/mydata/binlogs/master-bin binlog_format=mixed server-id = 2
重启mysql服务
service mysqld restart
登录mysql创建具有复制权限的用户
mysql -uroot -p ‘password’ grant replication slave on *.* to [email protected]‘192.168.1.222‘ identified by ‘password‘; flush privileges;
2.slave端配置工作
修改server-id
启用中继日志
vi /etc/my.cnf server-id = 11 relay-log = /mydata/relaylogs/relay-bin log-bin=OFF
重启mysql服务
service mysqld restart
登录mysql连接主服务器
mysql -uroot -p ‘password’ change master to master_host=‘192.168.1.223‘,master_user=‘repuser‘,master_password=‘password‘
查看slave工作状态
show slave status \G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.223
Master_User: repuser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No #现在io线程处于关闭状态
Slave_SQL_Running: No #sql线程也处于关闭状态
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: 0
Relay_Log_Space: 154
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: NULL
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: 0
Master_UUID:
Master_Info_File: /mydata/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State:
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:
启动复制:
start slave;
6.验证主从配置结果:
登录主服务器创建一个数据库
mysql -uroot -p‘password‘ create database two_db; show databases;
登录slave服务器查看是否已同步
至此mysql简单主从复制基本完成