mysql复制在业界里有叫:mysql同步,ab复制等。专业名称就是叫:复制。复制是单向的异步复制,从一个Mysql(Master)复制到另外一个Mysql(Slave)。实现整个主从复制,须要由Master服务器上的IO进程,和Salve服务器上的Sql进程和IO进程共同完成。mysql
要实现主从复制,首先必须打开Master端的二进制日志(bin-log)功能,由于整个Mysql复制过程实际上就是Slave从Master端获取相应的二进制日志文件,而后在根据相应的Position号在本身Slave端彻底的执行日志中所记录的各类操做,(二进制日志文件是用sql语句写成的因此能够直接在Slave机上直接执行)。sql
主从复制的基本过程以下:数据库
一、Mysql Slave端的IO进程连接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)以后的日志内容;vim
二、Master接受来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。并将本次请求读取的bin-log文件名及位置一块儿返回给Slave端。安全
三、Slave的IO进程接受到信息后,将接受到的日志内容写入relay-log文件中,并将读取到的Master端的二进制日志文件名后Position号记录在Master-info文件中,下次根据记录的日志文件名和Position号从Master上继续复制。以确保数据的一致性。服务器
四、Slave的Sql进程检测到relay-log中新增长的内容后,会立刻解析relay-log的内容,并在自身执行。多线程
这种传统的复制方法因为在Master端是多线程写入的,而在Slave端是单线程的复制,每每会形成很高的延迟,同时在配置的时候须要找到binlog和pos点,而后change master to指向,不是颇有经验的运维,每每会找错,形成主从同步复制报错。而从Mysql5.6开始支持的gtid模式的主从复制从而很大程度上解决了这些问题。架构
TID:Transaction ID,事务的ID号:也就是说在mysql复制中每个事务都有本身的ID号(随机数)运维
GTID:Global Transaction ID,全局事务ID,在整个事务架构中每个事务ID号是全局惟一的,不止是在一个节点上而是整个主从复制架构中每任何两个事务的ID号都不会相同。是mysql对写入二进制日志的每一个事务所做的标记。由server_uuid和事务id组成。异步
简单来说GTID可以保证让一个从服务器到其余的从服务器那里实现数据复制并且可以实现数据整合的。一个事务对应一个惟一ID,一个GTID在一个服务器上只会执行一次,相对于行复制来说数据安全性更高,故障切换更简单。
GTID也有它的限制,不支持非事务引擎;不支持create table … select 语句复制;不容许在一个SQL同时更新一个事务引擎和非事务引擎的表; 在一个复制组中,必需要求统一开启CTID或是关闭GTID,开启DTID后,就不在使用原来的传统的复制方式,对于createtemporary table 和drop temporary table语句不支持,不支持sqlslaveskip_counter。
Mysql是默认是异步复制、Master在将事件写入binlon时不知道Slave是否已经接受,此时Master宕机的,Slave可能会丢失事务。在这中状况下咱们能够采用半同步复制,即一个线程在Master上提交事务将受到阻塞,直到得知一个已开启半同步复制功能的Slave已收到此事务的全部事件,或等待超时。
如下是mysql主从复制的一些简单配置
传统ab复制(mysql版本为rhel6.5自带的mysql):
在master主机上:
vim /etc/my.cnf server-id=1 log-bin=mysql-bin #启动二进制日志系统 /etc/init.d/mysqld restart cd /var/lib/mysql
能够经过mysqlbinlog指令来插看二进制日志文件
建立同步账户,并给予权限
mysql -p mysql> GRANT REPLICATION SLAVE ON *.* TO example@'172.25.254.3' IDENTIFIED BY 'Westos+123' ;
查看master状态
show master status;
记录File和Position的值,在slave配置时会用到。
在slave主机上
查看可否远程登录master主机的mysql
mysql -h 172.25.254.2 -uexample -pWestos+123
vim /etc/my.cnf server-id=2 #从服务器ID号,不要和主ID相同也不要与其余从服务器相同 /etc/init.d/mysqld restart mysql -p mysql> change master to -> master_host='172.25.254.2', #指定主服务器ip地址 -> master_user='example', #指定在主服务器上能够进行同步的用户名 -> master_password='Westos+123', #同步用户的密码 -> master_log_file='mysql-bin.000003', #上面看到的master的日志文件 -> master_log_pos=1007; #master机的position值 mysql> start slave; #开启同步 mysql> show slave status\G #查看slave状态
看到如下两个yes就表示同步开启成功
Slave_IO_Running: Yes Slave_SQL_Running: Yes
咱们能够经过slave状态中的延迟时间是否为0和pos号是否与master主机一致来查看同步是否完成。
。。。 Seconds_Behind_Master: 0 Exec_Master_Log_Pos: 1007 。。。
Mysql的GTID复制:(mysql为5.7社区版)
在Master主机上:
vim /etc/my.cnf server-id=1 log-bin=mysql-bin gtid-mode=on #开启gtid enforce-gtid-consistency=on #强制GTID的一致性 /etc/init.d/mysqld restart mysql -p mysql> GRANT REPLICATION SLAVE ON *.* TO example@'172.25.254.3' IDENTIFIED BY 'Westos+123' ;
在slave主机上
vim /etc/my.cnf server-id=2 log-slave-updates #更新是否记入日志,当slave主机做为master主机是必需要有 gtid-mode=on enforce-gtid-consistency=on slave-parallel-type=LOGICAL_CLOCK #MySQL 5.6的多线程同步仅在有多个数据库时才有明显的性能提高,MySQL 5.7.2以后,能够经过配置slave-parallel-type为LOGICAL_CLOCK来避开这个限制. slave-parallel-workers=16 #从服务器的SQL线程数,一个数据库同一时间只能有一个worker线程来进行工做。master_info_repository=TABLE #主服信息记录库=表/文件relay_log_info_repository=TABLE #中继日志信息记录库relay_log_recovery=ON #在CRASH后自动放弃全部未执行的relay-log,而且从新从MASTER获取日志;保证relay-log的完整 /etc/init.d/mysqld restart mysql -p mysql> change master to -> master_host='172.25.254.2', -> master_user='example', -> master_password='Westos+123', -> master_auto_position=1; mysql> start slave; mysql> show processlist; #能够看到开启了多个线程
这样简单的配置就完成了,检测的方法就是在Master主机上建立一个数据库看Slave机上是否会同步。