标签:数据库 主从复制 原理
主从同步又可以称为主从复制!本人习惯称为主从复制
一、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
标签:数据库 主从复制 原理
原文地址:http://runningyongboy.blog.51cto.com/8234857/1723057