MySQL主从复制及读写分离实际部署与验证

Posted 沉入深海

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL主从复制及读写分离实际部署与验证相关的知识,希望对你有一定的参考价值。

mysql主从复制及读写分离

前言:

在现网生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说 都是通过主从复制(Master-Slave)来同步数据,再通过读写分离来提升数据库并发负载能力的方案来进行部署与实施

一、主从复制

1.原理:


主MySQL服务器做的修改,都会通过dump线程写入自己的二进制日志(Binary log) ,然后 ,从MySQL服务器通过自己的I/O线程 连接主服务器,进行读取主服务器的二进制日志,备份写入到从服务器的中继日志(Relay log) 当中,然后从服务器通过SQL线程 ,将中继日志中的数据重放到自己的服务器中,复制完成。
a

这里有三个进程两个日志需要着重理解

  • dump线程:master服务器上,记录所有更改的线程。
  • I/O线程:从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程:从服务中读取中继日志写入自身变化的进程。
  • 二进制文件:主服务器上记录更新的日志
  • 中继日志文件:由主服务器上下载下来放在从服务器上记录的。

2.准备来做主从复制和读写分离的服务器如下:

服务器IP地址所需的软件
Master192.168.40.50ntp 、 mysql-boost-5.7.20.tar.gz
slave 1192.168.40.60ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
slave 2192.168.40.61ntp 、ntpdate 、 mysql-boost-5.7.20.tar.gz
amoeba192.168.40.80jdk-6u14-linux-x64.bin、amoeba-mysql-binary-2.2.0.tar.gz
client192.168.40.88mysql-boost-5.7.20.tar.gz

3.主从复制具体步骤

1.关闭所有服务器的防火墙

2.Mysql主从服务器都进行时间同步

在末行添加


开启服务

从服务器设置时间同步(192.168.40.60 和192.168.40.61)

yum -y install ntp ntpdate

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

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



3.主从服务器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 'one'@'192.168.40.%' IDENTIFIED BY '123123';			#给从服务器授权
FLUSH PRIVILEGES;

show master status\\G;

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



4.从服务器的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.40.50' , master_user='one',master_password='123123',master_log_file='master-bin.000001',master_log_pos=843;
				#配置同步,注意 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进程



5.Mysql主从复制的效果

我们可以看到在开启主从复制的时候,从服务器上能够查询到主服务器的数据库信息。

我们把slave1的主从关掉后,再去master服务器上进行数据库信息的增加。

再去slave1 上查看数据库内容,发现数据不同步。


我们再次打开从服务器的start slave,可以发现从服务器上的数据又从主服务器上同步过来了。

二、读写分离

1.原理:

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

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

2.读写分离的方案

2.1基于程序代码内部实现

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

2.2 基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。
(1) MySQL-Proxy。MySQL- -Proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是MySQL官方并不建议将MySQL- -Proxy 用到生产环境。
(2) Amoeba (变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用Java语言进行开发,阿里巴巴将其用于生产环境。它不支持事务和存储过程。
经过上述简单的比较,通过程序代码实现MySQL读写分离自然是一个不错的选择, 但是并不是所有的应用都适合在程序代码中实现读写分离,例如一些大型复杂的Java应用,如果在程序代码中实现读写分离对代码改动就较大。所以,像这种大型复杂的应用一般会考虑使用代理层来实现。

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

3.读写分离的拓扑图

4.操作思路

5.具体搭建mysql读写分离操作:

amoeba服务器

amoeba (192.168.40.80)

1 安装java jdk1.6环境

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


切换至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




2 安装amoeba软件


3 在主从服务器上的mysql分别授权


 这里是第二个账户我们用two表示,是amoeba登录主从的账户权限
 grant all on *.* to 'two'@'192.168.40.%' identified by '123123';




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

amoeba服务器:192.168.40.80

5 修改amoeba配置文件



6 修改数据库配置文件


cp dbServers.xml dbServers.xml.bak

vim dbServers.xml
#---------23注释掉--------------------------------------
作用:默认进入test库 以防mysql中没有test库时,会报错
<!-- mysql schema
<property name="schema">test</property>
-->
#---------26修改-----------------------------------------
<!-- mysql user -->
<property name="user">two</property>
#---------28-30去掉注释----------------------------------
<property name="password">123123</property>
#---------45修改,设置主服务器的名Master------------------
<dbServer name="master"  parent="abstractServer">
#---------48修改,设置主服务器的地址----------------------
<property name="ipAddress">192.168.40.50</property>
#---------52修改,设置从服务器的名slave1-----------------
<dbServer name="slave1"  parent="abstractServer">
#---------55修改,设置从服务器1的地址---------------------
<property name="ipAddress">192.168.40.60</property>
#---------58复制上面6行粘贴,设置从服务器2的名slave2和地址---
<dbServer name="slave2"  parent="abstractServer">
<property name="ipAddress">192.168.40.61</property>
#---------修改后的65或66修改-------------------------------------
<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






7 客户端操作

client: 192.168.40.88

使用yum快速安装MySQL虚拟客户端

8 在客户端上创建登录代理服务器amoeba访问mysql

yum install -y mysql mysql-server

mysql -u three -p123123 -h 192.168.40.80 -P8066

9读写分离测试:

测试思路:

  • 已知读写分离是通过slave服务器去读;修改,变更通过master服务器写入。
  • 因此我们断开主从,直接在master写入数据,再通过客户端直接读取数据库,看是否读取到变更。
  • 读不到则说明读取数据库不是直接从master,再在从服务器上写入数据,再在客户端查询是否变更,如果变更,则说明,客户端通过amoeba代理读取数据库是从slave上读取的,和master无关。





在slave1上插入数据

insert into aa values(11,'slave1');


在slave2上插入数据

insert into aa values(22,'slave2');

在master上插入数据

insert into aa values(33,'master33');


再在客户端写入

insert into aa values(44,'cilent');

我们通过在client上直接查询数据库可以看到,我在本地写入的44数据查不到,只能轮询查到slave上的数据。

  • 打开master进行查询,可以看到可以看到 client 上写入的数据,这里即可以说明 写入写到master里,读取是从slave上轮询读取。






    主从复制+读写分离成功

三、总结:

1.主从复制里三个线程两个日志

  • dump线程:master服务器上,记录所有更改的线程。
  • I/O线程:从服务器上用来读取、备份到从服务器上的中继日志的进程。
  • SQL线程:从服务中读取中继日志写入自身变化的进程。
  • 二进制文件:主服务器上记录更新的日志
  • 中继日志文件:由主服务器上下载下来放在从服务器上记录的。

2.读写分离

slave服务器提供读取功能
master服务器提供写入功能

优点

提高用户体验

以上是关于MySQL主从复制及读写分离实际部署与验证的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL的主从复制与读写分离

MySQL 数据库的主从复制与读写分离

MySQL主从复制与读写分离

MYSQL主从复制与读写分离

MySQL主从复制读写分离

mysql优化之主从复制与读写分离部署详细教程