Mysql主从同步

一、Mysql主从同步概述

-实现数据自动同步的服务结构

-主服务器:接受客户服务连接

-从服务器:自动同步主服务器数据,并且在主服务器宕机时充当主服务器

 

二、主从同步原理

从这张图来看,主从同步分为两个部分,一个是主服务器部分(Master),一个是从服务器部分(Slave)

主服务器:

1.Binary log :也就是binlog日志,主要用于记录sql操作[详解]https://blog.csdn.net/ck784101777/article/details/100766138

从服务器:

1.Relay log : 中继日志是连接mastert和slave的信息,它是复制的核心,I/O线程将来自master的事件存储到中继日志中,中继日志充当缓冲,这样master不必等待slave执行完成就可以发送下一个事件。

2.I/O thread :从服务器上运行的一个线程,主要用于读写操作,即读取主服务器上的binlog日志,并且写到从服务器上的中继日志上.默认不开启,需手动打开

3.Sql thread:Sql线程,从服务器上运行的一个线程,主要用于读取中继服务器上的二进制文件,并且将其转换为sql语句,并且在Mysql服务中执行

既然了解了主从服务器上的工作的组件,我们来演练一下具体实现主从同步数据的过程

主服务器上插入一条数据-->binlog日志发现并且记载-->从服务器上的I/O线程实时监控binlog日志,发现新记录并读取-->I/O线程将读取过来的数据写到中继日志中-->Sql线程监控到中继日志的变化-->Sql线程将新记录转换为Sql语句并且在mysql中执行(后台执行)

Mysql主从同步_第1张图片

 

 

三、主从同步的配置

 我们通过一个实验来看看如何配置主从同步,如图所示,我们准备两台Mysql服务器,一台作为Master服务器,一台作为Slave服务器,配置ip地址

Mysql主从同步_第2张图片

配置主服务器:

-启用binlog日志,授权用户,查看binlog日志

配置从服务器:

-设置server_id

-保证主从服务器数据一致

-配置同步信息

-启动slave程序,即启动IO和Sql线程

-查看状态信息,是否连接成功,即线程是否启动

 

主服务器配置:

1)启用binlog日志

  1. ]# vim /etc/my.cnf
  2. [mysqld]
  3. server_id=51            //server_id
  4. log-bin=master51        //日志名
  5. :wq
  6. ]# systemctl restart mysqld

2)用户授权

用户名自定义、客户端地址使用% 或 只指定 从服务器的地址 都可以、只给复制数据的权限即可。

  1. ]# mysql -uroot -p密碼
  2. mysql> grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
  3.  
  4. mysql>quit;

3)查看binlog日志信息

查看日志文件名 和 偏移量位置。

mysql> show master status\G;

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

File: master51.000001 //日志名

Position: 441 //偏移量

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set:

1 row in set (0.00 sec)

从服务器配置: 

1)指定server_id

Server_id值可以自定义,但不可以与主服务器相同。(取值范围1-255)

  1. ]# vim /etc/my.cnf
  2. [mysqld]
  3. server_id=52 //server_id值
  4. :wq
  5. ]# systemctl restart mysqld //重启服务

2)确保与主服务器数据一致(如果是使用2台新部署的数据库服务器配置主从同步,此操作可以忽略)

    密码写你登录数据库的密码,导入的时候如果

  1. ]# mysqldump -uroot –p密码  -A > /allbak.sql //在主服务器上备份全部数据
  2. ]# scp /allbak.sql [email protected]:/root/ //将备份文件拷贝给从服务器
  3.  
  4. ]# mysql -uroot –p密码 数据库名 < /root/allbak.sql  //从服务器使用备份文件恢复数据
  5.  

3)指定主服务器信息

数据库管理员root本机登录,指定主服务器信息,其中日志文件名和偏移量 写allbak.sql文件记录的。

指定主服务器信息后,会将主服务器信息保存在/var/lib/mysql/master.info文件下,若需要修改,则有两种途径,一种是在mysql下通过命令修改,而是修改上述文件.修改前必须停止slave线程,命令:stop slave 修改完后开启线程 : start slave

  1. ]# mysql -uroot –p密码 //管理员root 本机登录
  2. mysql> show slave status; //查看状态信息,还不是从服务器
  3. Empty set (0.00 sec)
  4.  
  5. mysql> change master to   //指定主服务器
  6. -> master_host=“192.168.4.51”,  //主服务器ip地址
  7. -> master_user=“repluser”,   //主服务器授权用户
  8. -> master_password=“123qqq…A”,  //主服务器授权用户密码
  9. -> master_log_file=“master51.000001 ”, //主服务器日志文件,以主服务器显示的为主
  10. -> master_log_pos=441;           //主服务器日志偏移量,切忌不可加双引号
  11. -> start slave;   //启动线程
  12. mysql> show slave status\G;    //查看状态信息,主要查看两个线程是否启动
  13. *************************** 1. row ***************************
  14. Slave_IO_State: Waiting for master to send event
  15. Master_Host: 192.168.4.51 //主服务器ip地址
  16. Master_User: repluser
  17. Master_Port: 3306
  18. Connect_Retry: 60
  19. Master_Log_File: master51.000001
  20. Read_Master_Log_Pos: 437
  21. Relay_Log_File: host52relay-bin.000002
  22. Relay_Log_Pos: 604
  23. Relay_Master_Log_File: master51.000001
  24. Slave_IO_Running: Yes        //IO线程yes状态
  25. Slave_SQL_Running: Yes        //SQL线程yes状态
  26. ...........................

从服务相关文件信息:

Mysql主从同步_第3张图片

主从同步连接测试

通过授权用户在客户端进行数据插入,插入数据后查看从服务器数据库是否同步数据

 

1)在主服务器添加访问数据的连接用户

授权用户对所有数据有增删改查的权限即可

  1. ]# mysql –uroot –p密码
  2. mysql> grant select,insert,update,delete on *.* to admin@"%" identified by "123qqq...A";
  3. Query OK, 0 rows affected, 1 warning (0.03 sec)
  4.  
  5. mysql> quit

2)客户端连接主服务器访问数据

在50主机 使用主服务器51的授权用户连接

  1. ]# mysql -h192.168.4.51-uadmin -p123qqq...A
  2. mysql> show grants;
  3. +------------------------------------------------------------+
  4. | Grants for admin@% |
  5. +------------------------------------------------------------+
  6. | GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'admin'@'%' |
  7. +------------------------------------------------------------+
  8. 1 row in set (0.00 sec)
  9.  
  10. mysql> insert into db3.user(name,uid) values("lili",288); //db3库和user表是主从同步之前主服务器已有的。
  11. Query OK, 1 row affected (0.05 sec)
  12.  
  13. mysql> insert into db3.user(name,uid) values("lili",288);
  14. Query OK, 1 row affected (0.28 sec)
  15.  
  16. mysql> insert into db3.user(name,uid) values("lili",288);
  17. Query OK, 1 row affected (0.05 sec)
  18.  
  19. mysql> select name,uid from db3.user where name="lili";
  20. +------+------+
  21. | name | uid |
  22. +------+------+
  23. | lili | 288 |
  24. | lili | 288 |
  25. | lili | 288 |
  26. +------+------+
  27. 3 rows in set (0.00 sec)

3) 客户端连接从服务器访问数据

客户端50主机使用授权用户连接从服务器可以看到和主服务器同样的数据

  1. ]# mysql -h192.168.4.52 –uadmin -p123qqq…A
  2. mysql> select name,uid from db3.user where name="lili";
  3. +------+------+
  4. | name | uid |
  5. +------+------+
  6. | lili | 288 |
  7. | lili | 288 |
  8. | lili | 288 |
  9. +------+------+
  10. 3 rows in set (0.00 sec)

 

四、主从同步结构

主从同步不仅仅只有一主多从的结构,有四种常用的结构

1.一主一从,单向复制: 一主<--一从

2.一主多从,中心化复制:一从-->一主<--一主

3.一主多从,链式复制:一主<--一从<--一从

4.多主模式,互为主从:一主<-->一主

一主多从-中心化实验案例:

准备3台Mysql服务器,一台作为主服务器,两台作为从服务器,配置内容与一主多从模式相同,参照上一个案例,如果你做了上一个案例,这里只需要配置第二台从服务即可,配置内容与第一台一致

Mysql主从同步_第4张图片

一主多从-链式复制案例:

  准备三台Mysql服务器,与上面实验不同的是,这里需要一台主服务器,一台即作为主服务器又作为从服务器,一台作为从服务器

  简单的介绍一下这种服务结构:首先你需要知道的是,我们在做一主一从的服务结构时,不可以在从服务器上插入数据(因为主服务器无法同步从服务器上的数据),在这里我们将数据插入到中间的服务器(这里是192.168.4.54的服务器)有和意义呢,想想一下这样一种情况,我们公司新增了一个部门,并且希望配置一台数据库服务器来存储这个部门的信息,但是它需要用到某个旧部门的数据信息(这里是192.168.4.53的数据库服务器),所有我们为它做了主从同步,将这一台新的服务器作为从服务器,并且同步旧部门的数据库信息,但是我们为了提高数据可靠性,希望有一台服务器最为这两台服务器的从服务器,此时我们就可以用到一主多从-链式复制的结构,这样就同步了两台数据库的信息(相当于取并集),这台从服务器从它的主服务器上同步信息,被同步的主服务器又可以通过自己的主服务器同步信息,此时两台服务器的数据都得到了同步.

  链式复制还有一个好处,那就是当上一级主服务器宕机后,当前服务器充当主服务器使用

Mysql主从同步_第5张图片

从服务器配置(192.168.4.54)

这里省略了主服务器192.168.4.53的配置,如果做了我上面讲述的实验,这里假设你已经完成了这两台服务器的主从同步配置

步骤一:环境准备

为了在启用binlog日志及同步之前保持主、从库的一致性,主从同步未配置之前,要保证从库上要有主库上的数据,禁用selinux,关闭防火墙服务,保证物理连接正常

1)关闭防火墙,禁用selinux,已关可忽略:

  1. ]# systemctl stop firewalld
  2. ]# setenforce 0

步骤二:配置主服务器192.168.4.53

2)用户授权

  1. ]# mysql -uroot -p123456
  2. mysql> grant replication slave on *.* to yaya@"%" identified by "123qqq…A“;
  3. Query OK, 0 rows affected, 1 warning (0.03 sec)

3)启用binlog日志,修改/etc/my.cnf配置,重新启动MySQL服务程序

指定服务器ID号、允许日志同步:

  1. ]# vim /etc/my.cnf
  2. [mysqld]
  3. log_bin=db53                     //启用binlog日志,并指定文件名前缀
  4. server_id=53                 //指定服务器ID号

4)重启mysql服务:

  1. ]# systemctl restart mysqld

5)确保/var/lib/mysql下面有两个文件:

  1. ]# ls /var/lib/mysql/db51.*
  2. /var/lib/mysql/db53.000001 /var/lib/mysql/db53.index

6)查看主服务正在使用的日志信息

查看主服务器状态,记录下当前的日志文件名、偏移的位置(下面SLAVE发起复制时需要用到):

  1. mysql> show master status;
  2. +-------------+----------+--------------+------------------+-------------------+
  3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  4. +-------------+----------+--------------+------------------+-------------------+
  5. | db53.000001 |437 | | | |
  6. +-------------+----------+--------------+------------------+-------------------+
  7. 1 row in set (0.00 sec)

从服务器配置(192.168.4.55) 

步骤一:配置从服务器192.168.4.55

1)验证主库的授权用户

  1. ]# mysql -h192.168.4.54 -uuser54 -p654321
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. Welcome to the MySQL monitor. Commands end with ; or \g.
  4. Your MySQL connection id is 7
  5. Server version: 5.7.17-log MySQL Community Server (GPL)
  6.  
  7. Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
  8.  
  9. Oracle is a registered trademark of Oracle Corporation and/or its
  10. affiliates. Other names may be trademarks of their respective
  11. owners.
  12.  
  13. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  14.  
  15. mysql> //验证成功

2)指定server_id

  1. [mysqld]
  2. server_id=55

3)重新启动服务

  1. ]# systemctl restart mysqld

4)管理员登录指定主库信息

  1. ]# mysql -uroot -p123456
  2. mysql> change master to
  3. -> master_host="192.168.4.54”;
  4. -> master_user="user55”;
  5. -> master_password="654321",
  6. -> master_log_file=" db54.000001”;
  7. -> master_log_pos=154;
  8. Query OK, 0 rows affected, 2 warnings (0.37 sec)

5)启动slave进程

  1. mysql> start slave;
  2. Query OK, 0 rows affected (0.04 sec)

6)查看进程状态信息

  1. mysql> show slave status\G
  2. *************************** 1. row ***************************
  3. Slave_IO_State: Waiting for master to send event
  4. Master_Host: 192.168.4.54
  5. Master_User: user55
  6. Master_Port: 3306
  7. Connect_Retry: 60
  8. Master_Log_File: db54.000001
  9. Read_Master_Log_Pos: 154
  10. Relay_Log_File: db55-relay-bin.000001
  11. Relay_Log_Pos: 315
  12. Relay_Master_Log_File: db54.000001
  13. Slave_IO_Running: Yes
  14. Slave_SQL_Running: Yes

互为主从-多主模式

 要想配置多主模式,你必须了解主从同步的复制模式,并将复制模式更改为半同步复制模式.

[如何更改复制模式]https://blog.csdn.net/ck784101777/article/details/100918876 

 这里假设你已经更改完,那么配置起来就很容易了,你只需要在两台Mysql服务器上配置指定对方的主机即可,通过 change master to命令,参考上文配置格式.

 多主模式的好处就是任意一台服务宕机,剩下的一台都可以作为主服务器,多主模式也是数据库集群架构的基础,缺点是使用两倍的硬件资源,但是存储相同的数据,多少有点浪费资源

 

你可能感兴趣的:(mysql)