前言
本文主要讲述主从复制、读写分离的原理与配置步骤。
一、主从复制原理
1.1 为什么要主从复制
我们都知道,web服务的一个流程大概为
1、客户向浏览器输入域名或ip
2、dns将域名解析为ip
3、浏览器向web服务器建立连接(三次握手)
4、浏览器向web服务发起http请求
5、如果静态页面web服务器会直接处理并返回,如果是动态页面,web会发给应用服务器,应用服务器去数据库中找数据
6、最后将数据发送给用户,形成画面
那么在动态界面的情况下,应用服务器,调度器,数据库的工作就很重要,上一期博客我们讲了多个调度器的创建与连接,本文就该讲多个数据库的连接
1.2 MySQL的复制类型
1、基于语句的复制(STATEMENT, MySQL默认类型)
2、基于行的复制(ROW)
3、混合类型的复制(MIXED)
1.3 MySQL主从复制的工作过程;
主-从进行复制
1、为什么复制 ? ————保证数据完整性
2、谁复制谁? ——————slave角色复制master 角色的数据
3、数据放在哪?——————二进制文件中
4、 mysql-bin.000001 -> 混合类型的复制(MIXED) 记录完整的sql
5、slave 复制 二进制文件的日志到本地的节点,保存为中继日志方式

原理:主数据库将数据记录进自己的储存中,二进制日志进行记录,在这一过程中,io进程会实时监控主进程的二进制日志和主数据库的储存,一旦有数据增添就会向其发起同步请求,之后dump线程会将数据读取出来发送给i/o线程,i/o线程再将数据写入中继日志,sql线程再从中继日志中读取数据,最后储存进从数据库的储存中。
二日志三线程:
中继日志、二进制日志
dump线程、i/o线程、sql线程
1、在每个事务更新数据完成之前,Master 在二进制日志(Binary log)记录这些改变。写入二进制日志完成后,Master 通知存储引擎提交事务。
2、Slave 将 Master 的复制到其中继日志(Relay log)。首先slave 开始一个工作线程(I/O),I/O线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件,I/O线程将这些事件写入中继日志。
3、SQL slave thread(SQL从线程)处理该过程的最后一步,SQL线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据一致,只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
1.4 MySQL同步方式
1.4.1 异步复制
主库将更新写入Binlog日志文件后,不需要等待数据更新是否已经复制到从库中,就可以继续处理更多的请求。Master将事件写入binlog,但并不知道Slave是否或何时已经接收且已处理。在异步复制的机制的情况下,如果Master宕机,事务在Master上已提交,但很可能这些事务没有传到任何的Slave上。假
设有Master->Salve故障转移的机制,此时Slave也可能会丢失事务。MySQL复制默认是异步复制,异步复制提供了最佳性能。
(简单来说,主数据库与从数据库中间是没有任何交流的,主数据库不会管salve是否已经接受或处理,但这种同步方式速度快)
1.4.2 同步复制
主库将更新写入Binlog日志文件后,需要等待数据更新已经复制到从库中,并且已经在从库执行成功,然后才能返回继续处理其它的请求。同步复制提供了最佳安全性,保证数据安全,数据不会丢失,但对性能有一定的影响。
(简单来说,主数据库会等待所有从数据库完成接受并处理之后才会继续处理别的请求,这种同步方式虽然有很高的可靠性,但是速率太慢)
1.4.3 半同步复制
主库提交更新写入二进制日志文件后,等待数据更新写入了从服务器中继日志中,然后才能再继续处理其它请求。该功能确保至少有1个从库接收完主库传递过来的binlog内容已经写入到自己的relay log里面了,才会通知主库上面的等待线程,该操作完毕。
(简单来说,主数据库会等待至少一个从数据库接收并处理完成之后,才会处理自己的其他请求,这种同步方式是兼具效率与可靠性的同步方式)
1.4.4 增强半同步复制
增强半同步是在MySQL 5.7引入,其实半同步可以看成是一个过渡功能,因为默认的配置就是增强半同步,所以,大家一般说的半同步复制其实就是增强的半同步复制,也就是无损复制。增强半同步和半同步不同的是,等待ACK时间不同rpl_semi_sync_master_wait_point =AFTER_SYNC(默认)。
半同步的问题是因为等待ACK的点是Commit之后,此时Master已经完成数据变更,用户已经可以看到最新数据,当Binlog还未同步到Slave时,发生主从切换,那么此时从库是没有这个最新数据的,用户看到的是老数据。增强半同步将等待ACK的点放在提交Commit之前,此时数据还未被提交,外界看不到数据变更,此时如果发送主从切换,新库依然还是老数据,不存在数据不一致的问题。
二、主从复制的实战操作
2.1 配置
主数据库:10.0.0.6
从数据库1:10.0.0.7
从数据库2:10.0.0.8
2.1 关闭防火墙与网络增强服务
这里已经关闭
systemctl stop firewalld ——————临时关闭防火墙

vim /etc/selinux/config ————————编辑网络增强服务

2.2 编辑ntp软件
yum install -y ntp ntpdate ————————安装ntp软件

ntpdate ntp.aliyun.com ——————————同步时间

cp /etc/ntp.conf /etc/ntp.conf_bak ————————备份ntp配置文件
vim /etc/ntp.conf ——————————编辑ntp配置文件(设置同步时间源)

systemctl start ntpd ——————————开启ntp服务

2.3 从数据库配置
ntpdate 主数据库IP ————————同步主数据库的时间

crontab -e ——————————编辑任务

2.4 配置主从同步
2.4.1 主数据库配置
编辑mysql配置文件
在mysqld模块中加入
log_bin=master-bin ——————————开启而二进制文件
log_slave-updates=true ——————————开启日志同步
(编辑之后记得要重启服务)
systemctl restart mysqld ————————重启mysql服务
注:记住这里的server_id为1,后续的从数据库不能相同

2.4.2 配置权限
grant replication slave on *. * to ‘myslave’@‘10.0.0.%’ identified by ‘3208’——————赋予myslave用户(该用户来源于10.0.0这个网段)权限,权限范围为所有表库中的所有表

show master status ——————查看数据库状态

2.4.3 配置主从同步(从数据库)
第一步 编辑mysql配置文件(记得备份)
(此处编辑的server id 不可以用之前用过的)
cp /etc/my.cnf /etc/my.cnf_bak ——————备份mysql配置文件
log_bin=master-bin ————————开启二进制文件
relay-log=relay-log-bin ——————————开启日志文件
relay-log-index=slave-relay-bin.index ————————(索引)定义relay-log的位置和名称


(配置完后记得重启服务)
systemctl restart mysqld ——————重启mysql服务
2.5 开启服务(检验)
在从数据库中选择要连接的主数据库
change master to
master_host=‘10.0.0.6’, ————————主数据库的ip
master_user=‘myslave’, ————————主数据库的用户
master_password=‘3208’ ————————用户的密码
master_log_file=‘master-bin.000001’, ———————— 二进制文件(在主数据库的状态中可以查到)
master_log_pos=599; ———————— 关键日志参数(也可以在主数据库中查到)

start slave ————————开启slave(主从复制)
show slave status\G; ————————查看主从复制连接状态

2.6 实验
create databases 数据库名字 ————————在主数据库中创建一个数据库

三、MySQL 读写分离
4.1、读写分离的概念及原理
读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
(基本原理:主数据库负责增删改,从数据库负责读)
4.2、为什么要读写分离呢?
因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
但是数据库的“读”(读10000条数据可能只要5秒钟)。
所以读写分离,解决的是,数据库的写入,影响了查询的效率。
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。
4.3、主从复制与读写分离
在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据、语句做备份。
五、读写分离实验
5.1 安装jdk1.6
因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
第一步 cd /opt/local ————————将文件放在 /usr/local目录中
第二步 sh jdk文件 ——————————运行文件

vim /etc/profile ————————编辑环境变量
source /etc/profile ————————刷新/etc/profile文件
用 java -version 查看java是否配置完成

5.2 安装amoeba
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ ——————解压文件至/usr/local/amoeba中

chmod -R 755 /usr/local/amoeba/ ——————给文件赋执行权限
/usr/local/amoeba/bin/amoeba start ————————开启amoeba

可以输入netstat -tulnap | grep java ————————查看8066端口是否开启

5.3 赋权
grant all on * .* to ‘xiajinyang’@‘10.0.0.%’ identified by ‘3208’ ;————————在主、从数据库中给用户赋权,方便之后的检验


5.4 修改amoeba配置文件
cp amoeba.xml amoeba.xml.bak ——————————备份
vim //usr/local/amoeba/conf/amoeba.xml ——————编辑amoeba配置文件
–30行–
< property name=“user”>amoeba< /property>
–32行–
< property name=“password”>123456< /property>
–115行–
< property name=“defaultPool”>master< /property>
–117-去掉注释-
< property name=“writePool”>master< /property>
< property name=“readPool”>slaves< /property>


5.5 编辑数据库配置文件
cp dbServers.xml dbServers.xml.bak ————————备份
vim dbServers.xml ————————编辑数据库配置文件
–23行–注释掉 作用:默认进入test库 以防mysql中没有test库时,会报错
< !-- < property name=“schema”>test</ property> -->
–26–修改
< property name=“user”>test< /property>
–28-30–去掉注释
< property name=“password”>123456< /property>
–45–修改,设置主服务器的名Master
< dbServer name=“master” parent=“abstractServer”>
–48–修改,设置主服务器的地址
< property name=“ipAddress”>192.168.10.16< /property>
–52–修改,设置从服务器的名slave1
< dbServer name=“slave1” parent=“abstractServer”>
–55–修改,设置从服务器1的地址
< property name=“ipAddress”>192.168.10.14< /property>
–58–复制上面6行粘贴,设置从服务器2的名slave2和地址
< dbServer name=“slave2” parent=“abstractServer”>
< property name=“ipAddress”>192.168.10.15< /property>
–65行–修改
< dbServer name=“slaves” virtual=“true”>
–71行–修改
< property name=“poolNames”>slave1,slave2< /property>

5.6 测试读写分离
yum install -y mariadb-server mariadb ——————安装数据库

systemctl start mariadb.service ——————开启数据库服务已便测试

mysql -uamoeba -p3208 -h 10.0.0.100 -P8066 —————————登录amoeba用户(相当于远程登录)

接下来在主、从三台上各输入一次数据,并且取消主从复制,再用客户端去查看,看有哪个的数据,如果显示的是两个从数据库的则从数据库负责查询,实验成功。
第一步 在主数据库中创建一个表


第二步 主、从分别在表中插入数据
slave1:

slave2:
master:

用客户端进行查看只会看到从数据库中的数据。

总结
本文主要讲述主从复制、读写分离的原理与配置步骤,希望本文对大家有所帮助,谢谢观看😜
779

被折叠的 条评论
为什么被折叠?



