目录
工作原理:mysql主从复制需要三个线程,master(binlog dump thread)、slave(I/O thread 、SQL thread)。
4、如何实现主(A主机192.168.4.51)-->从(B主机192.168.4.52)-->从(C主机192.168.4.53):
(1)、同步子前,需要将主库的所有数据完全备份后再在从库上完全恢复数据,先保证主从库数据的一致。
(2)、主master库(A主机作为B主机的主库)配置如下:
(3)、主master库(B主机作为C主机的主库)配置如下:
5、互为主从复制结构(192.168.4.55和192.168.4.56)
主从同步原理概述及实现
工作原理:mysql主从复制需要三个线程,master(binlog dump thread)、slave(I/O thread 、SQL thread)。
1、binlog dump线程:当主库中有数据更新时,那么主库就会根据按照设置的binlog格式,将此次更新的事件类型写入到主库的binlog文件中,此时主库会创建log dump线程通知slave有数据更新,当I/O线程请求日志内容时,会将此时的binlog名称和当前更新的位置同时传给slave的I/O线程。
2、Slave 的IO线程连接上 Master,并请求从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容;
3、Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。返回信息中除了日志所包含的信息之外,还包括本次返回的信息在 Master 端的 Binary Log 文件的名称以及在 Binary Log 中的位置;
4、Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的relay-log中继日志文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到relay-log- info中继日志信息中,以便在下一次读取的时候能够清楚的告诉Master“我需要从某个binlog的哪个位置开始往后的日志内容,请发给我”
5、Slave 的 SQL 线程检测到 relay-log中继日志文件中新增加了内容后,会马上解析该 Log 文件中的内容为在 Master 端真实执行时候的那些可执行的 Query 语句,并在自身执行这些 Query。这样,实际上就是在 Master 端和 Slave 端执行了同样的 Query,所以两端的数据是完全一样的。
1、对指定库的异地同步
同步子前,需要将主库的所有数据完全备份后再在从库上完全恢复数据,先保证主从库数据的一致。
2、mysql主-->从复制架构的实现
主master库(192.168.4.51)配置如下:
(1)、启用binglog日志文件
[mysqld]
server_id=51-----用于指定服务器id号,mysql同步的数据中是包含server-id的,用于标识SQL命令是从哪个server写入的,
log-bin=master51-----定义了日志文件名前缀为master51log
binlog_format="mixed"------binlog日志里会记录SQL命令还会记录产生的相关数据
(2)、用户授权:给从库添加连接时使用的用户名
grant replication slave on *.* to repluser@"192.168.4.52" identified by "123qqq...A";----注意这里对象必须是*.*所有库的所有表
(3)、查看正在使用的binglog日志信息
show master status;
#show processlist;-----查看当前数据库服务器的所有进程
3、从slave库(192.168.4.52)配置如下:
(1)、指定server_id
[mysqld]
server_id=52
systemctl restart mysqld
(2)、测试授权用户:mysql -uroot -p123456----先用本机帐号登陆
show slave status\G;---查询从库状态信息
Empty set (0.00 sec)---将会显示为空
(3)、管理本机登陆指定主库信息
change master to master_host="192.168.4.51",----指定主库的ip地址
master_user="repluser",----填写主库授权时添加的用户
master_password="123qqq...A",----填写被主库授权时设置的密码
master_log_file="master51.000001",-----这里写的是主库的binlog日志名
master_log_pos=750;-----这里的750是通过在主库上show master status;来查到的
start slave;-----加载从库配置,实现成为主库的从库
(4)、查看配置
show slave status\G;---重新查询从库状态信息
Read_Master_Log_Pos: 750
Relay_Log_File: host52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes------slave_IO线程:复制master主机binlog日志文件里的SQL
命令到本机的relay-log文件里。
Slave_SQL_Running: Yes------slave_SQL线程:执行本机relay-log文件里的SQL命令,
重现master的数据操作。
(5)、从库配置好后会多出来这几个文件:cd /var/lib/mysql
master.info----记录从库连接主库的配置信息(change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",
master_log_file="master51.000001",master_log_pos=750;)
relay-log.info-----中继日志信息(记录了slave-I/O线程从主库哪一个bignlog日志文件复制sql命令到多大偏移量)
host52-relay-bin.*----中继日志文件(记录了自master_log_pos=750之后的所有主机日志)
(6)、当要临时停止主从同步时,可以通过在从库上输入stop slave 命令实现
(7)、当要完全撤销主从同步功能时,先systemctl stop mysqld,再将从库中/var/lib/mysql下的master.info、relay-log.info、host52-relay-bin.*的配置文件删除掉,然后再systemctl restart mysqld重起服务即可。
客户端测试主从同步配置
在主库服务器上管理员本机登陆,添加客户端存储数据时的连接用户。
create database gamedb;
create table gamedb.t1(id int);
grant select,insert on gamedb.* to webadmin@"%" identified by "123qqq...A";
4、如何实现主(A主机192.168.4.51)-->从(B主机192.168.4.52)-->从(C主机192.168.4.53):
(1)、同步子前,需要将主库的所有数据完全备份后再在从库上完全恢复数据,先保证主从库数据的一致。
(2)、主master库(A主机作为B主机的主库)配置如下:
(a)、启用binglog日志文件
[mysqld]
server_id=51-----用于指定服务器id号,mysql同步的数据中是包含server-id的,用于标识SQL命令是从哪个server写入的,
log-bin=master51-----定义了日志文件名前缀为master51log
binlog_format="mixed"
(b)、用户授权:给从库添加连接时使用的用户名
grant replication slave on *.* to repluser@"192.168.4.52" identified by "123qqq...A";
(c)、查看正在使用的binglog日志信息
show master status;
#show processlist;-----查看当前数据库服务器的所有进程
(3)、主master库(B主机作为C主机的主库)配置如下:
(a)、启用binglog日志文件
[mysqld]
log_slave_updates-----开启级联复制功能
server_id=52-----用于指定服务器id号,mysql同步的数据中是包含server-id的,用于标识SQL命令是从哪个server写入的,
log-bin=master52-----定义了日志文件名前缀为master52log
binlog_format="mixed"
(b)、用户授权:给从库添加连接时使用的用户名
grant replication slave on *.* to repluser@"192.168.4.53" identified by "123qqq...A";
(c)、查看正在使用的binglog日志信息
show master status;
#show processlist;-----查看当前数据库服务器的所有进程
(4)、B主机作为A主机的的从库进行相关设置
(1)、指定server_id
[mysqld]
server_id=52
systemctl restart mysqld
(2)、测试授权用户:mysql -uroot -p123456----先用本机帐号登陆
show slave status\G;---查询从库状态信息
Empty set (0.00 sec)---将会显示为空
(3)、管理本机登陆指定主库信息
change master to master_host="192.168.4.51",----指定主库的ip地址
master_user="repluser",----填写主库授权时添加的用户
master_password="123qqq...A",----填写被主库授权时设置的密码
master_log_file="master51.000001",-----这里写的是主库的binlog日志名
master_log_pos=750;-----这里的750是通过在主库上show master status;来查到的
start slave;-----加载从库配置,实现成为主库的从库
(4)、查看配置
show slave status\G;---重新查询从库状态信息
Read_Master_Log_Pos: 750
Relay_Log_File: host52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes------slave_IO线程:复制master主机binlog日志文件里的SQL
命令到本机的relay-log文件里。
Slave_SQL_Running: Yes------slave_SQL线程:执行本机relay-log文件里的SQL命令,
重现master的数据操作。
(5)、C主机作为B主机的从库进行相关设置
(1)、指定server_id
[mysqld]
server_id=53
systemctl restart mysqld
(2)、测试授权用户:mysql -uroot -p123456----先用本机帐号登陆
show slave status\G;---查询从库状态信息
Empty set (0.00 sec)---将会显示为空
(3)、管理本机登陆指定主库信息
change master to master_host="192.168.4.52",----指定主库的ip地址
master_user="repluser",----填写主库授权时添加的用户
master_password="123qqq...A",----填写被主库授权时设置的密码
master_log_file="master52.000001",-----这里写的是主库的binlog日志名
master_log_pos=750;-----这里的750是通过在主库上show master status;来查到的
start slave;-----加载从库配置,实现成为主库的从库
(4)、查看配置
show slave status\G;---重新查询从库状态信息
Read_Master_Log_Pos: 750
Relay_Log_File: host52-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master51.000001
Slave_IO_Running: Yes------slave_IO线程:复制master主机binlog日志文件里的SQL
命令到本机的relay-log文件里。
Slave_SQL_Running: Yes------slave_SQL线程:执行本机relay-log文件里的SQL命令,
重现master的数据操作。
5、互为主从复制结构(192.168.4.55和192.168.4.56)
5-1、192.168.4.55上的操作:
(1) vim /etc/my.cnf
[mysqld]
server_id=55
log-bin=master55
binlog_format="mixed"
(2) 、systemctl restart mysqld
(3)、grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
(4)、change master to master_host="192.168.4.52",master_user="repluser",master_password="123qqq...A",
master_log_file="master52.000001",master_log_pos=750;
start slave;
5-2、192.168.4.56上的操作:
(1) vim /etc/my.cnf
[mysqld]
server_id=56
log-bin=master56
binlog_format="mixed"
(2) 、systemctl restart mysqld
(3)、grant replication slave on *.* to repluser@"%" identified by "123qqq...A";
(4)、change master to master_host="192.168.4.51",master_user="repluser",master_password="123qqq...A",
master_log_file="master51.000001",master_log_pos=750;
start slave;
6、这里顺便提及一些主库和从库的配置选项
6-1、主库配置选项:
binlog_do_db=库名-----设置master对哪些库记日志
binlog_ignore_db=库名----设置master对哪些库不记日志
6-2、从库配置选项:
log_slave_updates----记录从库更新,允许级联复制(A-B-C)
relay_log=xxxx-relay-bin---指定中继日志文件名(即自己可以定义改名)
replication_do_db=库名-----仅复制指定库,其它库将被忽略,此选项可以设置多条(省略时复制所有库)
replication_ignore_db=库名-----不复制哪些库,其他库将被忽略,ignore-db和do-db只能选用其中一种。
7、复制模式分类及描述
异步复制(asynchronous replication):主库执行完一次事物后,立即将结果返还给客户端,并不关心从库是否已经接收并处理。
全同步复制(full synchronous replication):当主库执行完一次事物,且所有从库都执行了该事物后才返回给客户端。
半同步复制(semisynchronous replication):介于异步复制与全同步复制之间,主库在执行完一次事物后,等待至少一个从库接收并写到relay-log中才返回给客户端。
7-1、临时部署半同步复制模式
(1)、主库上的操作:
show variables like "have_dynamic_loading";---查看是否允许动态加载模块(默认允许)
select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";----查看是否已经安装了半同步模块
install plugin rpl_semi_sync_master soname "semisync_master.so";----安装支持主库半同步的模块
select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";----再次查看是否已经安装了半同步模块
show variables like "rpl_semi_sync_%_enabled";----查看是否已经启用半同步复制(默认没有开启)
set global rpl_semi_sync_master_enabled=1;----启用主库半同步复制功能
show variables like "rpl_semi_sync_%_enabled";-----再次查看是否已经启用半同步复制
(2)、从库上的操作:
show variables like "have_dynamic_loading";
select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
install plugin rpl_semi_sync_slave soname "semisync_slave.so";----安装支持从库半同步的模块
select plugin_name,plugin_status from information_schema.plugins where plugin_name like "%semi%";
+----------------------+---------------+
| plugin_name | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE |
| rpl_semi_sync_slave | ACTIVE |
+----------------------+---------------+
show variables like "rpl_semi_sync_%_enabled";
set global rpl_semi_sync_slave_enabled=1;----启用从库半同步复制功能
show variables like "rpl_semi_sync_%_enabled";
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON |
| rpl_semi_sync_slave_enabled | ON |
+------------------------------+-------+
7-2、永久部署半同步模式
systemctl stop mysqld
vim /etc/my.cnf
[mysqld]
server_id=56
log-bin=master56
binlog_format="mixed"
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------启用从库半同步复制功能
systemctl restart mysqld
感谢您的拜读!!!