前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
一、什么是主从复制
1、定义
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。
2、作用
- 做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失
- 架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能
- 读写分离,使数据库能支撑更大的并发 - 在从服务器可以执行查询工作(即我们常说的读功能),降低主服务器压力;(主库写,从库读,降压)- 在从服务器进行备份,避免备份期间影响主服务器服务;(确保数据安全)
二、主从复制原理
实现整个主从复制,需要由slave服务器上的IO进程和Sql进程共同完成
要实现主从复制,首先必须打开Master端的binary log(bin-log)功能,因为MySQL主从复制过程实际上就是Slave从Master端获取相应的二进制日志,然后再在自己slave端完全按照顺序执行日志中所记录的各种操作。
master 负责写 -----A
slave relay-log -----B
I/O 负责通信读取binlog日志
SQL 负责写数据
其主从复制流程图与步骤如下:
- 步骤一:主库db的更新事件(update、insert、delete)被写到binlog
- 步骤二:从库发起连接,连接到主库
- 步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
- 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
- 步骤五:从库还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db.
面试题:1、主从复制延迟大比较慢原因:
主服务器配置高,从服务器的配置低
并发量大导致主服务器读的慢。从服务器写的慢
网络延迟比较高
从服务器的读写速度慢
从节点过多
面试题:2、从数据库的读的延迟问题了解吗?如何解决?
解决方法:
半同步复制—解决数据丢失的问题
并行复制—-解决从库复制延迟的问题
一、主-从-从架构
10.0.0.2主库---10.0.0.3从库--10.0.0.4从库
1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2、设置serve_id (主从库)
# 主库2
[root@localhost ~]# vim /etc/my.cnf
serve_id=2
log_bin=2
# 从库3
[root@localhost ~]# vim /etc/my.cnf
serve_id=3
# 从库4
[root@localhost ~]# vim /etc/my.cnf
serve_id=4
[root@localhost ~]# systemctl restart mysqld
3、开启binlog日志,查看binlog日志信息-(主库)
[root@localhost ~]# mysql -u root -p
mysql> show master status; # 查看binlog日志
+----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------+----------+--------------+------------------+-------------------+
| 2.000001 | 154 | | | |
+----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
4、授权 (主库)
# 允许用户名为"user1",来自10.0.0.*网段的用户使用密码"123"登录到MySQL服务器,并拥有读取二进制日志的权限
mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";
mysql> flush privileges; # 刷新权限
5、指定主库信息 (从库)
mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="2.000001" ,master_log_pos=154;
6、启动slave
mysql> start slave;
7、查看从库状态
mysql> show slave status\G 查看从库状态
...
Slave_IO_Running: Yes io线程
Slave_SQL_Running: Yes sql 线程
二、主-主从-从架构
10.0.0.2主库---10.0.0.3主从库--10.0.0.4从库
初始化数据库
cd /data/mysql/data
rm -rf *
/data/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/mysql --datadir=/data/mysql/data
systemctl restart mysqld
1、设置serve_id
# 主库10.0.0.2
[root@localhost ~]# vim /etc/my/cnf
...
serve_id=2
log_bin=2
# 主从库10.0.0.3
[root@localhost ~]# vim /etc/my/cnf
...
serve_id=3
log_bin=3
log_slave_updates
# 从库10.0.0.4
[root@localhost ~]# vim /etc/my/cnf
serve_id=4
# 都需要重启mysql服务
[root@localhost ~]# systemctl restart mysqld
2、授权与指定主库信息
主库10.0.0.2中操作:
# 查看主库10.0.0.2的binlog日志
[root@localhost ~]# mysql -u root -p
mysql> show master status; # 查看binlog日志
+----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------+----------+--------------+------------------+-------------------+
| 2.000001 | 154 | | | |
+----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 主库10.0.0.2进行授权
mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";
mysql> flush privileges;
主从库10.0.0.3中操作:
# 查看主库10.0.0.3的binlog日志
[root@localhost ~]# mysql -u root -p
mysql> show master status; # 查看binlog日志
+----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------+----------+--------------+------------------+-------------------+
| 3.000001 | 300 | | | |
+----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 主库10.0.0.3进行授权
mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";
mysql> flush privileges;
mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="2.000001" ,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G
从库10.0.0.4中操作:
mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=300;
mysql> start slave;
mysql> show slave status\G
三、互为主从架构
主库10.0.0.2和10.0.0.3互为主从架构
1、设置serve_id
# 主从库10.0.0.2
[root@localhost ~]# vim /etc/my/cnf
...
serve_id=2
log_bin=2
log_slave_updates
# 主从库10.0.0.3
[root@localhost ~]# vim /etc/my/cnf
...
serve_id=3
log_bin=3
log_slave_updates
[root@localhost ~]# systemctl restart mysqld
2、授权与指定主库信息
主从库10.0.0.2:
# 查看主库10.0.0.2的binlog日志
[root@localhost ~]# mysql -u root -p
mysql> show master status; # 查看binlog日志
+----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------+----------+--------------+------------------+-------------------+
| 2.000001 | 154 | | | |
+----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 主库10.0.0.2进行授权
mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";
mysql> flush privileges;
mysql> change master to master_host="10.0.0.3",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=300;
mysql> start slave;
mysql> show slave status\G
主从库10.0.0.3:
# 查看主库10.0.0.3的binlog日志
[root@localhost ~]# mysql -u root -p
mysql> show master status; # 查看binlog日志
+----------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------+----------+--------------+------------------+-------------------+
| 3.000001 | 300 | | | |
+----------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
# 主库10.0.0.3进行授权
mysql> grant replication slave on *.* to "user1"@"10.0.0.%" identified by "123";
mysql> flush privileges;
mysql> change master to master_host="10.0.0.2",master_user="user1",master_password="123",master_log_file="3.000001" ,master_log_pos=154;
mysql> start slave;
mysql> show slave status\G
四、问题解决
查看uuid,uuid号需要唯一:
cat /data/mysql/data/auto.cnf
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!
版权归原作者 小李学不完 所有, 如有侵权,请联系我们删除。