MySQL主从复制与读写分离

目录

引言

一、主从复制原理

基于语句的复制

基于行的复制

基于混合类型的复制

二、主从复制的工作过程

两日志

三线程

三、主从复制实验

1.环境准备

2、主从服务器时间同步

 3、主服务器配置(主从同步 192.168.131.20)

4.从服务器配置文件(192.168.131.30      192.168.131.40)

slave1

slave2

 5、验证主从复制的效果

 四、读写分离

1.原理

2.为什么要做读写分离

3.实现方式

1、基于程序代码内部实现

2、基于中间代理层实现

五、搭建MySQL 读写分离

1.环境准备

2.时间同步,关闭防火墙,关闭核心防护

3.安装 Java 环境(  amoeba  192.168.131.50 )


引言

在企业应用中,成熟的业务通常数据量都比较大。

单台MYSQL在安全性,高可用性和高并发方面都无法满足实际的需求。

配置多台主从数据服务器以实现读写分离。

一、主从复制原理

基于语句的复制

  • 在主服务器上执行的sql语句,在从服务器执行同样的语句
  • mysql默认采用的方式,效率高。

基于行的复制

  • 把改变的内容复制过去

基于混合类型的复制

  • 默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用行的复制。

二、主从复制的工作过程

两日志

二进制文件:记录数据库变动的信息(语句,变动记录)

中间日志文件:用于临时存放二进制文件内容

三线程

dump线程:1,监听本地二进制日志

                    2,记录I/O线程对应的slave位置

                    3,同步二进制日志更新内容给I/O线程

I/O线程     :1,监听master的dump线程

                     2,将slave信息发送给master从服务器位置,日志的position记录位置,超时时间

                     3,接受master的dump线程传递过来的关更新信息

                     4,写入relay-log中

SQL 线程:  1,监听中继日志

                     2,将中继日志中的更新内容执行到自己的数据库中,(保证从库与主库执行相同的操作)

1、首先client端(tomcat)将数据写入到master节点的数据库中,master节点会通知存储引擎提交事务,同时会将数据以(基于行、基于SQL、基于混合)的方式保存在二进制文件中。
 
2、slave节点会开启 I/O 线程,用于监听master的二进制日志的更新,一旦发生更新内容,则向master的dump线程发出同步请求。
 
3、master的dump线程在接收到salve的I/O请求后,会读取二进制日志文件中更新的数据,并发送给slave的I/O线程。
 
4、slave的I/O线程接收到数据后,会保存在slave节点的中继日志中。
 
5、同时,slave节点中的SQL线程,会读取中继日志中的数据,更新在本地的mysql数据库中
 
6、最终,完成slave---> 复制master数据,达到主从同步的效果。
 
中继日志通常会位于OS缓存中,所以中继日志的开销很小。
复制过程有一个很重要的限制,即复制在slave上时串行化的,也就是说,master上的并行更新操作不能再slave上并行操作。

三、主从复制实验

1.环境准备

服务器名称ip地址
主服务器192.168.131.20
从服务器1192.168.131.30
从服务器2192.168.131.40

三台机器关闭防火墙,关闭核心防护

2、主从服务器时间同步

yum -y install ntp
 
下载ntp进行时间同步
 
ntpdate ntp1.aliyun.com
进行时间同步,
 

 3、主服务器配置(主从同步 192.168.131.20)

mysql -uroot -p123456;
进入数据库
mysql> grant replication slave on *.* to 'myslave'@'192.168.131.%' identified by 
'123456';
给从服务器提权,允许使用slave的身份复制master的所以数据库的所以表,并且指定密码为kya123;
mysql> flush privileges;
刷新权限表
查看master数据库状态
mysql> show master status;

4.从服务器配置文件(192.168.131.30      192.168.131.40)

slave1

vim /etc/my.cnf

server-id = 2

relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
relay_log_recovery=1

systemctl restart mysqld

mysql -uroot -p123456

change master to master_host='192.168.131.20',master_user='myslave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=902;

flush privileges;

start slave;

show slave status\G

slave2

 5、验证主从复制的效果

在master服务器上创建任意一个库 

 在两台从服务器上进行查看,是否可以看到同步来的数据

 

 查看两个服务器上slave状态时

mysql -uroot -p123456 -e 'show slave status\G'|grep -i 'yes'

 四、读写分离

1.原理

        读写分离就是只在主服务器上写,只在从服务器上读。基本的原理是让主数据库处理事务性查询,而从数据库处理 select 查询。数据库复制被用来把主数据库上事务性查询导致的变更同步到集群中的从数据库。

2.为什么要做读写分离

  • 因为数据库的“写”(写10000条数据可能要3分钟)操作是比较耗时的。
  • 但是数据库的“读”(读10000条数据可能只要5秒钟)。
  • 所以读写分离,解决的是,数据库的写入,影响了查询的效率

PS:什么时候用读写分离
数据库不一定要读写分离,如果程序使用数据库较多时,而更新少,查询(select)多的情况下会考虑使用。利用数据库主从同步,再通过读写分离可以分担数据库压力,提高性能。

3.实现方式

常见的 MySQL 读写分离分为以下两种:

1、基于程序代码内部实现

        在代码中根据 select、insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。
        但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

2、基于中间代理层实现

        代理一般位于客户端和服务器之间,代理服务器接到客户端请求后通过判断后转发到后端数据库,有以下代表性程序。
(1)MySQL-Proxy。MySQL-Proxy 为 MySQL 开源项目,通过其自带的 lua脚本进行SQL 判断。
(2)Atlas是由奇虎360的Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
(3)Amoeba。由陈思儒开发,作者曾就职于阿里巴巴。该程序由Java语言进行开发,阿里巴巴将其用于生产环境。但是它不支持事务和存储过程。

Amoeba:是一个以MySql为底层数据存储,并对应提供MySQL协议接口的proxy(代理),外号变形虫

  • 读取请求发送给从服务器是,采用轮询调度算法
  • amoeba使用的java语言编写,配置文件为xml
  • amoeba主要负责对外的一个代理IP
  • 访问这个IP时,发送的请求为“写”请求,则会转给主服务器
  • 当发送的请求为“读”时,会通过调度转发给从服务器,使用轮询算法,轮流分配给两台从服务器
  • amoeba可以视为调度器,如果主服务器挂掉(单点故障),则会有MHA解决这个问题
     

五、搭建MySQL 读写分离

1.环境准备

master192.168.131.20
slave1192.168.131.30
slave2192.168.131.40
amoeba192.168.131.50

2.时间同步,关闭防火墙,关闭核心防护

3.安装 Java 环境(  amoeba  192.168.131.50 )

因为 Amoeba 基于是 jdk1.5 开发的,所以官方推荐使用 jdk1.5 或 1.6 版本,高版本不建议使用。
将jdk-6u14-linux-x64.bin 和 amoeba-mysql-binary-2.2.0.tar.gz.0 上传到/opt目录下。

cd /opt/
cp jdk-6u14-linux-x64.bin /usr/local/

#因为此jdk 是bin文件(二进制可执行文件)所以直接执行即可
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin 
./jdk-6u14-linux-x64.bin			# 输入yes,按enter

 重命名

 添加环境变量

vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$AMOEBA_HOME/bin

加载
source /etc/profile
查看版本
java -version

安装 Amoeba软件

mkdir /usr/local/amoeba
tar zxvf /opt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
//如显示amoeba start|stop 说明安装成功

 配置 Amoeba读写分离,两个 Slave 读负载均衡

#先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问
grant all on *.* to 'test'@'192.168.131.%' identified by '123456';

另两台slave一样

#再回到amoeba服务器配置amoeba服务:
cd /usr/local/amoeba/conf/

cp amoeba.xml amoeba.xml.bak
vim amoeba.xml

 修改数据库配置文件

cp dbServers.xml dbServers.xml.bak
vim dbServers.xml

#23行注释
mysql schema:Mysql所有数据库信息(show databases)
<property name="schema">mysql</property>
#26行,amoeba访问三台mysql数据库的账户和密码(账户为test)
<property name="user">test</property>
#29行,修改访问数据库的密码
<property name="password">123.com</property>
#45行,修改数据库主服务器名/地址
<dbServer name="master"	parent="abstractServer">	
#48行,修改master服务器ip
<property name="ipAddress">192.168.226.129</property>
#52行修改从服务器名
<dbServer name="slave1"  parent="abstractServer">	
#55行修改从服务器地址
<property name="ipAddress">192.168.226.131</property>

#紧接复制52-57行,粘贴,添加第二台服务器名
<dbServer name="slave2"	parent="abstractServer">	
#修改第二台服务器IP
<property name="ipAddress">192.168.226.131</property>
#66行,修改多个服务器池(multiPoo1)的名称(修改为slaves)<dbServer name="slaves" virtual-"true">
#72行,添加两个从服务器的服务器名(slave1 slave2)<property name="poolNames">slave1,slave2</property>

 #第一个配置文件
1、amoeba.xml 
-》定义的是全局的配置
   ① 客户端的访问用户名与密码
   ② 后端服务器池的名字(read pool(slaves) 和write pool(master) )
2、dbServers.xml 
-》定义amoeba 访问数据库的相关配置
   ① amoeba 访问数据库使用什么用户名 test(和数据库之前grant的用户对应)
   ② amoeba 访问数据库使用什么密码   123.com (和数据库之前grant的密码对应)
   ③ read pool 和write pool 配置,分别为:
                                        write pool:master角色,ip为192.168.226.131 
                                        read  pool:slave1角色,ip为192.168.226.133
                                                    slave2角色,ip为192.168.226.128
   ④ 定义了读池的load balance 负载均衡的策略——》“1” RR轮询模式
                 名字:slaves ——》对应 slave1,slave2   

/usr/local/amoeba/bin/amoeba start &
#另开终端,查看是否启动 
netstat-natp | grep java
netstat-natp | grep 8066

 测试

下载 mariadb 客户端

yum -y install mariadb

systemctl stop firewalld
setenforce 0

#远程登录 amoeba 服务器
mysql -uamoeba -p123456 -h 192.168.131.50 -P8066

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值