码迷,mamicode.com
首页 > 数据库 > 详细

十五大原理之零四:MYSQL主从同步原理

时间:2015-12-15 06:32:17      阅读:442      评论:0      收藏:0      [点我收藏+]

标签:数据库 主从复制 原理

主从同步又可以称为主从复制!本人习惯称为主从复制

一、MySQL主从复制(同步)原理过程详细描述:

1.Slave服务器上执行start salve,开启主从复制开关。

2.此时,Slave服务器的IO线程会通过Master上授权的复制用户权限请求连接Master

服务器,并请求从指定Binlog日志文件的指定位置(日志文件名和位置就是配置主从复制服务时执行change master命令时指定的)之后发生Binlog日志内容;

3.Master服务器接收到来自Slave服务器的IO线程的请求后,Master服务器上负责复制的IO线程根据Slave服务器的IO线程请求的信息读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了Binlog日志内容外,还有本次返回日志内容后在Master服务端的新的Binlog文件名称以及在Binlog中的下一个指定更新位置;

4.当Slave服务器的IO线程获取到来自Master服务器上IO线程发送日志内容及日志文件及位置点后,将Binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志)文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新Binlog日志时能够告诉Master服务器需要从新的Binlog日志的哪个位置开始请求新的Binlog日志内容。

5.Slave服务器端的SQL线程会实时的检测本地Relay log中新增加的日志内容,然后及时的把log文件中的内容解析成在Master端曾经执行的SQL语句的内容,并在自身Slave服务器上按语句的顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。

6.经过了上面的过程,就可以确保在Master端和Slave端执行了同样的SQL语句,当复制状态正常的情况下,Mater端和Slave端的数据是完全一样的,Mysql的同步机制是有一些特殊的情况的。

主从复制原理图如下:

技术分享主从复制原理重点小结:

1.主从复制是异步的、逻辑的SQL语句级的复制。PXC

2.同步时,主库有一个IO线程,从库有两个线程,IO和SQL线程。

3.实现主从复制的必要条件,主库要开启binglog功能。

4.binlog文件只记录对数据库有更新的SQL语句(来自主数据库内容的变更)。

二、主从同步实践(双机同步)

1.环境准备

VMware Workstaion 两台 

Master:10.0.0.3

slave:10.0.0.103

linux Centos 6.7

mysql 5.3.27

2.二进制安装数据库

Master和slave数据库安装一致:

[root@master ~]#tar xf mysql-5.5.32-linux2.6-x86_64.tar.gz

[root@master ~]#mv mysql-5.5.32-linux2.6-x86_64 /application/mysql-5.5.32

[root@master ~]#ln -s /application/mysql-5.5.32/ /application/mysql

[root@master ~]#useradd mysql -s /sbin/nologin -M

[root@master ~]#chown -R mysql.mysql /application/mysql/

初始化数据库(创建管理数据库的管理数据)

[root@master ~]# cd /application/mysql

[root@master mysql]#/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql

[root@master ~]#\cp /application/mysql/support-files/my-small.cnf  /etc/my.cnf

[root@master ~]#\cp /application/mysql/support-files/mysql.server 

启动数据库

[root@master ~]#/etc/init.d/mysqld

[root@master ~]#sed -i ‘s#/usr/local/mysql#/application/mysql#g‘  /application/mysql/bin/mysqld_safe /etc/init.d/mysqld

[root@master ~]#/etc/init.d/mysqld start

[root@master ~]#echo ‘PATH="/application/mysql/bin:$PATH"‘ >>/etc/profile

[root@master ~]#source /etc/profile

[root@master ~]#mysqladmin -uroot password#设置数据库用户密码

slave安装同上。

3.Master服务器

vim /etc/my.cnf

#skip-networking

server-id       = 3 #一般修改为主机ip地址的后8位

# Uncomment the following if you want to log updates

log-bin=mysql-bin #主数据库开启log日志记录增量以及变化内容以便同步到从库

重启数据库:

[root@master ~]#/etc/init.d/mysqld restart

登录数据库授权一个同步从库的用户的权限:

mysql> grant replication slave on *.* to ‘rep‘@‘10.0.0.%‘ identified by ‘oldboy123‘;

Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

mysql> show grants for ‘rep‘@‘10.0.0.%‘

    -> ;

+-----------------------------------------------------------------------------------------------------------------------+

| Grants for rep@10.0.0.%                                                                                               |

+-----------------------------------------------------------------------------------------------------------------------+

| GRANT REPLICATION SLAVE ON *.* TO ‘rep‘@‘10.0.0.%‘ IDENTIFIED BY PASSWORD ‘*FE28814B4A8B3309DAC6ED7D3237ADED6DA1E515‘ |

+-----------------------------------------------------------------------------------------------------------------------+

锁表,记录log位置信息以便从库读取

mysql> flush table with read lock;

Query OK, 0 rows affected (0.00 sec)


mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000005 |      333 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql> flush table with read lock;

Query OK, 0 rows affected (0.02 sec)

由于两台是新安装的数据库,不存在数据,可以不用锁表、备份导入数据。

待从库配置完毕,解锁

mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)



4.slave服务器

vim /etc/my.cnf

#skip-networking

server-id       = 103

# Uncomment the following if you want to log updates

#log-bin=mysql-bin #可以不开启

重启数据库:

[root@slave ~]# /etc/init.d/mysqld restart

登录数据库:

mysql> CHANGE MASTER TO  

    -> MASTER_HOST=‘10.0.0.3‘, 

    -> MASTER_PORT=3306,

    -> MASTER_USER=‘rep‘, 

    -> MASTER_PASSWORD=‘oldboy123‘, 

    -> MASTER_LOG_FILE=‘mysql-bin.000005‘,

    -> MASTER_LOG_POS=333;

Query OK, 0 rows affected (0.06 sec)

开启从库:

mysql> start slave;

Query OK, 0 rows affected (0.09 sec)

查看从库状态:

mysql> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 10.0.0.3

                  Master_User: rep

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000005

          Read_Master_Log_Pos: 1240

               Relay_Log_File: slave-relay-bin.000003

                Relay_Log_Pos: 587

        Relay_Master_Log_File: mysql-bin.000005

             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: 1240

              Relay_Log_Space: 1134

              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: 3

1 row in set (0.00 sec)


5.测试:

首先查看下主、从库数据库都是一致

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

+--------------------+

3 rows in set (0.01 sec)

在主库上创建一个数据库wumin:

mysql> create database wumin;

Query OK, 1 row affected (0.00 sec)

mysql> show databases;       

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| wumin              |

+--------------------+

4 rows in set (0.00 sec)

从库中查看到主库新创建的wumin已复制到从库

mysql> show databases;    

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| wumin              |

+--------------------+

4 rows in set (0.00 sec)

本文出自 “追梦男孩” 博客,请务必保留此出处http://runningyongboy.blog.51cto.com/8234857/1723057

十五大原理之零四:MYSQL主从同步原理

标签:数据库 主从复制 原理

原文地址:http://runningyongboy.blog.51cto.com/8234857/1723057

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!