目录
MySQL 主从同步模式
主从同步结构
结构类型
配置一主多从结构
拓扑结构
配置从服务器
测试一主多从的配置
配置主从从结构
拓扑结构
配置主服务器
配置从服务器
测试配置
配置主主结构
拓扑机构
配置主服务器
配置从服务器
验证配置
主从同步复制模式
主从同步复制模式介绍
半同步模式配置
示例配置半同步模式
基本应用
—— 单向复制:一主 <-- 一从
扩展应用
—— 一主多从:从 <-- 主 --> 从
↓
从
—— 链式复制:主 <-- 从 <-- 从
—— 互为主从:主 <--> 主
一主多从
具体要求如下
—— 数据库服务器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> show databases;
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" //查看数据库,恢复成功
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,说明主从同步构建成功。
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> select * from db5.a;
主机192.168.233.53:
mysql> select * from db1.a;
mysql> select * from db5.a;
主从从
将从服务器53还原
[root@mysql53 ~]# cd /var/lib/mysql
[root@mysql53 mysql]# ls
[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个库
配置主服务器
—— 启用binlog日志
—— 重启数据库服务
—— 用户授权
1、修改配置文件,启动binlog日志
[root@mysql53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53
log-bin=master53
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
[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;
//如图所示,确认主服务器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;
//如图所示,确认主服务器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> show databases; //发现没有db1库
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; //可以看到和主服务器一样的数据
4、授权用户连接第2台从库,可以看到主库的数据
[root@mysql55 ~]# mysql -uroot -p123456 //可以看到和主服务器一样的数据
mysql> select * from db1.a;
把数据库服务器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
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;
//如图所示,确认主服务器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;
//如图所示,确认主服务器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> select * from db56.mysql56;
mysql> select * from db57.mysql57;
2)在数据库服务器57上查看数据是否同步
[root@mysql57 ~]# mysql -uroot -p123456
mysql> show databases;
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%';
//注: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";
//注: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
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%';
//注: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";
//注: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
4、重启数据库服务
[root@mysql57 ~]# systemctl restart mysqld
[root@mysql57 ~]# mysql -uroot -p123456 -e 'show variables like "rpl_semi_sync_%_enabled"';
//如图所示,重启服务之后,如果查询Values的值还是ON,说明永久设置成功。