MySQL主从复制与读写分离

目录

一、什么是读写分离

 二、为什么要读写分离

三、 什么时候要读写分离

四、主从复制与读写分离

五、mysql支持的复制类型

 六、主从复制的工作过程

七、 MySQL主从复制延迟

八、 MySQL读写分离原理

 九、目前较为常见的MySQL读写分离分为以下两种

1)基于程序代码内部实现.

 2)基于中间代理层实现

 环境配置

 搭建 MySQL 主从复制

1、Mysql主从服务器时间同步

 2、主服务器的mysql配置

 3、从服务器的mysql配置

 4、验证主从复制效果

 搭建 MySQL 读写分离

1、安装 Java 环境

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

3、测试读写分离


一、什么是读写分离

读写分离,基本的原理是让主数据库处理事务性增、改、删操作( INSERT、UPDATE、DELETE) ,而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库

 二、为什么要读写分离

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

三、 什么时候要读写分离

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

四、主从复制与读写分离

在实际的生产环境中,对数据库的读和写都在同一个数据库服务器中,是不能满足实际需求的。无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,通过主从复制的方式来同步数据,再通过读写分离来提升数据库的并发负载能力。有点类似于rsync,但是不同的是rsync是对磁盘文件做备份,而mysq1 主从复制是对数据库中的数据、语句做备份


五、mysql支持的复制类型

STATEMENT:基于语句的复制
在服务器上执行SQL语句,在从服务器上执行相同的语句,MySQL默认采用基于语句的复制,执行效率高

ROW:基于行的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍

MIXED:混合类型的复制
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制

 六、主从复制的工作过程

主节点会开启dump线程,从节点会开启I/O线程,SQL线程

主数据库用来增删改,从数据库负责查的工作,主节点负责将改变的数据记录在二进制日志中,而从节点会有一定的时间间隔来探查主节点的二进制日志是否发生变化,若改变则会开始一个I/O线程请求主节点的二进制事件,并且主节点还会为I/O线程启动dump线程,保存在从节点的中继日志中,从节点还会启动SQL线程从中继日志中读取二进制日志,在本地重放,解析成SQL语句来挨个执行,使其数据和主节点保持一致,之后I/O线程和SQL线程会进入睡眠状态,等待下一次唤醒

七、 MySQL主从复制延迟

1.master服务器高并发,形成大量事务
2.网络延迟
3.主从硬件设备导致
cpu主频、内存io、硬盘io
4.从库使用高性能主机。包括cpu强悍、内存加大。避免使用虚拟云主机,使用物理主机,这样提升了i/o方面性。
从库使用SSD磁盘。
网络优化,避免跨机房实现同步

八、 MySQL读写分离原理

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

 

 九、目前较为常见的MySQL读写分离分为以下两种

1)基于程序代码内部实现.

在代码中根据select、 insert 进行路由分类,这类方法也是目前生产环境应用最广泛的。
优点是性能较好,因为在程序代码中实现,不需要增加额外的设备为硬件开支;缺点是需要开发人员来实现,运维人员无从下手

但是并不是所有的应用都适合在程序代码中实现读写分离,像一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。

 2)基于中间代理层实现

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

由于使用MySQL Proxy 需要写大量的Lua脚木,这些Lua并不是现成的,而是需要自己去写。这对于并不熟悉MySQL Proxy内置变量和MySQLProtocol的人来说是非常困难的

Amoeba是一个非常容易使用、可移植性非常强的软件。因此它在生产环境中被广泛应用于数据库的代理层

 环境配置

主机操作系统IP地址所需工具/软件/安装包
MasterCentOS7192.168.184.10ntp 、 mysql-boost-5.7.20.tar.gz
AmoebaCentOS7192.168.184.20jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
Slave1CentOS7192.168.184.30ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
Slave2CentOS7192.168.184.40ntp 、ntpdate 、mysql-boost-5.7.20.tar.gz
客户端CentOS7192.168.184.50——
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

 搭建 MySQL 主从复制

1、Mysql主从服务器时间同步

主服务器设置(192.168.184.10)
yum -y install ntp

vim /etc/ntp.conf

末尾添加
server 127.127.184.0							#设置本地是时钟源,注意修改网段
fudge 127.127.184.0 stratum 8					#设置时间层级为8(限制在15内)

service ntpd start

 

 

从服务器设置(192.168.184.30)、(192.168.184.40)
yum -y install ntp ntpdate

service ntpd start
/usr/sbin/ntpdate 192.168.184.10			#进行时间同步,指向Master服务器IP

crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.184.10

 

 2、主服务器的mysql配置

vim /etc/my.cnf
server-id = 1
log-bin=master-bin							#添加,主服务器开启二进制日志
log-slave-updates=true						#添加,允许从服务器更新二进制日志

systemctl restart mysqld

mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.184.%' IDENTIFIED BY '123123';			#给从服务器授权
FLUSH PRIVILEGES;

show master status;

#File 列显示日志名,Fosition 列显示偏移量

 

 

 3、从服务器的mysql配置

vim /etc/my.cnf
server-id = 2						#修改,注意id与Master的不同,两个Slave的id也要不同
relay-log=relay-log-bin						#添加,开启中继日志,从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index		#添加,定义中继日志文件的位置和名称

systemctl restart mysqld

mysql -u root -p
change master to master_host='192.168.184.10' , master_user='myslave',master_password='123123',master_log_file='master-bin.000002',master_log_pos=604;
				#配置同步,注意 master_log_file 和 master_log_pos 的值要与Master查询的一致,这里的是例子,每个人的都不一样

start slave;						#启动同步,如有报错执行 reset slave;
show slave status\G					#查看 Slave 状态
//确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes				#负责与主机的io通信
Slave_SQL_Running: Yes				#负责自己的slave mysql进程

 

 

 

 一般 Slave_IO_Running: No 的可能性:
1、网络不通
2、my.cnf配置有问题
3、密码、file文件名、pos偏移量不对
4、防火墙没有关闭

 4、验证主从复制效果

主服务器上进入执行 create database db_test;

 去从服务器上查看 show databases;

 搭建 MySQL 读写分离

1、安装 Java 环境

因为 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/

cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin 
./jdk-6u14-linux-x64.bin
按空格到最后一行
按yes,按enter

mv jdk1.6.0_14/ /usr/local/jdk1.6

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 说明安装成功

 

 

 

 

 

 

 ameba安装包

 

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

先在Master、Slave1、Slave2 的mysql上开放权限给 Amoeba 访问

grant all on *.* to test@'192.168.184.%' identified by '123.com';

主服务器 

 从服务器

 从服务器

 amoeba服务器配置amoeba服务

cd /usr/local/amoeba/conf/

cp amoeba.xml amoeba.xml.bak
vim 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>

cp dbServers.xml dbServers.xml.bak
vim dbServers.xml  #修改数据库配置文件
--23行--注释掉 作用:默认进入test库 以防mysq1中没有test库时, 会报错
<!-- <property name= "schema">test</property> -->
--26--修改
<property name="user">test</property>
--28-30--去掉注释,然后再把28行注释或删除
<property name="password"> 123.com</property>
--45--修改, 设置主服务器的名Master
<dbServer name="master" parent="abstractServer">
--48--修改,设置主服务器的地址
<property name="ipAddress">192.184.184.10</property>
--52--修改, 设置从服务器的名slave1
<dbServer name="slave1" parent="abstractServer">
--55--修改,设置从服务器1的地址
<property name="ipAddress">192.168.80.11</property>
--58--复制.上面6行粘贴,设置从服务器2的名slave2和地址
<dbServer name="slave2" parent="abstractServer">
<property name="ipAddress">192.168.184.40</property>
--65行--修改
<dbServer name="slaves" virtual="true">
--71行--修改
<property name="poolNames">slave1,slave2</property>
/usr/local/amoeba/bin/amoeba start&
#启动Amoeba软件,按ctrl+c 返回
netstat -anpt | grep java
#查看8066端口是否开启,默认端口为TCP 8066

3、测试读写分离

在客户端服务器上进行测试:
使用yum快速安装MySQL虚拟客户端

yum install -y mysql mysql-server

mysql -u amoeba -p123123 -h 192.168.184.20 -P8066

通过amoeba服务器代理访问mysql ,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从服务器

----测试读写分离----
yum install -y mariadb-server mariadb
systemctl start mariadb.service

在客户端服务器上测试:
mysql -u amoeba -p123456 -h 192. 168.184.20 -P8066
//通过amoeba服务器代理访问mysql,在通过客户端连接mysql后写入的数据只有主服务会记录,然后同步给从--从服务器
在主服务器上:
use db_test;
create table test (id int (10),name varchar (10),address varchar(20) );

在两台从服务器上:
stop slave;   #关闭同步
use db_test;
/ /在slave1上:
insert into test values('1','zhangsan','this is slave1') ;

//在slave2上:
insert into test values('2','lisi','this is slave2');

//在主服务器上:
insert into test values('3', 'wangwu', 'this is master');

//在客户端服务器上:
use db_test;
select * from test;
//客户端会分别向slave1和slave2读取数据,显示的只有在两个从服务器上添加的数据,没有在主服务器.上添加的数据

insert into test values('4','qianqi','this is  client') ;
//只有主服务器上有此数据

//在两个从服务器上执行startslave;即可实现同步在主服务器上添加的数据
start slave;

再在两个从服务器上执行 start slave; 即可实现同步在主服务器上添加的数据
start slave;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值