192.168.1.1-路由器设置 | 192.168.0.1-无线路由器设置

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

发布时间:2015-12-15 09:20
 主从同步又可以称为主从复制!本人习惯称为主从复制
一、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)
关于我们 - RSS地图 - 最近更新 - 友情链接 - 网站地图 - 版权声明