您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > mysql主从复制以及读写分离
mysql主从复制以及读写分离之前我们已经对LNMP平台的Nginx做过了负载均衡以及高可用的部署,今天我们就通过一些技术来提升数据的高可用以及数据库性能的提升。一、mysql主从复制首先我们先来看一下主从复制能够解决什么问题。1、数据库简介在现在的世界发展的道路上,数据已经是必不可缺的一部分了,对数据的安全性,也成为了现在的一个值得探讨的问题。那有什么方法能够解决数据的安全性呢?我们通过mysql本身的功能来实现数据的备份,之前我们也对数据可的数据进行了一些备份,但是那些都不是很好的解决办法,因为无论之前的导入导出也好,还是直接对数据库所在目录直接进行拷贝,这些技术不能保证实时性,而我们今天所介绍的就是能够对数据库实现热备份,从而提高数据库的安全性——mysql主从复制2、主从复制原理1)mysql支持的复制类型(1)基于语句的复制。在主服务器上执行的sql语句,在从服务器上执行同样的语句。mysql默认使用基于语句的复制,效率比其他方式较高。(2)基于行的复制,把改变的内容复制过去,而不是在从服务器上在执行一遍。(3)混合复制类型,默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。2)复制的工作过程mysql复制的工作过程如下所示:图1mysql复制的工作过程(1)在每个事务跟新完成之前。master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务。(2)Slave将Master的Binarylog复制到其中继日志。首先,slave打开一个工作线程——I/O线程,I/O线程在Master上打开一个网络连接,然后开始Binlogdumpprocess。Binlogdumpprocess从Master的二进制日志中读取事件,如果已经成功链接到Master,他会进行睡眠并等待Master产生新的事件。I/O线程将这些事件写入中继日志(3)SQLslavethread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新Slave的数据,使其与Master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志开销很小。以上就是mysql主从复制的原理,Slave可以有多台,主服务也可以有多台,可以使用keepalived做HA的高可用性,建议mysql的数据不要只放在共享存储上,而是每个Slave都拥有一个单独的存储存放数据。复制的过程中有一个很重要的限制,即复制在Slave上是串行化的,也就是说Master上的并行更新操作不能在Slave上并行操作,也就是不能同时执行。3、mysql读写分离原理简单来说就是实现读与写的分离(图2)就是读在从服务器上读取数据,在写数据的时候是写在主服务上的。基本原理就是让主服务器处理一些简单的事务性查询,而从服务器处理select查询、数据库复制被用来把事务性查询导致的变更同步到集群的从数据库中。图2目前较为常见的Mysql读写分离分为两种1)基于程序代码内部实现在代码中根据select、insert进行路由分类,这类方法也是目前生产环境下应用最广泛的。优点是性能较好,因为程序在代码中实现,不需要增加额外的硬件开支:缺点是需要开发人员来实现,运维人员无从下手。2)基于中间代理层实现代理一般介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有以下代表性的程序。(1)mysql_proxy。mysql_proxy是Mysql的一个开源项目,通过其自带的lua脚本进行sql判断,虽然是mysql的官方产品,但是mysql官方并不推荐将其部署在生产环境下。(2)Atlas。是由Qihoo360,Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程(3)Moeeba。由阿里巴巴集团在职员工陈思儒使用序java语言进行开发,阿里巴巴集团将其用户生产环境下,但是他并不支持事物以及存数过程。我们今天所演示的就是amoeba这款软件。版本2.2.0二、案例环境本案例使用5台服务器搭建,具体拓扑如图3所示图3主机操作系统IP地址主要软件MasterCentOS6.5x86_64192.168.1.2cmake-2.8.6.tar.gzmysql-5.5.22.tar.gzSlave1CentOS6.5x86_64192.168.1.3cmake-2.8.6.tar.gzmysql-5.5.22.tar.gzSlave2CentOS6.5x86_64192.168.1.4cmake-2.8.6.tar.gzmysql-5.5.22.tar.gzAmoebaCentOS6.5x86_64192.168.1.1amoeba-mysql-binary-2.2.0.tar.gzjdk-6u14-linux-x64.bin客户端CentOS6.5x86_64192.168.1.5以上就是今天的图扑环境,如果需要解决单点故障的话,可以使用前面所讲的keepalived实现,只不过多加了几台计算机而已。Master也可以使用keepalived去避免单点故障,之前已经讲过了,这里就不在过多的进行讲解了。1、配置时间同步由于主从复制的时候时间必须要保持一致,这是我们可以再master作为时间同步服务器为salve提供时间同步。我们使用rpm方式安装的ntp软件包,采用yum的方式安装[root@centos2~]#yum-yinstallntp[root@centos2~]#vim/etc/ntp.confserver127.127.1.0fudge127.127.1.0stratum8//这两行在任意地方添加[root@centos2~]#iptables-IINPUT-pudp--dport123-jACCEPT//ntp默认使用udp的123号端口[root@centos2~]#servicentpdstart//启动ntp服务客户端同步时间如果没有ntpdate命令可以使用yum安装ntpdate软件包slave1[root@centos3~]#ntpdate192.168.1.2之后的服务器一样。2、安装部署mysql服务器这里我以slave2服务器为例演示安装mysql服务器,masterslave1与slave2安装一样。slave2:(1)安装mysql并创建程序用户[root@centos4cmake-2.8.12]#./configure&&gmake&&gmakeinstall[root@centos4~]#tarzxfmysql-5.5.38.tar.gz[root@centos4~]#cdmysql-5.5.38[root@centos4mysql-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&&makeinstall[root@centos4mysql-5.5.38]#useradd-M-s/sbin/nologinmysql(2)优化程序执行路径[root@centos4mysql-5.5.38]#echo\PATH=$PATH:/usr/local/mysql/bin/etc/profile(3)创建主配置文件[root@centos4mysql-5.5.38]#cpsupport-files/my-medium.cnf.sh/etc/my.cnfcp:是否覆盖/etc/my.cnf?y[root@centos4mysql-5.5.38]#(4)创建服务脚本并添加为系统服务[root@centos4mysql-5.5.38]#cpsupport-files/mysql.server/etc/init.d/mysqld[root@centos4mysql-5.5.38]#[root@centos4mysql-5.5.38]#chkconfig--addmysqld[root@centos4mysql-5.5.38]#chkconfigmysqldon[root@centos4mysql-5.5.38]#chmod+x/etc/init.d/mysql(5)初始化数据库[root@centos4mysql-5.5.38]#/usr/local/mysql/scripts/mysql_install_db--user=mysql--basedir=/usr/local/mysql/--datadir=/usr/local/mysql/[root@centos4mysql-5.5.38]#(6)修改安装目录权限[root@centos4mysql-5.5.38]#chown-Rmysql:mysql/usr/local/mysql/(7)启动服务[root@centos4mysql-5.5.38]#servicemysqldstart(8)为用户root设置密码[root@centos4mysql-5.5.38]#mysqladmin-uroot-ppassword'123.abc'默认没有密码,直接在确认旧密码处回车即可。(9)登录mysql数据库[root@centos4mysql-5.5.38]#mysql-uroot-p123.abc3、配置master服务器(1)修改/etc/my.cnf主配置文件[root@centos2~]#vim/etc/my.cnfserver-id=1//mysql数据的唯一标示(不能重复)log-slave-updates=true//允许连级复制(增加)log-bin=master-bin//二进制文件名(修改)(2)重启mysql服务[root@centos2~]#servicemysqldrestart(3)登录mysql数据库[root@centos2~]#mysql-uroot-p123.abc(4)建立授权用户赋予对所有库和所有表的replication和slave权限,用户为myslave来源为这个网段的任意IP密码123.abc//这个用户是从数据库用来复制二进制文件的用户mysqlgrantreplicationslaveon*.*tomyslave@'192.168.1.%'identifiedby'123.abc';(5)查看数据库的二进制文件名和段偏移量的值图4(6)退出mysql数据库mysqlexitBye(7)建立防火墙规则root@centos2~]#iptables-IINPUT-ptcp--dport3306-jACCEPT//允许目标端口为3306的入站4、配置从服务器(slave1)(1)修改/etc/my.cnf[root@centos3~]#vim/etc/my.cnfserver-id=2//不能与其他实例重复log-bin=mysql-bin//二进制日志文件名relay-log=relay-log-bin//复制过来的二进制文件名relay-log-index=slave-relay-bin.index//中继日志存放的文件名称(2)重新启动mysqld服务[root@centos3~]#servicemysqldrestart(3)登录mysql数据库[root@centos3~]#mysql-uroot-p123.abc(4)配置mysql数据同步mysqlchangemastertomaster_host='192.168.1
本文标题:mysql主从复制以及读写分离
链接地址:https://www.777doc.com/doc-3868619 .html