MySQL主从复制与读写分离

前言:咱们前面搭建过LAMPLNMP,作过了web服务器群集和热备,web服务器坏了咱们是不怕了,可是咱们要知道,网站的数据有不少是存储在数据库里面的,例如注册的会员,发的文章,购物的订单等信息。固然咱们能够给数据库作备份,可是若是天天00:00作一次备份,那么若是在23:59数据丢失了,那么就会丢失一天的数据,有没有一种方法能实现实时备份,就是说有数据产生就当即备份,答案固然是有,也就是今天咱们要学习的mysql主从复制。有点相似于前面咱们学习过的rsync,可是不一样的是rsync是对磁盘文件作备份,而mysql主从复制是对数据库中的数据,语句作备份。另外读写分离主要是为了优化数据库。下面把实验给你们作一遍。java

 

1、mysql主从复制的工做原理mysql

一、mysq支持的复制类型web

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

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

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

 

二、复制的工做过程后端

blob.png

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

2)Slavemasterbinary log复制到其中继日志。首先slave开始一个工做线程(I/O),I/O线程在master上打开一个普通的链接,而后开始binlog  dump  processbinlog  dump  processmaster的二进制日志中读取事件,若是已经跟上master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。缓存

3)Sql  slave  threadsql从线程)处理该过程的最后一步,sql线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据一致,只要该线程与I/O线程保持一致,中继日志一般会位于os缓存中,因此中继日志的开销很小。安全

 

三、mysql读写分离原理

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

blob.png

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

 

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

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

 

2)基于中间代理层实现

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

1mysql_proxymysql_proxyMysql的一个开源项目,经过其自带的lua脚本进行sql判断。

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

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

 

不是全部的应用都可以在基于程序代码中实现读写分离,像一些大型的java应用,若是在程序代码中实现读写分离对代码的改动就较大,因此,像这种应用通常会考虑使用代理层来实现,那么今天就使用Amoeba为例,完成主从复制和读写分离。

 

2、实验案例:mysql主从复制和读写分离

一、实验拓扑

blob.png

二、实验环境

blob.png

amoeba上安装amoebajdk,在其它的机器上安装mysqlip地址如上图所示

 

3、主从复制的实验步骤

1、搭建时间NTP服务器,同步时间

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

blob.png

2)配置NTP时间服务器

Vim  /etc/ntp.conf

blob.png

3)重启ntpd服务

blob.png

4)在防火墙上开启例外

blob.png

5)在从节点上进行时间同步

blob.png

blob.png

在另外一台从服务器上执行相同操做

blob.png

二、mysql主和两台从服务器上安装mysql,这三台的安装方法彻底同样,我就以一台为例。

(1)安装mysql并建立程序用户

[root@centos4 ~]# tar  zxf cmake-2.8.6.tar.gz

[root@centos4 ~]# cd cmake-2.8.6

[root@centos4 cmake-2.8.12]# ./configure  &&gmake  &&gmake install

[root@centos4 ~]# tar zxf mysql-5.5.38.tar.gz

[root@centos4 ~]# cd mysql-5.5.38

[root@centos4 mysql-5.5.38]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all&& make &&make install

[root@centos4 mysql-5.5.38]# useradd  -M -s /sbin/nologin  mysql  -g  mysql

 

2)优化程序执行路径

[root@centos4 mysql-5.5.38]# echo "PATH=$PATH:/usr/local/mysql/bin">> /etc/profile

3)建立主配置文件

[root@centos4 mysql-5.5.38]# cp support-files/my-medium.cnf.sh  /etc/my.cnf

cp:是否覆盖"/etc/my.cnf"y

[root@centos4 mysql-5.5.38]#

 

4)建立服务脚本并添加为系统服务

[root@centos4 mysql-5.5.38]# cp support-files/mysql.server /etc/init.d/mysqld

[root@centos4 mysql-5.5.38]# chkconfig  --add mysqld

[root@centos4 mysql-5.5.38]# chkconfig  mysqld on

[root@centos4 mysql-5.5.38]# chmod  +x  /etc/init.d/mysqld

 

5)初始化数据库

[root@centos4 mysql-5.5.38]# /usr/local/mysql/scripts/mysql_install_db  --user=mysql  --basedir=/usr/local/mysql/  --datadir=/usr/local/mysql/data

[root@centos4 mysql-5.5.38]#

 

6)修改安装目录权限

[root@centos4 mysql-5.5.38]# chown -R mysql:mysql  /usr/local/mysql/

 

7)启动服务

[root@centos4 mysql-5.5.38]# service mysqld start

 

8)为用户root设置密码

[root@centos4 mysql-5.5.38]# mysqladmin  -u root -p password  '123-abc

默认没有密码,直接在确认旧密码处回车便可。

 

9)登陆mysql数据库

[root@centos4 mysql-5.5.38]# mysql -u root -p

 

三、配置mysql主服务器(MASTER

1)修改/etc/my.cnf配置文件

server-id       = 11   //mysql数据的惟一标示(不能重复)

log-slave-updates=true   //容许连级复制   (增长)

log-bin=master-bin     //二进制文件名(修改)

 

blob.png

2)重启MySQL服务

blob.png

3)登陆mysql程序,给从服务器受权

Mysql  -u  root  -p

blob.png

四、配置从服务器

1)/etc/my.cnf中修改如下内容

[root@centos3 ~]# vim /etc/my.cnf

server-id       = 22      //不能与其余实例重复

log-bin=mysql-bin       //二进制日志文件名 修改

relay-log=relay-log-bin     //复制过来的二进制文件名,增长

relay-log-index=slave-relay-bin.index  //中继日志存放的文件名称,增长

blob.png

注意server-id不能与主服务器相同,可是从服务器要相同。


 

2)重启mysql服务

blob.png

3)登陆mysql,配置同步

blob.png

blob.png

IP地址、用户、密码都master的数据库信息

4)启动同步

blob.png

5)查看slave状态,确保如下两个值为YES

blob.png

五、验证主从复制效果

1)在主服务器上新建数据库IT

blob.png

2)在从服务器上查看数据库,若是和主服务器相同,说明成功。

blob.png

blob.png

注意从服务器的配置和主服务器彻底同样,注意Id也要彻底同样

 

4、读写分离的实验步骤

一、安装java环境(amoeba软件基于java平台运行)

1)运行jdk

blob.png

 

安装过程当中提示(yes/no),咱们要选择yes安装

 

2)修改/etc/profile配置文件,增长如下配置

blob.png

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

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jir

e/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变量

blob.png

3)执行脚本

blob.png

二、安装并配置Amoeba软件

1)安装

blob.png

2)出现如下内容说明安装成功了

blob.png

三、配置amoeba读写分离,两个slave读负载均衡

1)在主从服务器上开放权限给amoeba(三台服务器上都作相同设置,这里我就以其中一台为例)

blob.png

2)修改amoeba.xml文件

注意:全部配置文件注释都是以 <!-- 内容 -->,再删除注释时请将内容也一并删除,最好是删除正行,可是有些时候只须要删除头和尾便可,里面的配置项是能够直接使用的。这个配置文件须要定义两个配置,第一是应用程序使用什么用户链接amoeba访问到后端的mysql数据库,第二个是定义默认写池以及读池。

 

Vi  /usr/local/conf/amoeba.xml

blob.png

接下来修改

<propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml

</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property> //定义默认的写池

<property name="writePool">master</property>  //定义写池

<property name="readPool">slaves</property> //定义读池,以上名字随便 <property name="needParse">true</property>

</queryRouter>

以下图所示:

接下来修改

<propertyname="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml

</property>

<property name="LRUMapSize">1500</property>

<property name="defaultPool">master</property> //定义默认的写池

<property name="writePool">master</property>  //定义写池

<property name="readPool">slaves</property> //定义读池,以上名字随便 <property name="needParse">true</property>

</queryRouter>

以下图所示:blob.png

3)编辑dbServers.xml文件

blob.png

blob.png

blob.png

1)启动amoeba软件

blob.png

blob.png

四、测试读写分离

1)打开一台客户端192.168.1.10,也须要安装mysql,做为测试机,可使用yum -y install mysql安装。

 

2)创建防火墙规则

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 8066 -j ACCEPT

masterslave1slave2都须要开放3306端口入站

[root@centos2 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

[root@centos2 ~]# service iptables save

iptables:将防火墙规则保存到 /etc/sysconfig/iptables:     [肯定]

[root@centos2 ~]#

另外两台从服务器也是同样的配置,或者直接将iptables stop

 

3)修改amoebaamoeba.xml配置文件的第一个8066改成3306以后创建一条防火墙规则为容许3306端口入站而且从新启动amoeba服务

<property name="port">3306</property> //11

blob.png

[root@centos1 ~]# amoeba stop

[root@centos1 ~]# amoeba start&

[root@centos1 ~]# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

在进行登陆amoeba

[root@web ~]# mysql -u amoeba -p123.abc -h 192.168.1.1

blob.png

4)在主服务器master上建立一个数据库WLZS,同步到各从服务器上,而后关掉从服务器的slave功能,再插入数据。

blob.png

5)查看在从服务器已经同步

blob.png

 

6)而后在主服务器上写入数据

blob.png

 

7)从服务器上也同步了表

blob.png

8)在两台从服务器上执行stop slave

 

9)分别在从服务器上写入不一样的数据

blob.png

blob.png

10)在客户端上查询

blob.png

11)在客户机上写入一条语句

blob.png


12)在客户端上查不到刚写入的数据,最终只有在master主服务器上才能看到,由于写操做只有master有,另外两台负责读取数据。

blob.png

blob.png

总结:到此为止主从复制和读写分离都已完成,写操做都在主服务器上,实现数据的统一更新,从服务器只负责读取,负载均衡分担了数据库压力。其实在咱们生活中有不少主从复制的应用,例若有不少连锁超市,总部负责产品的名称和价格等信息的录入,而全部的超市都会同步更新,作到了统一价格。而像淘宝的服务器,主要是为了分担负载,提高查询的性能,又快到双11了,当天那么多人同时购物,若是只有一台mysql定是不够的,刚好今天使用的软件amoeba也是阿里巴巴本身员工开发出来的,通过淘宝这么多用户的验证,效果不用怀疑。最后补充一句,Mysql主从复制与咱们之前学习的sqlserver复制是同样的做用。

相关文章
相关标签/搜索