一
mariadb主从多用于网站架构,因为该主从的同步机制是异步的,数据的同步有一定延迟,也就是说有可能会造成数据的丢失,但是性能比较好,因此网站大多数用的是主从架构的数据库,读写分离必须基于主从架构来搭建
主:可以写,可以读,从同步
从:可读,但是写的话主不会同步
工作原理: 当有数据进入到master 时,binarylog (二进制日志)会做出相应的记录,从节点要想读取到主节点的Binarylog日志,需要在master 上创建一个同步账号,用来从节点(master)登录来读取Binarylog(二进制日志),当从节点(slave)用同步账号登录主节点(master)来读取Binarylog日志时,从节点(slave)会生成两个线程,分别为 i/o thread 与 SQL thread ,i/o 线程主要是读 主节点(master) 中的 Binarylog 日志,而master会生成一个线程(dumpthread)用来接收从节点(slave)端所发出的请求,并返回数据到从节点(salve),通过 i/o thread 写入到 Relaylog (中继日志),这时 从节点(salve)的另一个线程 SQLthread 进行读取 Relaylog(中继日志)并回放;从而实现了主从同步,一个主从架构最少会有三个线程
这只是有一个从节点,然而多个从节点呢,因为每有一个从节点(salve) 来读取主节点(master)的Binarylog (二进制日志),主节点(master)就会生成一个dump thread 进程,当从节点(salve) 达到几百台甚至上千台,可想而知会对主节点(master)造成多大的压力,这时我们可以设置一个master的代理主节点,使它的mariadb引擎改成backhole,使他不写不读,只记录Binarylog 文件,它就没有了读写压力。这样就减少了了主节点的压力(master)
Binarylog 日志: 串行记录(一条一条的记录)
mariadb 的主从架构属于 异步同步, 会有延迟, 在数据量大的情况下,可能会同步几个小时,这样有利也有弊;
利:运维人员意外操作导致数据库出错,可以切断 主节点与从节点的连接,从节点不会被同步(在一定的时间内)
弊:数据第一时间不能同步
异步同步与实时同步的区别
实时同步:安全性比较高,效率低
异步同步:安全性较低,效率高
二、
通过上图可以发现,mariadb 主从架构 存在着单点故障,这时我们可以用MHA 来监控主从架构
MHA节点: 通过配置文件去监控主从架构,可以监控多个主从架构, 在监控到的master节点故障时,会提升其中用于最新数据的slave节点成为新的master节点,在此期间,MHA会通过其他从节点获取额外信息来避免一致性方面的问题。MHA还提供了master节点的在线切换功能,即按需切换master/slave节点。
第二种方案:
互为主备 (主主)
mariadb 主从架构属于异步同步,存在在着延迟, 例如在master端加入了一条数据 100修改为200,master 进行同步,因为存在着延迟,在这延迟时间内,master2又有一条数据100修改为100插入 ,因为延迟,可能会导致数据的不一致
缺点:可能会造成数据的不一致
一般这种情况会用在 该数据库一般只用来读,没有太多的更删改查可以考虑这种方法但是可能会造成数据的不一致
第三种方案:
galera 集群 (实时同步)(多主)
特性
基于行复制的完全并行同步复制
实时多主架构,任意节点可读写
无延迟复制,事务零丢失,可靠健壮的读写体验。
自动化节点关系控制:节点故障自动摘除,节点加入自动协调
工作原理:一条事务同时提交
三、部署mariadb 主从架构
环境准备: 1.两台服务器
2.数据库版本以及里面信息必须一样
主节点(master端) :192.168.206.3
从节点 (salve端):192.168.206.5
操作系统:CentOS7.5
数据库版本:MariaDB-10.3.7
1>yum配置,两端一样
[mariadb]
name=MariaDB
baseurl=http://mirrors.ustc.edu.cn/mariadb/yum/10.3/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1
注:master端数据库与slave 端据库 需要版本一致,里边信息一致,那么如何实现数据信息一致呢,这里就用到了数据库的备份功能,将master端的数据库备份,然后将备份文件发送给slave端,salve端 进行数据恢复。再反过来备份一次发送回去,
&这里我备份salve端传到 master端
#1salve端
#master端
在数据库里使用 seq 语句: source lichao.sql 恢复
#master端 再备份一次
#salve端 恢复 source lijie.sql
#查看两个数据库是否一致
master:
slave端:
2>master 配置
&修改配置文件
vim /etc/my.cnf.d/server.cnf
在[mysqld]下添加 (也可以在 [server] 下编辑 )
server-id=1log-bin=mysql-bin
3>重启数据库
4>创建主从连接账号
把从角色 赋予给这个 slave 这个用户
#刷新
#查看
5>查看下 主节点状态
show master status;
6>配置从节点 (slave 端)
编辑配置文件 vim /etc/my.cnf.d/server.cnf
7>重启mariadb
8>登录
CHANGE MASTER TO MASTER_HOST='192.168.206.3', MASTER_USER='slave', MASTER_PASSWORD='slave', MASTER_LOG_FILE=' mysql-bin.000002', MASTER_LOG_POS=467;
9>起线程并查看从节点状态
&1>
start slave;
&2>
show slave statusG; ( G 竖列查看)
配置完成成功
10>测试
#master 端 创建数据库
#查看slave端是否同步
同步成功!