mysql5.5-主从同步原理与配置

一、主从同步介绍

1.主从复制简介

  • MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借助第三方工具,而且,MySQL的主从复制并不是数据库磁盘上的文件直接拷贝,而是通过逻辑的binlog日志复制到要同步的服务器本地,然后由本地的线程读取日志里面的SQL语句重新应用到MySQL数据库中。
  • MySQL数据库支持单向、双向、链式级联、环状等不同业务场景的复制。在复制过程中,一台服务器充当主服务器(Master),接收来自用户的内容更新,而一个或多个其他的服务器充当从服务器(Slave),接收来自主服务器binlog文件的日志内容,解析出SQL重新更新到从服务器,使得主从服务器数据达到一致。

2.主从复制原理

  • a)在Slave服务器上执行start slave命令开启主从复制开关,主从复制开始进行。
  • b)开启后,Slave服务器的I/O线程会通过在Master上己经授权的复制用户,请求连接Master服务器,并请求从指定Binlog日志文件的指定位罝(日志文件名和位置就是在配罝主从复制服务时执行change master命令指定的)之后开始发送Binlog日志内容。
  • c)Master服务器接收到来自Slave服务器的I/O线程的请求后,其上负责复制的I/O线程会根据Slave服务器的I/O线程请求的信息分批读取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回给Slave端的I/O线程。返回的信息中除了Binlog日志内容外,还有在Master服务器端记录的新的Binlog文件名称以及在新的Binlog中的下一个 指定更新位置。
  • d)当Slave服务器的I/O线程获取到Master服务器上I/O线程发送的日志内容及日志文件及位置点后,会将Binlog日志内容依次写入到Slave端自身的Relay Log(即中继日志) 文件(MySQL-relay-bin.xxxxxx)的最末端,并将新的Binlog文件名和位置记录到master-info文件中,以便下一次读取Master端新Binlog日志时能够告诉Master服务器需要从新Binlog 日志的指定文件及位置开始请求新的Binlog日志内容。
  • e)Slave服务器端的SQL线程会实时地检测本地Relay Log中I/O线程新增加的日志内容,然后及时地把Relay Log文件中的内容解析成SQL语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这些SQL语句,并记录当前应用中继日志的文件名及位置点在relay-log.info中。

二、主从同步应用场景

1.主从服务器互为备份

  • 主从服务器架构设置,可以大大的加强数据库架构的健壮性,例如:当主服务器出现问题时,我们可以人工过自动切换到从服务器继续提供服务。

2.主从服务器读写分离分担网站压力

  • 主从服务器架构可通过程序(PHP、Java等)或代理软件(mysql-proxy、Amoeba)实现对用户(客户端)的请求读写分离,即让从服务器仅仅处理用户的select查询请求,降低用户查询响应时间及读写同时在主服务器上带来的访问压力。对于更新的数据(例如update、insert、delete语句)仍然交给主服务器处理,确保主服务器和从服务器保持实时同步。
  • 3.拆分业务独立并分担压力
    可以把几个不同的从服务器,根据公司的业务进行拆分。例如:有为外部用户提供查询服务的从服务器,有内部DBA用来数据备份的从服务器,还有为公司内部人员提供访问的后台、脚本、日志分析及供开发人员查询使用的从服务器。这样的拆分除了减轻主服务器的压力外,还可以使数据库对外部用户浏览、内部用户业务处理及DBA人员的备份等互不影响。

三、主从同步配置

1.环境准备

两台虚拟机或者一台虚拟机两个实例
我这里使用的是来两个实例
主库:3306
从库:3307
[root@mysql ~]# /data/3306/mysqld start
mysql 3306 start......                                     [确定]
[root@mysql ~]# /data/3307/mysqld start
mysql 3307 start......                                     [确定]
[root@mysql ~]# netstat -lntup|grep 330
tcp        0      0 0.0.0.0:3307                0.0.0.0:*                   LISTEN      39731/mysqld        
tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      46544/mysqld    

2.主库开启bin-log

[root@mysql ~]# egrep "log-bin|server-id" /data/3306/my.conf 
log-bin = /data/3306/mysql-bin 
server-id = 1 
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock -e "show variables like '%log_bin%';"
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| log_bin                         | ON    |
| log_bin_trust_function_creators | OFF   |
| sql_log_bin                     | ON    |
+---------------------------------+-------+
===========
log-bin必须写在[mysqld]模块下
===========

3.主库创建同步账号

mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '000000';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
===============================
replication slave 同步的权限
10.0.0.% 允许远程的网段
===============================

4.主库与从库数据一致

备份主库
[root@mysql ~]# mysqldump -uroot -p000000 -S /data/3306/mysql.sock  --master-data=2 -A -B --events|gzip >/backup/req.sql.gz
恢复到从库
[root@mysql ~]# gunzip < /backup/req.sql.gz | mysql -uroot -p000000 -S /data/3307/mysql.sock
查看
[root@mysql ~]# mysql -uroot -p000000 -S /data/3306/mysql.sock -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liang              |
| liang_gbk          |
| liang_utf8         |
| mysql              |
| performance_schema |
+--------------------+
[root@mysql ~]# mysql -uroot -p000000 -S /data/3307/mysql.sock -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liang              |
| liang_gbk          |
| liang_utf8         |
| mysql              |
| performance_schema |
+--------------------+

5.登录从库配置master信息

[root@mysql ~]# vi /backup/req.sql 
22 -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=330;
mysql> change master to
    -> master_host='10.0.0.13',
    -> master_port=3306,
    -> master_user='rep',
    -> master_password='000000',
    -> master_log_file='mysql-bin.000002',
    -> master_log_pos=330;
Query OK, 0 rows affected (0.04 sec)

6.从库开启slave

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
[root@mysql ~]# mysql -uroot -p000000 -S /data/3307/mysql.sock -e "show slave status\G"|grep -i run
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes##两个yes则为成功

7.验证

主库创建库
mysql> create database test;
Query OK, 1 row affected (0.00 sec) 
从库查看
[root@mysql ~]# mysql -uroot -p000000 -S /data/3307/mysql.sock -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| liang              |
| liang_gbk          |
| liang_utf8         |
| mysql              |
| performance_schema |
| test               |
+--------------------+

猜你喜欢

转载自blog.csdn.net/liang_operations/article/details/82836267