主从复制概念

复制是一种功能,允许将一台或多台服务器(称为主服务器)的内容镜像同步到一台或多台服务器(称为从服务器)上。

您可以控制要复制的数据。所有数据库、一个或多个数据库或数据库中的每个表都可以有选择地复制。

主要机制:复制中使用的主要机制是二进制日志。如果启用了二进制日志记录,则对数据库的所有更新(数据操作和数据定义)都将作为二进制日志事件写入二进制日志。从站从每个主站读取二进制日志,以便访问要复制的数据。在从服务器上创建一个中继日志,使用与二进制日志相同的格式,用于执行复制。不再需要时,旧的中继日志文件将被删除。

从服务器跟踪应用在从服务器上的最后一个事件在主服务器的二进制日志中的位置。这允许从服务器在复制暂时停止后重新连接并从它停止的地方恢复。它还允许从站断开连接,被克隆,然后让新的从站从同一个主站恢复复制。

主站和从站不需要经常相互通信。很有可能使服务器脱机或与网络断开连接,当它们恢复时,复制将从中断的地方继续。

使用场景

复制用于许多常见场景。用途包括:

  • 可扩展性。通过拥有一台或多台从服务器,读取可以分布在多台服务器上,从而减少主服务器的负载。高读低写环境最常见的场景是有一个主服务器,所有的写操作都发生在那里,复制到多个从服务器,它们处理大部分的读操作。
  • 数据分析。分析数据可能对主服务器产生太大影响,这可以在从服务器上类似地处理,而主服务器继续不受额外负载的影响。
  • 备份帮助。如果服务器没有主动更改数据,则可以更轻松地运行备份。一个常见的场景是将数据复制到 slave,然后从 master 断开连接,数据处于稳定状态。然后从此服务器执行备份。请参阅作为备份解决方案的复制。
  • 数据分布。可以在本地复制数据并使用此数据工作,而不是连接到远程主服务器。

常见部署架构图

一主一从或一主多从

提供无限读取扩展,通过将 slave 升级为 master 来提供高可用性。

mariadb 主从同步没有效果 mariadb主从复制_mysql

环形复制

提供读写缩放,不处理冲突,如果一个 master 失败,复制就会停止。

mariadb 主从同步没有效果 mariadb主从复制_数据库_02

明星复制

提供读写缩放,不处理冲突,必须使用复制过滤器来避免数据重复。

mariadb 主从同步没有效果 mariadb主从复制_java_03

多源复制

允许您组合来自不同来源的数据,不同的域在所有从站上独立并行执行。

mariadb 主从同步没有效果 mariadb主从复制_mysql_04

读写分离环境搭建

1.安装Mariadb

安装文档 准备两台虚拟机,参考文档分别安装数据库。

mariadb 主从同步没有效果 mariadb主从复制_linux_05

2.配置主数据库

[root@k3s002 my.cnf.d]# cd /etc/my.cnf.d/
[root@k3s002 my.cnf.d]# vim server.cnf 
[root@k3s002 my.cnf.d]# vi server.cnf 
# 添加内容
[mariadb]
# 开启二进制日志
log-bin
# 每个 MariaDB/MySQL 服务器的唯一编号
server_id=1
# binlog日志前缀
log-basename=master1
# binlog日志格式,mixed表示混合模式
binlog-format=mixed
# 重启数据库
[root@k3s002 my.cnf.d]# systemctl restart mariadb
[root@k3s002 my.cnf.d]# mysql -uroot -p
# 创建从主数据库复制数据的用户及密码
MariaDB [(none)]> CREATE  USER  'replication_user'@'%'  IDENTIFIED  BY  'bigs3cret'; 
MariaDB [(none)]> GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
# 查看主数据库状态 File表示日志文件,Position 表示当前二进制日志位置,
# 配置从节点时会用到,从节点需要从日志文件和位置读取数据
MariaDB [(none)]>  show master status;
+--------------------+----------+--------------+------------------+
| File               | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+--------------------+----------+--------------+------------------+
| master1-bin.000001 |   568|              |                  |
+--------------------+----------+--------------+------------------+
1 row in set (0.000 sec)

3.配置从数据库

[root@k3s001 ~]# vi /etc/my.cnf.d/server.cnf 
# 添加
[mysqld]
# 全局唯一的server-id
server_id=2
# 开启只读模式,root用户不起效,实际环境需要配置只读数据的用户
read_only=ON
[root@k3s001 ~]# systemctl restart mariadb
[root@k3s001 ~]# mysql -uroot -p
# 输入命令,需要替换为自己的主服务器信息
# MASTER_HOST=》主服务器ip
# MASTER_USER=》 用于复制的账户名
# MASTER_PASSWORD=》用于复制的账户密码 
# MASTER_PORT=》主服务器端口
# MASTER_LOG_FILE=》主服务器binlog日志名,和File保持一致               
# MASTER_LOG_POS=》 主服务器binlog日志记录位置,和Position保持一致
# MASTER_CONNECT_RETRY=》 连接重试次数
CHANGE MASTER TO
  MASTER_HOST='192.168.58.241',
  MASTER_USER='replication_user',
  MASTER_PASSWORD='bigs3cret',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='master1-bin.000001',
  MASTER_LOG_POS=568,
  MASTER_CONNECT_RETRY=10;
# 开启复制
MariaDB [(none)]> start slave;
# 查看复制状态
MariaDB [(none)]> show slave status;
# 查看进程
MariaDB [(none)]> show processlist;
# 查看复制所有信息,图中箭头位置为YES时,表示配置完成
MariaDB [(none)]> show slave status\G;

mariadb 主从同步没有效果 mariadb主从复制_mysql_06

4. 测试

在主库中添加表及数据,从库马上就同步过来了数据,综上一主一从的读写分离环境搭建完成,其他模式搭建大同小异。

mariadb 主从同步没有效果 mariadb主从复制_mariadb 主从同步没有效果_07