###########################################################
什么是主从复制
什么是主主复制
主从复制的实现
###########################################################
 
MySQL复制分为主从复制,主主复制。
什么是主从复制
主从复制指有一台器做为主服务器,一台或多台服务器做为从服务器。从服务器不写入任何数据,数据的来源是主服务器。复制的目的是为了数据同步,如果从服务器也写入数据的话,在主从架构里,主服务器是不会复制从服务器的数据的,所以会造成数据的不同步,所以,从服务器不能写入数据。MySQL复制的基础,就是二进制日志,因为二进志日志里面,记录了所有能改变或者能潜在改变数据库数据的SQL语句,当从服务器把这些SQL语句复制过来之后,再执行一遍,数据就会跟主服务器相同了。所以,从服务器的MySQL版本,一定要比主服务器高或才跟主服务器相同,最好是主从版本一样,这样就不会因为不同版本,SQL语句不同,而造成错误。
什么是主主复制
主主复制是指,两台或多台MySQL服务器,都为主服务器,大家相互复制,这样的好处是,每台服务器,都可以进行数据的写入操作,而主从里面,从服务器是不能进行写操作的。主主复制的原理,跟主从复制差不多,只不过是数据之间,是相互复制,相互同步的。
不管是主从复制,还是主主复制,其复制过程,都是异步的。可以加快数据的查询,而对数据的写入,没有任何提高。做主从或者主主复制,也可以实现对数据的冗余,当从服务器DOWN机的时候,主服务器可以正常工作而不受任何影响。当主服务器DOWN机的时候,只需要将从服务器暂时切换为主服务器即可。也方便数据的备份,备份的时候,可以停止从服务器,然后对从服务器上的数据进行备份,备份完成后,再启用。
 
主从复制的实现
START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。
主服务器创建一个Binlog Dump线程将二进制日志中的内容发送到从服务器。从服务器I/O 线程读取主服务
器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继
日志。第3个线程是SQL 线程,从服务器使用此线程读取中继日志并执行日志中包含的更新。
SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。
 
从服务器在数据目录中另外创建两个状态文件master.info 和relay-log.info。状态文件保存
在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服
务器读取了多少二进制日志,以及处理自己的中继日志的程度。
 
从服务器flush tables with read lock;之后,数据暂时就不能同步了,只有解锁之后,复制过来的语句,才会被执行。
从服务器可以不用关闭二进制日志,也可以不用开户中继日志,因为服务器会自动帮你开户或关闭。不关闭二进制日志,从主服务器复制过来的SQL语句,执行的时候,也不会被记录到二进制日志,只有在本机执行的SQL语句,才会被记录到二进制日志。中继日志默认存放在数据目录下,文件名为 主机名.relay-00000N。如果想保存到其它位置,可以在配置文件里面进行指定。
 
1、安装MySQL数据库(略)
2、配置主从服务器
主服务器操作
 
  1. # vim /etc/my.cnf 
  2. server-id = 1   //一定不能跟从服务器一样,这里使用默认即可 
  3. log-bin = mysql-bin //开户指定MySQL的二进制日志及保存位置,默认开户,保存在数据目录中 
  4. sync-binlog=1       //立即同步到磁盘,建议开户 
  5.  
  6. mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'1.1.1.2' IDENTIFIED BY '123456'; 
  7. mysql> FLUSH PRIVILEGES; 
  8.     REPLICATION CLIENT允许在复制主机(Master)和从机(Slave)上使用SHOW STATUS  
  9.     REPLICATION SLAVE允许复制从服务器连接到主服务器  
 
从服务器操作
 
  1. # vi /etc/my.cnf 
  2. #log-bin = mysql-bin    //加#号表示关闭,也可以不关闭 
  3. server-id = 11          //ID号,一定不能跟主服务器相同 
  4. relay-log = relay-bin   //定义中继日志保存的位置及文件名,也可以不用定义 
  5. relay-log-index = relay-bin-index   //中继日志索引文件的名字及保存位置 
  6.  
  7. mysql> CHANGE MASTER TO MASTER_HOST='1.1.1.1',MASTER_USER='repl',MASTER_PASSWORD='123456'
  8. mysql> START SLAVE; 
  9. mysql> SHOW SLAVE STATUS; 
 
能看到以下两项为YES,说明从服务器工作正常
 
  1. Slave_IO_Running: Yes 
  2. Slave_SQL_Running: Yes 
 
 
  1. mysql> show processlist \G 
  2. *************************** 1. row *************************** 
  3.      Id: 6 
  4.    User: system user 
  5.    Host:  
  6.      db: NULL 
  7. Command: Connect 
  8.    Time: 1159 
  9.   State: Waiting for master to send event 
  10.    Info: NULL 
  11. *************************** 2. row *************************** 
  12.      Id: 7 
  13.    User: system user 
  14.    Host:  
  15.      db: NULL 
  16. Command: Connect 
  17.    Time: -153412 
  18.   State: Slave has read all relay log; waiting for the slave I/O thread to update it 
  19.    Info: NULL 
   
可以看到有两个线程,一个等待主服务器发送数据的线程,叫I/O,一个读取中继日志并执行,然后等待slave上的I/O线程更新中日志的,叫SQL线程
 
然后在主服务器上创建一个数据库,在从服务器上查看一下,可以看到数据库,说明是OK的。如果从服务器没有关闭二进制日志,主服务器上创建数据库,在从服务器同步完成后,可以在中从服务器的中继日志里面,看到创建数据库的SQL语句,但是在二进制日志里面,是看不到的。从服务器的二进制日志,只记录直接在从服务器上执行SQL语句,而不记录从主服务器上复制SQL语句,然后执行的语句。在从服务器上直接创建数据库,可以看到,从服务器的二进制日志记录语句的。但是主服务器,不会同步从服务器的数据,这就是主从复制。
 
也可以把以下配置写到从服务器里面,而不用再CHANGE MASTER TO这么麻烦了,另外还有一些其它的定义。
 
  1. // 配置slave服务器/etc/my.cnf 文件,添加以下内容: 
  2. server-id=2 # 从服务器ID号,不要和主ID相同 
  3. master-host=1.1.1.3 # 指定主服务器IP地址 
  4. master-user=repl # 指定在主服务器上可以进行同步的用户名 
  5. master-password=123456 # 密码 
  6. master-port=3306 # 同步所用端口 
  7. master-connect-retry=60 # 断点从新连接时间 
  8. replicate-ignore-db=mysql # 屏蔽对mysql库的同步 
  9. replicate-do-db=test1 # 同步的数据库的名称 
 
常用排错命令及其解释:
 
  1. flush master;   //清空二进制日志 
  2. flush slave;    //清空二进制日志 
以上命令,在主从复制出错的时候,特别是报字段重复的时候,清空一下主服务器和从服务器的二进制日志,然后再用CHANGE MASTER TO命令指向,然后再开户从服务器,应该就不会报错了。
注意:以上两个命令会清空二进制日志,在生产环境请确保已经备份了日志,并且没有数据写入。
 
 
  1. show master status;     //查看主服务器当前使用的二进制文件,及二进制文件的位置 
说明:如果不想清空二进制日志,但是错误又不容易排查,可以在指定主服务器的时候,指定主服务器使用的二进制文件和二进制文件的位置,表示从当前二进制文件的位置,开始往后复制。不复制之前的内容。在此之前,可以通过mysqldump命令,先将数据导出,然后再导入到从服务器。来实现数据一致,然后再使用命令指定二进制文件及位置,以确保主从数据一致。
 
以上,到此,主从复制就结束了。
 
末完,待续…………