MySQL 主从同步模式

目录

MySQL 主从同步模式

主从同步结构

结构类型

配置一主多从结构

拓扑结构

配置从服务器

测试一主多从的配置

配置主从从结构

拓扑结构

配置主服务器

配置从服务器

测试配置

配置主主结构

拓扑机构

配置主服务器

配置从服务器

验证配置

主从同步复制模式

主从同步复制模式介绍

半同步模式配置

示例配置半同步模式


MySQL 主从同步模式

主从同步结构

结构类型

  • 基本应用

—— 单向复制:一主 <-- 一从

  • 扩展应用

—— 一主多从:从 <-- 主 --> 从

                                     ↓

                                    从

—— 链式复制:主 <-- 从 <-- 从

—— 互为主从:主 <--> 主

配置一主多从结构

拓扑结构

  • 一主多从

MySQL 主从同步模式_第1张图片

配置从服务器

  • 具体要求如下

—— 数据库服务器192.168.233.51配置为主数据库服务器

—— 数据库服务器192.168.233.52配置为从数据库服务器

—— 数据库服务器192.168.233.53配置为从数据库服务器

—— 客户端192.168.233.50测试配置

主机192.168.233.51和主机192.168.233.52的配置见MySQL 主从同步 —— 一主一从_N_jw107的博客-CSDN博客

  • 配置从服务器53

—— 修改配置文件

—— 确保与主服务器数据一致

—— 指定主库信息

—— 启动slave进程

1、启动数据库服务

[root@mysql53 ~]# systemctl start mysqld

[root@mysql53 ~]# netstat -lntup | grep 3306

tcp6       0      0 :::3306                 :::*                    LISTEN      2893/mysqld        

[root@mysql53 ~]# systemctl status mysqld

MySQL 主从同步模式_第2张图片

mysql> show databases;

MySQL 主从同步模式_第3张图片

2、配置主配置文件

[root@mysql53 ~]# vim /etc/my.cnf

[mysqld]

server_id=53

[root@mysql53 ~]# systemctl restart mysqld

3、确保与主服务器数据一致

①主服务器192.168.233.51做完全备份,并将备份文件拷贝给从服务器192.168.233.53

[root@mysql51 ~]# mysqldump -uroot -p123456 --master-data -B db1 db5 > /root/twodb.sql       //--master-data记录当前备份数据对应的日志信息。

[root@mysql51 ~]# scp /root/twodb.sql [email protected]:/root/

②从服务器192.168.233.53做完全恢复

[root@mysql53 ~]# mysql -uroot -p123456 < /root/twodb.sql

[root@mysql53 ~]# mysql -uroot -p123456 -e "show databases"       //查看数据库,恢复成功

MySQL 主从同步模式_第4张图片

4、在从服务器192.168.223.53中查看备份文件中的binlog日志信息

[root@mysql51 ~]# grep master51 /root/twodb.sql

CHANGE MASTER TO MASTER_LOG_FILE='master51.000001', MASTER_LOG_POS=3234;

5、在从服务器192.168.233.53上指定主服务器信息

[root@mysql53 ~]# mysql -uroot -p123456

mysql> change master to

    -> master_host="192.168.233.51",                  //主库ip地址 

    -> master_user="repluser",                             //主库授权用户

    -> master_password="123456",                     //授权用户密码

    -> master_log_file="master51.000001",         //主库日志文件

    -> master_log_pos=3234;                               //日志偏移量

mysql> start slave;                   //启动slave进程

mysql> show slave status\G;       //主服务器为192.168.233.51,且Slave_IO_Running和Slave_SQL_Running的状态为Yes,说明主从同步构建成功。

MySQL 主从同步模式_第5张图片

测试一主多从的配置

1、客户端50连接主服务器51访问数据

[root@mysql50 ~]# mysql -h192.168.233.51 -uadmin -p123456

mysql> insert into db1.a values(888);

mysql> insert into db5.a values("alice");

2、在从服务器52、53本机可以查看到相同的数据

主机192.168.233.52:

mysql> select * from db1.a;

MySQL 主从同步模式_第6张图片

mysql> select * from db5.a;

MySQL 主从同步模式_第7张图片

主机192.168.233.53:

mysql> select * from db1.a;

MySQL 主从同步模式_第8张图片

mysql> select * from db5.a;

MySQL 主从同步模式_第9张图片

配置主从从结构

拓扑结构

  • 主从从

MySQL 主从同步模式_第10张图片

将从服务器53还原

[root@mysql53 ~]# cd /var/lib/mysql

[root@mysql53 mysql]# ls

MySQL 主从同步模式_第11张图片

[root@mysql53 mysql]# rm -rf master.info      //删除主库信息

[root@mysql53 mysql]# rm -rf relay-log.info         //删除中继日志信息

[root@mysql53 mysql]# rm -rf mysql53-relay-bin.*       //删除中继日志和索引文件

[root@mysql53 mysql]# systemctl restart mysqld

[root@mysql53 mysql]# mysql -uroot -p123456

mysql> show slave status;         //没有输出从服务器信息,说明配置成功

Empty set (0.00 sec)

mysql> drop database db1;

mysql> drop database db5;

mysql> show databases;         //还原成数据库初始的4个库

MySQL 主从同步模式_第12张图片

配置主服务器

  • 配置主服务器

—— 启用binlog日志

—— 重启数据库服务

—— 用户授权

1、修改配置文件,启动binlog日志

[root@mysql53 ~]# vim /etc/my.cnf

[mysqld]

server_id=53

log-bin=master53

MySQL 主从同步模式_第13张图片

2、重启数据库服务

[root@mysql53 ~]# systemctl restart mysqld

3、用户授权

mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

mysql> show master status;        //显示当前的日志名称和偏移量

4、关闭防火墙和SELinux

[root@mysql53 ~]# systemctl stop firewalld

[root@mysql53 ~]# setenforce 0

配置从服务器

  • 配置从服务器54

—— 修改配置文件

—— 用户授权

—— 指定主库信息

—— 启动slave进程

—— ]# vim /etc/my.cnf

            [mysqld]

            server_id=id号

            log-bin=日志名

            log_slave_updates        //允许级联复制

        ]# systemctl restart mysqld

//注:主机192.168.233.54既是从服务器也是主服务器,所以在修改主配置文件的时候也需要启用binlog日志,且必须配置log_slave_updates允许级联复制,否则无法实现主从从结构。

1、修改配置文件

[root@mysql54 ~]# vim /etc/my.cnf

[mysqld]

server_id=54

log-bin=master54

log_slave_updates

MySQL 主从同步模式_第14张图片

[root@mysql54 ~]# systemctl restart mysqld

2、用户授权

mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

mysql> show master status;

3、关闭防火墙和SELinux

[root@mysql54 ~]# systemctl stop firewalld

[root@mysql54 ~]# setenforce 0

4、做主机192.168.233.53的从服务器,指定主库信息

[root@mysql54 ~]# mysql -uroot -p123456

mysql> change master to

    -> master_host="192.168.233.53",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master53.000001",

    -> master_log_pos=441;

mysql> start slave;

mysql> show slave status\G;

MySQL 主从同步模式_第15张图片

//如图所示,确认主服务器IP为192.168.233.53,且Slave_IO_Running和Slave_SQL_Running的状态为Yes,说明主从同步构建成功。

  • 配置从服务器55

—— 修改配置文件

—— 指定主库信息

—— 启动slave进程

1、修改配置文件

[root@mysql55 ~]# vim /etc/my.cnf

[mysqld]

server_id=55

[root@mysql55 ~]# systemctl restart mysqld

2、关闭防火墙和SELinux

[root@mysql55 ~]# systemctl stop firewalld

[root@mysql55 ~]# setenforce 0

3、做主机192.168.233.54的从服务器,指定主库信息

[root@mysql55 ~]# mysql -uroot -p123456

mysql> change master to

    -> master_host="192.168.233.54",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master54.000001",

    -> master_log_pos=441;

mysql> start slave;

mysql> show slave status\G;

MySQL 主从同步模式_第16张图片

//如图所示,确认主服务器IP为192.168.233.54,且Slave_IO_Running和Slave_SQL_Running的状态为Yes,说明主从同步构建成功。

至此主从从模式就配置完毕了,主机53是主服务器,主机54是主机53的从服务器,且是主机55的主服务器,主机55是主机54的从服务器。

测试配置

  • 测试步骤

—— 在主库授权访问数据的连接用户

—— 客户端连接主库,执行与权限匹配的sql操作

—— 授权用户连接第1台从库,可以看到主库的数据

—— 授权用户连接第2台从库,可以看到主库的数据

1、在主库授权访问数据的连接用户

主机192.168.233.53:

[root@mysql53 ~]# mysql -uroot -p123456

mysql> grant all on db1.* to njw@"%" identified by "123456";

2、客户端连接主库,执行与权限匹配的sql操作

主机192.168.233.50:

[root@mysql50 ~]# mysql -h192.168.233.53 -unjw -p123456

mysql> show grants;       //查看当前登录用户的权限

MySQL 主从同步模式_第17张图片

mysql> show databases;         //发现没有db1库

MySQL 主从同步模式_第18张图片

mysql> create database db1;       //我们有db1库的所有权限,所以创建db1库

mysql> create table db1.a(id int);

mysql> insert into db1.a values(100);

3、授权用户连接第1台从库,可以看到主库的数据

[root@mysql54 ~]# mysql -uroot -p123456

mysql> select * from db1.a;        //可以看到和主服务器一样的数据

MySQL 主从同步模式_第19张图片

4、授权用户连接第2台从库,可以看到主库的数据

[root@mysql55 ~]# mysql -uroot -p123456       //可以看到和主服务器一样的数据

mysql> select * from db1.a;

MySQL 主从同步模式_第20张图片

配置主主结构

拓扑机构

  • 把数据库服务器56和57配置为mysql主主结构

—— 数据库服务器56是数据库服务器57的主服务器,也是数据库服务器57的从服务器。

—— 数据库服务器57是数据库服务器56的主服务器,也是数据库服务器56的从服务器。

配置主服务器

  • 配置主服务器

—— 启用binlog日志

—— 重启数据库服务

—— 用户授权

1、配置数据库服务器56(主服务器配置)

1)修改配置文件,启动binlog日志

[root@mysql56 ~]# vim /etc/my.cnf

[mysqld]

server_id=56

log-bin=mysql56

MySQL 主从同步模式_第21张图片

2)重启数据库服务

[root@mysql56 ~]# systemctl restart mysqld

3)用户授权

[root@mysql56 ~]# mysql -uroot -p123456

mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

mysql> show master status;

4)关闭防火墙和SELinux

[root@mysql56 ~]# systemctl stop firewalld

[root@mysql56 ~]# setenforce 0

2、配置数据库服务器57(主服务器配置)

1)修改配置文件,启动binlog日志

[root@mysql57 ~]# vim /etc/my.cnf

[mysqld]

server_id=57

log-bin=master57

2)重启数据库服务

[root@mysql57 ~]# systemctl restart mysqld

3)用户授权

[root@mysql57 ~]# mysql -uroot -p123456

mysql> grant replication slave on *.* to repluser@"%" identified by "123456";

mysql> show master status;

4)关闭防火墙和SELinux

[root@mysql57 ~]# systemctl stop firewalld

[root@mysql57 ~]# setenforce 0

配置从服务器

  • 配置从服务器

—— 修改配置文件

—— 用户授权

—— 指定主库信息

—— 启动slave进程

1、把服务器57配置成56的从服务器

主机192.168.233.57

1)做主机192.168.233.56的从服务器,指定主库信息

[root@mysql57 ~]# mysql -uroot -p123456

mysql> change master to

    -> master_host="192.168.233.56",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master56.000001",

    -> master_log_pos=441;

2)启动slave进程,并查看从服务器信息

mysql> start slave;

mysql> show slave status\G;

MySQL 主从同步模式_第22张图片

//如图所示,确认主服务器IP为192.168.233.56,且Slave_IO_Running和Slave_SQL_Running的状态为Yes,说明主从同步构建成功。

2、把服务器56配置成57的从服务器

主机192.168.233.56

1)做主机192.168.233.57的从服务器,指定主库信息

[root@mysql56 ~]# mysql -uroot -p123456

mysql> change master to

    -> master_host="192.168.233.57",

    -> master_user="repluser",

    -> master_password="123456",

    -> master_log_file="master57.000001",

    -> master_log_pos=441;

2)启动slave进程,并查看从服务器信息

mysql> start slave;

mysql> show slave status\G;

MySQL 主从同步模式_第23张图片

//如图所示,确认主服务器IP为192.168.233.57,且Slave_IO_Running和Slave_SQL_Running的状态为Yes,说明主从同步构建成功。

验证配置

  • 测试步骤

—— 分别在数据库服务器56和57上授权不同的连接访问用户

—— 客户端使用不同的授权用户登陆数据库服务器56和57,执行不同的SQL命令

—— 分别在数据库服务器56和57上查看数据是否同步

1、分别在数据库服务器56和57上授权不同的连接访问用户

1)在数据库服务器56上授权连接用户njwa

mysql> grant all on *.* to njwa@"%" identified by "123456";

2)在数据库服务器57上授权连接用户njwb

mysql> grant all on *.* to njwb@"%" identified by "123456";

2、客户端使用不同的授权用户登陆数据库服务器56和57,执行不同的SQL命令

1)客户端登陆数据库服务器56上,执行SQL命令

[root@mysql50 ~]# mysql -h192.168.233.56 -unjwa -p123456

mysql> create database db56;

mysql> create table db56.mysql56(id int);

mysql> insert into db56.mysql56 values(56);

2)客户端登陆数据库服务器57上,执行SQL命令

[root@mysql50 ~]# mysql -h192.168.233.57 -unjwb -p123456

mysql> create database db57;

mysql> create table db57.mysql57(id int);

mysql> insert into db57.mysql57 values(57);

3、分别在数据库服务器56和57上查看数据是否同步

1)在数据库服务器56上查看数据是否同步

[root@mysql56 ~]# mysql -uroot -p123456

mysql> show databases;

MySQL 主从同步模式_第24张图片

mysql> select * from db56.mysql56;

mysql> select * from db57.mysql57;

2)在数据库服务器57上查看数据是否同步

[root@mysql57 ~]# mysql -uroot -p123456

mysql> show databases;

MySQL 主从同步模式_第25张图片

mysql> select * from db56.mysql56;

mysql> select * from db57.mysql57;

主从同步复制模式

主从同步复制模式介绍

  • 异步复制模式(默认)(Asynchronous replication)

—— 主库执行完一次事务后,立即将结果返给客户端,并不关心从库是否已经接收并处理。

  • 全同步复制模式(Full synchronous replication)

—— 当主库执行完一次事务,且所有从库都执行了该事务后才将结果返回给客户端。

  • 半同步复制模式(Semisynchronous replication)

—— 介于异步复制和全同步复制之间。

—— 主库在执行完一次事务之后,等待至少一个从库接收到,并写到relay log中才将结果返回给客户端。

注:

当我们没有配置主从之间实现数据同步的时候,主服务器和从服务器之间就是异步复制模式。

执行一次事务就是执行一次SQL命令。

异步复制的优点是客户端接收数据的效率会变高;缺点是当主服务器宕机之后,客户端去连接从服务器,从服务器上

可能没有主服务器上的数据。

全同步复制的优点是当主服务器宕机之后,客户端去连接任何一个从服务器,从服务器上的数据和主服务器都是一样的。确保每一个从服务器都有主服务器上的数据。缺点就是如果主服务器和从服务器之间的网络不好,或者从服务器的硬件配置比较低,就会导致从服务器同步数据的时间变长,客户端得到返回结果的时间变长。

半同步模式配置

  • 查看是否允许动态加载模块

—— 默认允许

mysql> show variables like 'have_dynamic_loading';

//注:半同步复制模式是由模块来实现的,想要使用半同步复制模式就必须要加载模块

  • 命令行加载插件

—— 使用数据库管理员root用户访问服务

mysql> install plugin rpl_semi_sync_master

    -> SONAME "semisync_master.so";         //主服务器上执行

mysql> install plugin rpl_semi_sync_slave

    -> SONAME "semisync_slave.so";           //从服务器上执行

mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';     //查看

//注:install plugin是加载插件的命令;rpl_semi_sync_master指定模块类型,主服务器是master,从服务器就是slave;SONAME定义的是模块名;双引号里面放的就是模块。

如果服务器既做主服务器又做从服务器,那么两个模块类型都要加载,即两条命令都要执行。

  • 启用半同步复制

—— 半同步复制默认是关闭的

mysql> set global rpl_semi_sync_master_enabled=1;        //主服务器执行

mysql> set global rpl_semi_sync_slave_enabled=1;           //从服务器执行

mysql> show variables like "rpl_semi_sync_%_enabled";   //查看

//set global就是设置全局

注:加载启用完成后配置就生效了,但是一旦重启服务以上配置就会失效

  • 永久启用半同步复制

—— 修改主配置文件 /etc/my.cnf

—— 在[mysqld]下方添加

//主服务器

plugin-load=rpl_semi_sync_master=semisync_master.so

rpl_semi_sync_master_enabled=1

//从服务器

plugin-load=rpl_semi_sync_slave=semisync_slave.so

rpl_semi_sync_slave_enabled=1

//注:plugin-load是在配置文件中加载模块的选项,plugin-load=后面第一个值指定的是模块类型,第二个值后面是模块名;rpl_semi_sync_slave_enabled=1是启用模块。

  • 是master和slave两种角色时

—— 当服务器既是主服务器又是从服务器时,需同时启用

—— 格式如下:

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl_semi_sync_master_enabled=1

rpl_semi_sync_slave_enabled=1

示例配置半同步模式

—— 服务器192.168.233.56和服务器192.168.233.57是主主结构,所以两种模块都要加载启用

  • 服务器192.168.233.56:

1、命令行加载插件

mysql> install plugin rpl_semi_sync_master

    -> SONAME "semisync_master.so";

mysql> install plugin rpl_semi_sync_slave

    -> SONAME "semisync_slave.so";

mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';

MySQL 主从同步模式_第26张图片

//注:plugin_status的值为ACTIVE时,说明加载成功

2、启用半同步复制

mysql> set global rpl_semi_sync_master_enabled=1;

mysql> set global rpl_semi_sync_slave_enabled=1;

mysql> show variables like "rpl_semi_sync_%_enabled";

MySQL 主从同步模式_第27张图片

//注:Values的值为ON时,说明启用成功

3、永久启用半同步复制

[root@mysql56 ~]# vim /etc/my.cnf

[mysqld]

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl_semi_sync_master_enabled=1

rpl_semi_sync_slave_enabled=1

MySQL 主从同步模式_第28张图片

4、重启数据库服务

[root@mysql56 ~]# systemctl restart mysqld

[root@mysql56 ~]# mysql -uroot -p123456 -e 'show variables like "rpl_semi_sync_%_enabled"';

//如图所示,重启服务之后,如果查询Values的值还是ON,说明永久设置成功。

  • 服务器192.168.233.57:

1、命令行加载插件

mysql> install plugin rpl_semi_sync_master

    -> SONAME "semisync_master.so";

mysql> install plugin rpl_semi_sync_slave

    -> SONAME "semisync_slave.so";

mysql> select plugin_name,plugin_status from information_schema.plugins where plugin_name like '%semi%';

MySQL 主从同步模式_第29张图片

//注:plugin_status的值为ACTIVE时,说明加载成功

2、启用半同步复制

mysql> set global rpl_semi_sync_master_enabled=1;

mysql> set global rpl_semi_sync_slave_enabled=1;

mysql> show variables like "rpl_semi_sync_%_enabled";

MySQL 主从同步模式_第30张图片

//注:Values的值为ON时,说明启用成功

3、永久启用半同步复制

[root@mysql57 ~]# vim /etc/my.cnf

[mysqld]

plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl_semi_sync_master_enabled=1

rpl_semi_sync_slave_enabled=1

MySQL 主从同步模式_第31张图片

4、重启数据库服务

[root@mysql57 ~]# systemctl restart mysqld

[root@mysql57 ~]# mysql -uroot -p123456 -e 'show variables like "rpl_semi_sync_%_enabled"';

//如图所示,重启服务之后,如果查询Values的值还是ON,说明永久设置成功。

你可能感兴趣的:(MySQL数据库,mysql,linux,数据库)