标签:mysql
mysql复制在业界里有叫:mysql同步,ab复制等。专业名称就是叫:复制。复制是单向的异步复制,从一个Mysql(Master)复制到另一个Mysql(Slave)。实现整个主从复制,需要由Master服务器上的IO进程,和Salve服务器上的Sql进程和IO进程共同完成。
要实现主从复制,首先必须打开Master端的二进制日志(bin-log)功能,因为整个Mysql复制过程实际上就是Slave从Master端获取相应的二进制日志文件,然后在根据相应的Position号在自己Slave端完全的执行日志中所记录的各种操作,(二进制日志文件是用sql语句写成的所以可以直接在Slave机上直接执行)。
主从复制的基本过程如下:
1、Mysql Slave端的IO进程链接上Master,向Master请求指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
2、Master接受来自Slave的IO进程的请求后,负责复制的IO进程根据Slave的请求信息,读取相应日志内容,返回给Slave 的IO进程。并将本次请求读取的bin-log文件名及位置一起返回给Slave端。
3、Slave的IO进程接受到信息后,将接受到的日志内容写入relay-log文件中,并将读取到的Master端的二进制日志文件名后Position号记录在Master-info文件中,下次根据记录的日志文件名和Position号从Master上继续复制。以确保数据的一致性。
4、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机上是否会同步。
标签:mysql
原文地址:http://bantiaomichong.blog.51cto.com/11702501/1793446