查看: 1356|回复: 0

[Mysql数据库] MySQL主从复制与读写分离

发表于 2018-3-9 08:00:02

MySQL主从复制原理

MySQL支持的复制类型

1)基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。

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

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

2.复制的工作过程

image.png

1)在每个事务更新数据完成之前,master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务。

2)Slave将master的binary 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缓存中,所以中继日志的开销很小。

MySQL读写分离原理

读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。

image.png

目前较为常见的MySQL读写分离分为两种:

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

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

2)基于中间代理层实现

代理一般介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有以下代表性的程序。

(1)mysql_proxy。mysql_proxy是Mysql的一个开源项目,通过其自带的lua脚本进行sql判断。

(2)Atlas。是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。

(3)Amoeba。由阿里巴巴集团在职员工陈思儒使用序java语言进行开发,阿里巴巴集团将其用户生产环境下,但是它并不支持事物以及存数过程。

不是所有的应用都能够在基于程序代码中实现读写分离,像一些大型的java应用,如果在程序代码中实现读写分离对代码的改动就较大,所以,像这种应用一般会考虑使用代理层来实现,那么今天就使用Amoeba为例,完成主从复制和读写分离。

实验拓扑图

image.png

主机
操作系统
IP地址
主要软件
Master(主节点服务器)

CentOS 6.5 x86_64

192.168.1.30

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Slave1(从节点服务器1)
CentOS 6.5 x86_64192.168.1.40

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Slave2(从节点服务器2)
CentOS 6.5 x86_64192.168.1.50

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

Amoeba
CentOS 6.5 x86_64192.168.1.20

amoeba-mysql-binary-2.2.0.tar.gz

jdk-6u14-linux-x64.bin

客户机
CentOS 6.5 x86_64192.168.1.10

cmake-2.8.6.tar.gz

mysql-5.5.22.tar.gz

实验过程:

一、搭建MySQL主从复制

1.建立时间同步环境,在主节点上搭建时间同步服务器

(1)安装NTP

2018-02-04_131925.png

(2)配置NTP

2018-02-01_203428.png

2018-02-01_174218.png

(3)重启服务

2018-02-01_203715.png

2.在从节点上进行时间同步

2018-02-04_132500.png


2018-02-01_204204.png

3.在每台服务器上关闭iptables或者指定端口进行开放

2018-02-01_204230.png

4.安装MySQL 数据库(此步骤省略)

5.配置MySQL Master主服务器

(1)在/etc/my.cnf中修改或者增加下面内容

2018-02-01_204509.png

2018-02-01_174657.png

(2)重启MySQL服务

2018-02-01_204544.png

(3)登录MySQL程序,给从服务器以授权

2018-02-01_204444.png

2018-02-01_204643.png

6.配置从服务器

(1)在/etc/my.cnf中修改或者增加下面内容

2018-02-01_174759.png

(2)重启MySQL服务

(3)登录MySQL,配置同步

按主服务器结构更改下面命令中的master_log_file和master_log_pos参数

2018-02-01_205118.png

(4)启动同步

2018-02-01_205215.png

(5)查看Slave状态,确保以下两个值为YES

2018-02-01_205258.png

7.验证主从复制结果

(1)在主、从服务器上登录MySQL,查看现有数据库

2018-02-01_205434.png

(2)在主服务器新建数据库

2018-02-01_205655.png

(3)在从服务器上查看数据库,显示数据库

2018-02-01_205808.png

2018-02-01_205855.png

二、搭建MySQL读写分离

Amoeba(变形虫)项目开源框架于2008年发布一款Amoeba for MySQL软件。这个软件致力于MySQL的分布式数据库前端代理层,它主要为应用层访问MySQL的时候充当SQL路由功能,并具有负载均衡、高可用性、SQL过滤、读写分离、可路由相关的到目标数据库、可并发请求多台数据库。通过Amoeba能够完成多数据源的高可用、负载均衡、数据切片的功能.

在主机Amoeba上安装Java环境

2018-02-01_210450.png

2018-02-01_210509.png

2018-02-01_210857.png

2018-02-01_211015.png

修改/etc/profile文件

2018-02-01_211046.png

export JAVA_HOME=/usr/local/jdk1.6 //设置jdk的根目录

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jire/lib //将jdk的程序文件赋予CLASSPATH变量

export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin //将jdk的程序文件赋予PATH变量

export AMOEBA_HOME=/usr/local/amoeba //定义AMOEBA的根目录

export PATH=$PATH:$AMOEBA_HOME/bin 将amoeba的程序文件复制给PATH变量

2018-02-01_175025.png

执行该文件,使其生效

2018-02-04_132500.png

2018-02-01_211112.png

JAVA环境已配置成功

2.安装并配置Amoeba软件

2018-02-01_211210.png

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

(1)Master、Slave1、Slave2中开放权限给Amoeba访问

2018-02-01_211349.png

(2)编辑amoeba.xml配置文件

2018-02-01_211518.png

修改带下划线的内容

2018-02-01_211629.png


2018-02-01_211713.png

(3)编辑dbServers.xml配置文件

2018-02-01_211924.png

修改带下划线的内容

2018-02-01_175454.png


2018-02-01_175527.png


2018-02-01_175608.png

4.配置无误后,可以启动Amoeba软件,其默认端口为tcp 8066

2018-02-01_212129.png

2018-02-01_212250.png

4.编写防火墙规则

Amoeba服务器: iptables -I INPUT -p tcp --dport 8066 -j ACCEPT

master、slave1、slave2都需要开放3306端口入站:iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

5.测试

(1)通过代理访问MySQL

2018-02-01_212349.png

(2)在Master上创建一个表,插入一条数据,同步到从服务器

2018-02-01_212745.png

2018-02-01_212857.png

2018-02-01_213012.png

(3)关掉各从服务器的Slave功能,再插入语句

2018-02-01_212607.png

2018-02-01_213218.png

2018-02-01_213253.png

4.在客户机上测试读操作

2018-02-01_213713.png

5.测试写操作

(1)在客户机上插入一条语句

2018-02-01_213900.png

在客户机上查询不到刚插入的语句,只有在主服务器上才能看到,因为写操作只有master有,另外两台负责读取数据。

2018-02-01_214202.png




回复

使用道具 举报