版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章
数据库集群3.1数据库简介3.2数据库集群简介3.3数据库集群架构3.4数据库主从复制实战3.5数据库读写分离实战熟悉常用的数据库熟悉常用数据库集群架构掌握数据库主从复制的搭建方法掌握数据库读写分离的部署方式引言众所周知,网站数据安全和7x24不宕机是运维人员的核心任务,而网站数据安全离不开数据库集群的构建。使用单机MySQL存储网站数据读写速度快,适用于低并发的情况。但是随着用户的激增,数据的量级也是呈指数的增长,从GB到TB到PB,大量的读写请求会使单节点的MySQL硬盘无法承受,一些大规模的网站则会构建数据库集群来提高数据库的安全性和可靠性。本章将详细讲解数据库集群相关知识。3.1数据库简介数据库定义数据库的类型MySQL简介数据库(Database)是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储及管理数据的仓库,可视为电子化的文件柜,用户可以对文件中的数据进行新增、查询、更新、删除等操作。早期比较受欢迎的数据库模型有三种,分别为层次式数据库、网络式数据库、关系型数据库。而现代的互联网世界中,最常用的数据库模型只有两种,关系型数据库和非关系型数据库。3.1
数据库简介1.关系型数据库虽然网络式数据库和层次式数据库已经很好地解决了数据的集中和共享问题,但是在数据独立和抽象级别上仍有很大欠缺。用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径。而关系型数据库就可以比较好地解决这些问题。关系型数据库模型是把复杂的数据结构归结为简单的二元关系(即二维表格形式)。在关系型数据库中,对数据的操作几乎全部建立在一个或多个关系表格上,通过这些关联的表格分类、合并、连接或选取等运算来实现数据的管理。2.非关系型数据库非关系型数据库也被称为NoSQL数据库,NoSQL的本意是“NotOnlySQL”,指的是非关系型数据库,而不是“NOSQL”的意思,因此,NoSQL的产生并不是要彻底否定关系型数据库,而是作为传统数据库的一个有效补充。NoSQL数据库在特定的场景下可以发挥难以想象的高效率和高性能。3.1
数据库简介随着Web2.0网站的兴起,传统的关系型数据库在应付Web2.0网站,特别是对于规模日益扩大,数据越来越海量,拥有超大规模和高并发的类似微博、微信、SNS等的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,例如:传统的关系型数据库IO瓶颈、性能瓶颈都难以有效突破,于是开始出现了大批针对特定场景,以高性能和使用便利为目的功能特异化的数据库产品。NoSQL(非关系型)类的数据库在就是这样的情景中诞生并得到了非常迅速的发展。关系型数据库是目前最受欢迎的数据库管理系统,技术比较成熟,尤其是MySQL数据库,很多中小型企业为了节省成本都会选择它。下面来认识一下企业中常用的数据库。常用的:SQLServer、Oracle、MySQL、Redis、MongoDB等。不常用的:DB2、Informix、Sybase、PostgreSQL等。由于篇幅有限,这里只重点介绍最常用的MySQL。3.1
数据库简介MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件之一。MySQL是一种关系型数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都会选择MySQL作为网站数据库。3.1
数据库简介3.1数据库集群简介数据库集群的概念数据库集群与分布式数据库系统的区别数据库集群,顾名思义,配置若干(两台及以上)台数据库服务器组成一个系统,作为一个整体为客户端提供透明的数据服务。大量读写请求来临时,数据库集群可以将请求分发给不同的集群节点,这样的处理使得数据的读写速度更快,也更好地解决了高并发情况下单节点数据库的性能问题。数据库集群技术不但为数据提供了安全性,增加了冗余特性,还避免了单点故障对网站系统产生的巨大损失和负面影响,保障了系统的稳定性。数据库集群和分布式数据库系统都可以解决更高并发量的问题,以及实现容灾、数据备份,提高数据信息的安全性。分布式数据库是指利用网络将分散的数据存储节点连接起来组成一个整体提供数据库服务。用户通过分布式数据库系统的就近访问原则,可以访问就近的数据库节点,数据库各节点之间能够同步数据传输,实现了数据的一致性。3.2
数据库集群简介数据库集群与分布式数据库系统的对比图。3.2
数据库集群简介数据库集群与分布式数据库系统的区别。(1)数据库可以具有多个相似或相同的数据集,分布式数据库系统一般具有完全不同的数据集。(2)数据库集群的各节点使用相同的操作系统、数据库版本,以及相同版本的补丁包,而分布式数据库系统中各节点可以使用不同的操作系统和不同版本的数据库系统。(3)数据库集群一般情况下是建立在高速局域网内,而分布式数据库系统还可以建立在异地远程网络。3.3数据库集群架构主从复制多级复制双主复制多元复制主从复制架构,顾名思义,分为主数据库和从数据库。从数据库要求与主数据库有完全相同数据库环境,当主数据库实时更新数据信息时,主数据库会将更新信息写入一个二进制文件binlog中,然后发送到从数据库中。从服务器成功连接主服务器后,读取主服务器的二进制文件,并执行相应的操作直至最后一次更新的位置,然后等待主服务器通知新的更新。数据的完整性依赖于主库保存的binlog,比如主库宕机了,还可以通过binlog把丢失的数据同步到从库中,以加强数据的安全性。3.3
数据库集群架构3.3.1
主从复制一主多从复制的逻辑图主从复制的主要作用就是做数据的热备,主数据库一般为实时的业务数据库,从数据库作为后备数据库。当主库故障后,可以切换为从库继续工作,有效避免了数据的丢失。在主库读取请求压力非常大的情况下,有3种方法可以有效解决。第1种是提高主库的配置,主库执行读、写功能,从库进行备份,避免备份期间影响主服务器服务,确保数据安全;第2种方法是在一主多从的复制架构中实现读写分离,使用主库实现写入数据,从库执行查询工作(即读功能),使数据库能支撑更大的并发量;第3种是把大量实时性要求不高的读请求利用负载均衡分发到多个从库上,把实时性要求很高的请求分发到主库去读,从而降低主库的读取压力。但是需要注意,由于主从复制是异步复制,会产生主从延迟的问题。3.3
数据库集群架构3.3.1
主从复制一主多从的复制架构可以解决大部分请求压力较大的场景需求,随着业务量的增大,主库发送binlog日志到从库的I/O访问频率过高,网络压力也会随着增大,这时多级复制架构可以解决主库额外的I/O线程压力和网络压力。3.3
数据库集群架构3.3.2
多级复制MySQL的多级复制逻辑图多级复制结构与一主多从结构相比,添加了一个二级主库Master2,那么主库Master1只需给一个库Master2发送二进制日志,降低了主库的压力。3.3
数据库集群架构3.3.2
多级复制多级复制结构中不难看出,主库Master1的数据信息需要经过两次复制才能到达Slave,那么这个过程的延迟会比一主多从复制的延迟还严重。针对上述问题,可以把二级主库Master2数据表的引擎设置为BlackHole,来有效减少延迟问题。BlackHole引擎又称为“黑洞”引擎,使用此引擎的表格永远为空,数据并不会写入磁盘中,而对数据的增、删、改等操作会被记录到binlog中,示例代码。mysql>CREATETABLEuser( 'id'intNOTNULLAUTO_INCREMENTPRIMARYKEY, 'name'varchar(20)NOTNULLDEFAULT'', 'age'tinyintunsignedNOTNULLDEFAULT0)ENGINE=BLACKHOLEcharset=utf8;QueryOK,0rowsaffected(0.02sec)mysql>INSERTINTO'user'('name','age')values("qianfeng","18");QueryOK,1rowsaffected(0.02sec)mysql>SELECT*FROMuser;Emptyset(0.00sec)表中的数据为空。设置二级主库使用BlackHole引擎后,二级主库并不负责读写等请求,只是把binlog日志发送到从库Slave中。3.3
数据库集群架构3.3.3
双主复制主主复制逻辑图双主复制(DualMaster)又称为主主复制,即两个主数据库,且两个主库互为主从。主主复制架构常用于数据库管理员做维护时需要主从切换的场景,从而避免了重复搭建从库的麻烦。3.3
数据库集群架构3.3.3
双主复制双主架构联合主从复制主主架构可以与主从复制联合一起使用,如在Master2库下配置从库,如此一来大大减少了主库的读取压力和重建从库的额外压力。MySQL5.7版本开始支持多源(Multi-Source)复制,实现了多主一从复制,将多个数据库(Master)的数据集中发送到1台从库(Slave)上。多源复制结构要求至少包含两个主库和一个从库,常被用于复杂的业务需求,不但可以支撑OLTP(联机事务处理),又能够满足OLAP(联机分析处理)。3.3
数据库集群架构3.3.4
多源复制多源复制的逻辑图使用多源复制可以将多个服务器的数据信息备份到单个服务器,数据集中存放节省了服务器等软硬件成本以及避免了资源的浪费。通过多源复制实现了将多个库表合并,汇聚数据,便于数据集中统计、分析和操作。3.4数据库主从复制实战MySQL主从复制原理实验环境部署MySQL部署主从复制集群测试数据同步MySQL的主从复制是一个异步的复制过程,数据将从一个MySQL数据库(Master)复制到另外一个MySQL数据库(Slave),是由三个线程参与完成了在Master与Slave之间数据复制的过程。其中有两个线程(SQL线程和I/O线程)在Slave端,另外一个线程(I/O线程)在Master端。要实现MySQL的主从复制,首先必须打开Master端的binlog记录功能,否则就无法实现。因为整个复制过程实际上就是Slave端从Master端获取binlog日志,然后再在Slave上以相同的顺序执行获取的binlog日志中所记录的各种SQL操作。要打开MySQL的binlog记录功能,可以通过在MySQL的配置文件f中的mysqld模块增加log_bin参数来实现。3.4
数据库主从复制实战3.4.1
MySQL主从复制原理将主从复制的过程总结为5步,具体如下所示。(1)主库把数据更改(DDL、DML、DCL)事件记录到二进制日志(BinaryLog)中。(2)从库向主库发起连接,主库和从库连接。(3)这时,主库创建一个binlogdumpthread线程,将二进制日志的内容发送给从库。(4)从库启动后,创建I/O线程读取主库上的日志并复制到自己的中继日志(RelayLog)中。(5)从库继续创建SQL线程读取中继日志中的内容,将其重放到从库数据库之上。3.4
数据库主从复制实战3.4.1
MySQL主从复制原理MySQL主从复制的工作过程准备2台VM虚拟机(或者物理服务器),一台做主数据库(master1),一台从数据库(slave1),具体如表。3.4
数据库主从复制实战3.4.2
实验环境配置项主服务器从服务器HostNamemaster1slave1IP4445ServerID144145版本号MySQL5.7MySQL5.7说明:ServerID的取值范围为1~65535,并且每台主机的ServerID不能相同,本例中以服务器IP地址的最后两位作为ServerID。操作系统版本CentOS7.6,提前关闭防火墙及SELinux(过程不再赘述)。3.4
数据库主从复制实战3.4.2
实验环境1.在实验开始前,建议为这2台服务器互相做域名解析,便于通信。域名解析可以使用修改本地hosts文件的方式,也可以使用DNS服务器解析。这里采取修改hosts文件的方式,分别在2台服务器的/etc/hosts文件中添加以下代码。44master145slave1做完域名解析之后,可以使用ping命令进行检测,若无丢包现象,说明解析成功。2.为了便于读者观察实验操作对象,将主从服务器的主机名修改为master1、slave1,可以省略此步。修改主机名。[root@qfedu~]#hostnamectlset-hostname新的主机名例如,修改主服务器的主机名为qfedu-master1。[root@qfedu~]#hostnamectlset-hostnamemaster13.为了保证各服务器的时间一致,对服务器进行时间校对。[root@qfedu~]#ntpdate-u1本书将以目前比较成熟的MySQL数据库为例来展示数据库优化方法的应用。在虚拟机上部署MySQL数据库有两种方式,一种是直接使用Yum命令下载安装,另一种是使用源码包安装。两种方式各有优缺点,详情如表。3.4
数据库主从复制实战3.4.3
部署MySQLMySQL安装方式Yum安装源码包安装优点可以自动处理依赖关系,无需编译,安装速度快。十分灵活,可以根据需求自行调整组件或其他参数。缺点无法进行MySQL的个性化设置,不可以随意增加或删除一些组件。安装速度慢,且安装过程复杂极易出错,有可能会因为对应用环境把握失误、参数设置不当,而使得系统性能更差。对于初学者,推荐采用Yum的方式进行实验。因篇幅有限,本书只介绍Yum安装的方式,有兴趣使用源码包安装MySQL的读者可以参考官方文档自行实验。(1)进入MySQL官网。CentOS7默认的仓库中没有MySQL的镜像源,首先需要从官方网站()下载MySQL的镜像仓库文件来更新Yum仓库。Yum仓库中存有MySQL的镜像源之后,再下载并安装MySQL,之后初始化MySQL进行使用。1.配置MySQL镜像源3.4
数据库主从复制实战3.4.3
部署MySQL(2)单击上图中的“DOWNLOADS”标签,进入MySQL下载页。(4)单击MySQL社区版下载链接,进入MySQL社区版下载页。(3)进入MySQL下载页之后,会看到MySQL性能简介。继续下拉该页面,可以看到MySQL社区版的下载链接。3.4
数据库主从复制实战3.4.3
部署MySQL企业版主要作为商用,闭源收费。社区版与企业版功能并无太大差异,且开源免费,这里选择社区版进行实验。(6)单击该版本对应的Download按钮进入确认下载页。(5)单击图中的“MySQLYumRepository”链接,进入到MySQL仓库源的版本选择页。3.4
数据库主从复制实战3.4.3
部署MySQL使用的是CentOS7进行实验,所以在此处选择“RedHatEnterpriseLinux7/OracleLinux7(ArchitectureIndependent),RPMPackage”进行实验3.4
数据库主从复制实战3.4.3
部署MySQL(7)鼠标右键单击页面下方“Nothanks,juststartmydownload.”链接,选择复制链接地址,再返回到虚拟机终端,使用wget命令下载MySQL。(8)下载完成后,输入ls即可看到下载完成的MySQL镜像包。使用Yum工具将该镜像包解析并更新至本机的镜像源中。[root@qfedu~]#wget /get/mysql80-community-release-el7-4.noarch.rpm[root@qfedu~]#lsmysql80-community-release-el7-4.noarch.rpm[root@qfedu~]#yum-ylocalinstallmysql80-community-release-el7-4.noarch.rpm……安装步骤省略……已安装:mysql80-community-release.noarch0:el7-4完毕!当官方源配置完成,服务器就可以使用Yum进行安装并使用该软件。2.下载并安装MySQL(1)选择需要的版本。查看Yum仓库中提供的MySQL版本。3.4
数据库主从复制实战3.4.3
部署MySQL从查询结果可以看到默认开启的是目前最新的MySQL8.0版本。MySQL8.0版本虽然是最新的,但是并不稳定。市场中现在使用的是较稳定的5.7版本,这里借助Yum管理工具包关闭MySQL8.0版本,开启5.7版本进行实验。2.下载并安装MySQL(1)选择需要的版本。3.4
数据库主从复制实战3.4.3
部署MySQL下载Yum管理工具包。[root@qfedu~]#yum-yinstallyum-utils使用yum-config-manager命令关闭MySQL8.0版本,并开启MySQL5.7版本。[root@qfedu~]#yum-config-manager--disablemysql80-community[root@qfedu~]#yum-config-manager--enablemysql57-community设置完成后再次确认目前仓库中提供的MySQL版本。[root@qfedu~]#yumrepolistenabled|grepmysqlmysql-connectors-community/x86_64MySQLConnectorsCommunity221mysql-tools-community/x86_64MySQLToolsCommunity135mysql57-community/x86_64MySQL5.7CommunityServer544从查询结果可以看到版本无误,可以进行下一步的安装。2.下载并安装MySQL(2)安装MySQL。3.4
数据库主从复制实战3.4.3
部署MySQL使用Yum命令下载并安装MySQL。[root@qfedu~]#yum-yinstallmysql-community-server当看到如下提示时说明安装完成。已安装:mysql-community-libs.x86_640:5.7.36-1.el7mysql-community-libs-compat.x86_640:5.7.36-1.el7mysql-community-server.x86_640:5.7.36-1.el7作为依赖被安装:mysql-community-client.x86_640:5.7.36-1.el7mysql-community-common.x86_640:5.7.36-1.el7mysql-community-libs.x86_640:5.7.36-1.el7net-tools.x86_640:2.0-0.25.20131004git.el7完毕!3.初始化MySQL3.4
数据库主从复制实战3.4.3
部署MySQL安装完成后,启动MySQL服务并设置开机自启[root@qfedu~]#systemctlstartmysqld[root@qfedu~]#systemctlenablemysqld设置完成后,可以输入systemctlstatusmysqld查看当前MySQL的运行状态,也可以通过查看相关文件是否存在,MySQL是否已经工作在正确的端口来验证服务已成功启动(MySQL的默认工作端口是3306)。这里用第二种办法来查看[root@qfedu~]#ls/var/lib/mysqlaria_log.00000001ca.pemib_logfile0mysql.sockpublic_key.pemaria_log_controlclient-cert.pemib_logfile1mysql.sock.lock server-cert.pemfclient-key.pemibtmp1performance_schema server-key.pemca-key.pemibdata1mysqlprivate_key.pem[root@qfedu~]#netstat-anpt|grepmysqltcp600:::3306:::*LISTEN73973/mysqld从上面的查询结果可以看出MySQL配置文件正常,且该项服务已工作在正确的端口。3.初始化MySQL3.4
数据库主从复制实战3.4.3
部署MySQLMySQL5.7成功安装后,系统会随机为root用户生成一个初始密码(也可以称为临时密码),保存在/var/log/mysqld.log中。随机生成的密码一般包含英文、数字及符号,较为复杂。该临时密码只能用来登陆数据库,如果要在数据库中进行更多操作,必须更改数据库密码。为了便于后续使用,这里先利用MySQL的临时密码进入数据库,再更改数据库密码。本书暂时将root用户的密码更改为“QianFeng@123”,读者也可以自定义用户名及密码。(1)查看系统为root用户随机生成的临时密码。[root@qfedu~]#cat/var/log/mysqld.log|grep"temporarypassword"2020-01-03T07:22:33.997442Z1[Note]Atemporarypasswordisgeneratedforroot@localhost:g8R4#F*4l,WX系统为root用户随机生成的临时密码为“g8R4#F*4l,WX”。3.初始化MySQL3.4
数据库主从复制实战3.4.3
部署MySQL(2)使用root用户及临时密码,进入数据库。[root@qfedu~]#mysql-uroot-p'g8R4#F*4l,WX'mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis4Serverversion:5.7.36Copyright(c)2000,2021,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>看见mysql>提示符,说明数据库登录成功。3.初始化MySQL3.4
数据库主从复制实战3.4.3
部署MySQL(3)更改数据库的密码为“QianFeng@123”。mysql>ALTERUSER'root'@'localhost'IDENTIFIEDBY'qianfeng@123';ERROR1819(HY000):Yourpassworddoesnotsatisfythecurrentpolicyrequirements(4)针对以上问题,需要在配置文件中设置密码强度。[root@qfedu~]#vim/etc/f#在[mysqld]下添加如下内容[mysqld]validate_password=off返回了一个错误提示,设置的密码不符合密码安全策略。然后重启数据库,重新登录数据库,修改密码[root@qfedu~]#systemctlrestartmysqld[root@qfedu~]#mysql-uroot-p'g8R4#F*4l,WX'······此处省略部分代码······mysql>alteruser'root'@'localhost'identifiedby'qianfeng@123';QueryOK,0rowsaffected(0.11sec)3.初始化MySQL3.4
数据库主从复制实战3.4.3
部署MySQL(5)使用root用户及设定的新密码登陆数据库,验证密码是否更改成功。[root@qfedu~]#mysql-uroot-p'QianFeng@123'mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.······此处省略部分代码······Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>密码更改成功,数据库初始化完成。1.配置主服务器3.4
数据库主从复制实战3.4.4
部署主从复制集群(1)在配置主从复制集群时,需要在主服务器上开启二进制日志并配置唯一的服务器ID,配置完成后需要重新启动mysqld服务。编辑主服务器的配置文件f[root@master1~]#vi/etc/f[mysqld]#添加如下代码log-bin=/var/log/mysql/mysql-binserver-id=144(2)创建相关的日志目录并赋予权限。[root@master1~]#mkdir/var/log/mysql[root@master1~]#chownmysql.mysql/var/log/mysql(3)目录创建完成后,重新启动mysqld服务。[root@master1~]#systemctlrestartmysqld需要注意,在配置文件中如果省略Server-ID(或者将其设置为默认值0),则主服务器将拒绝来自从服务器的任何连接。1.配置主服务器3.4
数据库主从复制实战3.4.4
部署主从复制集群(4)为了保证在使用带事务的InnoDB进行复制设置时尽可能提高持久性和一致性,也需要在主服务器(master1)的f配置文件中加入以下配置项。innodb_flush_log_at_trx_commit=1sync_binlog=1“innodb_flush_log_at_trx_commit=1”表示当事务提交时,系统会将日志缓冲写入磁盘,并且立即刷新。参数“sync_binlog=1”表示当事务提交时,将二进制文件写入磁盘并立即执行刷新操作。另外为了从服务器可以连接主服务器,还需要将skip_networking选项设置为OFF状态(默认为OFF状态),如果该选项为启用状态,则从站无法与主站通讯,并且会造成复制失败。1.配置主服务器3.4
数据库主从复制实战3.4.4
部署主从复制集群(5)在MySQL中查看skip_networking选项状态。mysql>showvariableslike'%skip_networking%';+-----------------+-------+|Variable_name|Value|+-----------------+-------+|skip_networking|OFF|+-----------------+-------+1rowinset(0.00sec)skip_networking选项为关闭状态。2.创建指定用户3.4
数据库主从复制实战3.4.4
部署主从复制集群(1)在进行主从复制时,为了提高数据库集群的安全性,建议创建一个专门用于复制数据的用户,每个从服务器需要使用MySQL主服务器上的用户名和密码连接到主服务器上。例如,在主服务上创建用户repl,并允许该用户可以从任何主机上连接到Master上进行复制操作。mysql>createuser'repl'@'%';QueryOK,0rowsaffected(0.02sec)mysql>grantreplicationslaveon*.*to'repl'@'%'identifiedby'qianfeng@123';QueryOK,0rowsaffected(0.02sec)2.创建指定用户3.4
数据库主从复制实战3.4.4
部署主从复制集群(2)用户和权限设置完成后,可以尝试在从服务器上使用刚才创建的用户进行测试连接。[root@slave1~]#mysql-urepl-p'qianfeng@123'-hmaster1mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMySQLconnectionidis3Serverversion:5.7.36-logMySQLCommunityServer(GPL)Copyright(c)2000,2021,Oracleand/oritsaffiliates.Allrightsreserved.OracleisaregisteredtrademarkofOracleCorporationand/oritsaffiliates.Othernamesmaybetrademarksoftheirrespectiveowners.Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.mysql>用户repl可以通过从服务器登陆主服务器。3.拷贝数据3.4
数据库主从复制实战3.4.4
部署主从复制集群(1)在搭建主从复制集群时,主服务上可能会已经存在数据,为了模拟真实的生产环境,在主服务器上插入测试数据。mysql>createdatabasetest;QueryOK,1rowaffected(0.01sec)mysql>createtabletest.t1(idint,namevarchar(50));QueryOK,0rowsaffected(0.02sec)mysql>insertintotest.t1values(1,"lucky"),(2,"Cookie"),(3,"Belle");QueryOK,3rowsaffected(0.01sec)Records:3Duplicates:0Warnings:0mysql>select*fromtest.t1;+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle|+------+--------+3rowsinset(0.00sec)在Master服务器中插入数据成功。3.拷贝数据3.4
数据库主从复制实战3.4.4
部署主从复制集群(2)在启动复制之前,需要将主服务器中现有的数据与从服务器保持同步,在进行相关操作时需要保持客户端的正常运行,以便锁定保持不变。将主服务器中现有的数据导出,并将导出的数据复制到每个从服务器上。本次实例将使用mysqldump工具创建要复制的所有数据库转储。[root@master1~]#mysqldump-uroot-p'qianfeng@123'--all-databases--master-data=1>dbdump.dbmysqldump:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.master-data参数表示自动锁定表;如果不使用master-data参数,则需要手动锁定单独会话中的所有表。3.拷贝数据3.4
数据库主从复制实战3.4.4
部署主从复制集群(3)查看备份中数据记录的二进制日志的位置,以便在从服务器配置中使用。[root@master1~]#vimdbdump.db1--MySQLdump10.13Distrib5.7.36,forLinux(x86_64)2--3--Host:localhostDatabase:4--------------------------------------------------------5--Serverversion5.7.36-log67/*!40101SET@OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT*/;8/*!40101SET@OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS*/;9/*!40101SET@OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION*/;10/*!40101SETNAMESutf8*/;11/*!40103SET@OLD_TIME_ZONE=@@TIME_ZONE*/;12/*!40103SETTIME_ZONE='+00:00'*/;13/*!40014SET@OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS,UNIQUE_CHECKS=0*/;14/*!40014SET@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/;15/*!40101SET@OLD_SQL_MODE=@@SQL_MODE,SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/;16/*!40111SET@OLD_SQL_NOTES=@@SQL_NOTES,SQL_NOTES=0*/;1718--19--Positiontostartreplicationorpoint-in-timerecoveryfrom20--2122CHANGEMASTERTOMASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1255;//省略部分内容//在配置文件的第22行中可以看出日志文件的分割点为mysql-bin.000001文件中的1255位置。3.拷贝数据3.4
数据库主从复制实战3.4.4
部署主从复制集群(4)使用scp或者rsync工具将备份出来的数据传输到从服务器上。[root@master1~]#scpdbdump.dbroot@slave1:/root/Theauthenticityofhost'slave1(45)'can'tbeestablished.ECDSAkeyfingerprintisSHA256:rGvvMJlt6bXovaZhGWpUM7L1eqGYz3e4RVPD4yHSGVc.ECDSAkeyfingerprintisMD5:9e:40:59:3b:b1:71:51:55:6c:6a:9c:37:80:1a:1d:2e.Areyousureyouwanttocontinueconnecting(yes/no)?yesWarning:Permanentlyadded'slave1,45'(ECDSA)tothelistofknownhosts.root@slave1'spassword:#slave1服务器的登录密码dbdump.db100%856KB6.5MB/s00:00slave1可以被主服务器解析出IP地址4.配置从服务器3.4
数据库主从复制实战3.4.3
部署MySQL(1)数据拷贝完成后,接下来需要在从服务器的f配置文件中添加ServerID。[root@slave1~]#vi/etc/f[mysqld]server-id=145(2)配置修改完成后需要重新启动mysqld的服务。[root@slave1~]#systemctlrestartmysqld(3)在从服务器的数据库中导入备份数据。mysql>source/root/dbdump.db(4)从服务器上连接主服务器,注意相关信息的准确性。mysql>CHANGEMASTERTO->master_host='master1',->master_user='repl',->master_password='qianfeng@123',->master_log_file='mysql-bin.000001',->master_log_pos=1255;QueryOK,0rowsaffected,2warnings(0.01sec)master_host表示需要连接的主服务器名称,master_user表示连接到主服务器的用户,master_password表示连接用户的密码。4.配置从服务器3.4
数据库主从复制实战3.4.4
部署主从复制集群(5)配置完成后,在从服务器开始复制线程。mysql>startslave;QueryOK,0rowsaffected(0.09sec)(6)在从服务器执行如下操作可以验证线程是否工作正常。mysql>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:master1Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:mysql-bin.000001Read_Master_Log_Pos:1255Relay_Log_File:slave1-relay-bin.000003Relay_Log_Pos:320Relay_Master_Log_File:mysql-bin.000001
Slave_IO_Running:YesSlave_SQL_Running:YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Last_Errno:0Last_Error:Skip_Counter:0Exec_Master_Log_Pos:1255Relay_Log_Space:528Until_Condition:NoneUntil_Log_File:Until_Log_Pos:0Master_SSL_Allowed:NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master:0Master_SSL_Verify_Server_Cert:NoLast_IO_Errno:0Last_IO_Error:Last_SQL_Errno:0Last_SQL_Error:4.配置从服务器3.4
数据库主从复制实战3.4.4
部署主从复制集群(6)在从服务器执行如下操作可以验证线程是否工作正常。Replicate_Ignore_Server_Ids:Master_Server_Id:144Master_UUID:dfdb039c-738c-11ec-82c0-000c29dcf9caMaster_Info_File:/var/lib/mysql/SQL_Delay:0SQL_Remaining_Delay:NULLSlave_SQL_Running_State:Slavehasreadallrelaylog;waitingformoreupdatesMaster_Retry_Count:86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position:0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:1rowinset(0.00sec)I/O线程和SQL线程的状态都为YES,证明主从复制线程启动成功。1.复制状态验证3.4
数据库主从复制实战3.4.5
测试数据同步主从复制线程启动后,主服务上关于修改数据的操作都会在从服务器中回演,这样就保证了主从服务器数据的一致性,下面将进行相应的验证。(1)尝试在主服务器中插入一些数据,并在从服务器上查看插入的数据是否存在。[root@master1~]#mysql-uroot-p'qianfeng@123'-e"insertintotest.t1values(4,'coco');"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.[root@master1~]#mysql-uroot-p'qianfeng@123'-e"select*fromtest.t1;"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle||4|coco|+------+--------+在主服务器上成功地插入了一条数据1.复制状态验证3.4
数据库主从复制实战3.4.5
测试数据同步(2)在从服务器上查看该数据是否存在。[root@slave1~]#mysql-uroot-p'qianfeng@123'-e"select*fromtest.t1;"mysql:[Warning]Usingapasswordonthecommandlineinterfacecanbeinsecure.+------+--------+|id|name|+------+--------+|1|lucky||2|Cookie||3|Belle||4|coco|+------+--------+从服务器的tt表中也存在id为4的数据,这说明从服务器与主服务器中的数据同步成功。3.4
数据库主从复制实战3.4.5
测试数据同步2.故障排除当SQL线程或者I/O线程启动异常时,读者可以先使用“showmasterstatus\G”命令检查当前二进制日志的位置与配置slave时设置的二进制日志位置是否相同。另外,读者也可以通过f配置中指定的错误日志查看错误信息。[root@slave1~]#tail-10/var/log/mysqld.log3.加入新的从服务器当数据量不断增加时,如果需要在集群中加入其他的从服务器,则配置流程与从服务器的配置一样,唯一不同的是需要修改新加入从服务器的Server-ID编号。另外,需要注意,假如在新加入从服务器之前,主服务器执行了删除库的操作。并且,删除的库刚好是在第一次mysqldump备份时的数据。那么,在从服务器上将会显示“没有这个数据库”的错误信息,因此,建议使用最新的备份数据。3.5数据库读写分离实战数据库代理Mycat读写分离原理实验环境部署流程3.5
数据库读写分离实战3.5.1
数据库代理在单一的主从数据库架构中,前端应用通过数据库的IP地址或者指定端口向后端请求相应的数据。当面对较多的数据库服务器时,Web请求需要在这些服务器之间进行判断,以便找到哪一台服务上保存着自己想要的数据。面对数据请求高峰时,这种判断不仅会带来大量的请求等待,而且还有可能会造成整个系统的瘫痪。本章将通过具体的案例来讲解数据库集群中如何实现高可用以及数据的读写分离策略。实际上,许多企业会通过在不同的地域招募代理商来加快品牌的宣传速度和市场占有率,随着互联网的不断发展,人们也会通过淘宝、京东这种“代理”平台来满足自己的消费需求。在互联网领域,系统管理员在面对数据库的多主集群时,也会使用代理服务器来实现数据的分发和资源的合理应用。3.5
数据库读写分离实战3.5.1
数据库代理代理服务器是网络信息的中转站,是信息“交流”的使者,常见的数据库代理架构如图。代理服务器提供统一的入口供用户访问,当用户访问代理服务器时,代理服务器会将用户请求平均的分发到后端的服务器集群,并且其本身并不会做任何的数据处理。这样一来,代理服务器不仅起到负载均衡的作用,而且同时还提供了独立的端口和IP。3.5
数据库读写分离实战3.5.1
数据库代理当后端的服务器处理完请求后也会通过代理服务器返回给用户,基本的网络拓扑如图。前端应用请求只需指定代理服务器的IP地址和端口即可访问后端数据文件,这种形式不仅提高了系统的数据处理能力,而且还保证了后端数据库的安全性,使系统更加的健壮。数据库代理(DBProxy)又被称为数据库中间件,当面对大量的应用请求时,代理可以通过对数据进行分片以及自身的自动路由与聚合机制实现对不同请求的分发,以此来达到数据库的读写分离功能。3.5
数据库读写分离实战3.5.1
数据库代理随着市场的发展和技术的更新,产生了许多不同的数据库代理服务器,国内企业中目前使用较多的数据库代理服务器有以下几种。MySQLProxy:MySQL官方提供数据库中间件。Atlas:奇虎360团队在MySQLProxy的基础上进行的二次开发。DBProxy:美团点评在Atlas的基础上进行的二次开发。Amoeba:早期阿里巴巴使用的数据库中间件。Cober:由阿里巴巴团队进行维护和开发。MyCat:由阿里巴巴团队进行维护和开发。由于各个中间件的应用场景和使用方式不同,本书将对实际应用常见中涉及较多的Mycat数据库中间件进行介绍和说明。关于其他的数据库中间件的使用方式,读者可以自行查阅。3.5
数据库读写分离实战3.5.2
Mycat读写分离原理本次实例中将通过搭建Mycat代理,实现MySQL双主双从集群的读写分离。读写分离集群架构如图。Mycat是一款开源的数据库代理软件,由阿里巴巴在Cobar的基础上进行改良,不仅支持市场上主流的数据库(MySQL、Oracle、MongoDB等),而且还支持数据库中的事务操作。本节将通过具体的案例演示Mycat中间件的配置流程和使用方法。读写分离集群中,各服务器的详细参数如表。3.5
数据库读写分离实战3.5.3
实验环境为了避免实验过程中产生不必要的错误,建议关闭防火墙和SELinux。在进行相关操作前各服务器之间需要进行相应的域名解析。主机名称主机IP系统Mycat40Centos7Master144Centos7Slave145Centos7Master241Centos7Slave242Centos740 mycat44 master1 45 slave1 41 master242 slave2 [root@qfedu~]#ntpdate-u1为了保证各服务器的时间一致,对主从数据库服务器进行时间校对。(2)在Mycat主机上安装Java环境,通过浏览器访问Java网站并下载相应的JDK,具体的页面如图。(1)由于Mycat是基于Java语言编写,所以在部署Mycat之前需要搭建Java环境。Mycat的各版本与JDK版本对应关系如表。3.5
数据库读写分离实战3.5.4
部署流程MycatJDK1.3~1.51.71.61.81.71.72.01.81.配置Java环境3.5
数据库读写分离实战3.5.4
部署流程1.配置Java环境(3)在Mycat服务器中使用Wget工具下载相应的JDK压缩包并解压。[root@mycat~]#lsjdk-8u311-linux-x64.tar.gz[root@mycat~]#tarxfjdk-8u311-linux-x64.tar.gz-C/usr/local/[root@mycat~]#ln-s/usr/localk1.8.0_311//usr/local/java(4)解压完成后需要在全局配置文件内追加设置Java环境变量。[root@mycat~]#vim/etc/profileJAVA_HOME=/usr/local/javaPATH=$JAVA_HOME/bin:$PATHexportJAVA_HOMEPATH3.5
数据库读写分离实战3.5.4
部署流程1.配置Java环境(5)刷新全局变量,使环境变量生效。[root@mycat~]#source/etc/profile(6)使用相关命令验证Java环境是否安装成功。[root@mycat~]#env|grepJAVAJAVA_HOME=/usr/local/java[root@mycat~]#java-versionjavaversion"1.8.0_311"Java(TM)SERuntimeEnvironment(build1.8.0_311-b11)JavaHotSpot(TM)64-BitServerVM(build25.311-b11,mixedmode)使用java-version命令可以查询到Java的版本信息即证明Java环境安装成功。3.5
数据库读写分离实战3.5.4
部署流程2.配置Mycat(1)Java环境搭建完成后,即可部署Mycat服务。首先,为了让应用之间互不影响,可以为Mycat创建一个专属的用户。#查看是否已经存在Mycat用户[root@mycat~]#cat/etc/group|grepmycat[root@mycat~]#cat/etc/passwd|grepmycat#创建Mycat用户[root@mycat~]#groupaddmycat[root@mycat~]#useradd-gmycatmycat(2)Mycat创建完成后,可使用passwdmycat命令修改用户密码。Mycat官网下载Mycat压缩包,具体如图。(3)进入下载页面,复制合适版本的下载链接。3.5
数据库读写分离实战3.5.4
部署流程2.配置Mycat[root@mycat~]#wget//20190828135747/Mycat-server--release-20190828135747-linux.tar.gz[root@mycat~]#lsjdk-8u311-linux-x64.tar.gzMycat-server--release-20190828135747-linux.tar.gz[root@mycat~]#tarxfMycat-server--release-20190828135747-linux.tar.gz-C/usr/local/[root@mycat~]#ls/usr/local/mycat/bincatletconfliblogsversion.txt(4)在Mycat服务器中使用wget工具进行下载,下载完成后将压缩包解压至指定路径即可。3.5
数据库读写分离实战3.5.4
部署流程2.配置Mycat(5)解压在/usr/local/目录下有一个mycat文件夹,将该文件夹的所有者设置为mycat用户。[root@mycat~]#chown-Rmycat:mycat/usr/local/mycat(6)etc文件下的profile文件是设置系统级别的环境变量和启动程序的,其中的配置会对所有用户生效。此时只需修改单个用户的环境变量,编辑~/.bashrc文件。[root@mycat~]#vim~/.bashrc#添加如下代码exportMYCAT_HOME=/usr/local/mycatexportPATH=$PATH:$MYCAT_HOME/bin(7)刷新全局变量,使环境变量生效。[root@mycat~]#source/etc/profile3.5
数据库读写分离实战3.5.4
部署流程2.配置Mycat(8)Mycat作为代理服务器,上端的用户请求通过server.xml配置文件中设定的参数访问Mycat代理。由于Mycat本身并不具有存储引擎,所以还需要schema.xml文件中的参数连接下端的数据库服务器以此来保存相关数据。(9)在server.xml配置文件中可以看到上端用户访问Mycat所需要的账户和密码,原始配置文件如下所示。2.配置Mycat3.5
数据库读写分离实战3.5.4
部署流程[root@mycat~]#vim/usr/local/mycat/conf/server.xml<!--ROOT用户密码设置项--><username="root"defaultAccount="true"><propertyname="password">123456</property><propertyname="schemas">TESTDB</property><!--表级DML权限设置--><!--<privilegescheck="false"><schemaname="TESTDB"dml="0110"><tablename="tb01"dml="0000"></table><tablename="tb02"dml="1111"></table></schema></privileges>--></user><!--其他用户密码设置项--><username="user"><propertyname="password">user</property><propertyname="schemas">TESTDB</property><propertyname="readOnly">true</property><propertyname="defaultSchema">TESTDB</property></user></mycat:server>username="root"项表示上端连接Mycat数据库的账户;propertyname="password"项表示连接Mycat的密码;propertyname="schemas"项表示后方数据库的统称2.配置Mycat3.5
数据库读写分离实战3.5.4
部署流程(10)在默认情况下,上端通过Root用户连接Mycat,因此可以将配置文件中的“其他用户的配置项”使用“<!---->”注释掉,修改完成后,如图。(11)另外,也可以在“ROOT用户密码设置项”中修改使用Root用户访问Mycat代理的密码和下端数据库群的统称。例如将密码设置为“qianfeng@123”,修改后的代码如图。3.5
数据库读写分离实战3.5.4
部署流程2.配置Mycat(12)server.xml文件修改完成后,保存退出即可。接下来,还需要设置Mycat下端连接MySQL的配置,即修改schema.xml文件。[root@mycat~]#vim/usr/local/mycat/conf/schema.xml(13)原始配置文件删除注释后主要分为以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年科技研发项目保证金合同模板3篇
- 有关公司慰问信汇编7篇
- 军训第二天心得体会
- 顶岗实习月报范文【五篇】
- 写人物传记的作文600字5篇
- 女工三八妇女节演讲稿6篇
- 乡镇关于生态环境保护工作总结
- 九年级语文下册 第三单元 10《唐雎不辱使命》教学实录1 新人教版
- 网上学习作业答案
- 医院护士实习报告(集锦15篇)
- 黑龙江省齐齐哈尔市建华区等5地2024-2025学年九年级上学期10月期中考试数学试题
- 2024年建筑业三类人员(安管人员、安全员、施工员)等知识考试题库与答案
- 2024年售楼处规章制度例文(六篇)
- 2024秋期国家开放大学本科《经济学(本)》一平台在线形考(形考任务1至6)试题及答案
- 动静脉内瘘成形术
- JJF(苏) 276-2024 接触(触针)式表面轮廓测量仪校准规范
- 帕金森综合征与吞咽障碍
- 2024-2025学年五年级科学上册第二单元《地球表面的变化》测试卷(教科版)
- 2024-2030年中国降压药行业市场规模分析及发展趋势与投资研究报告
- 国家开放大学《管理信息系统》大作业参考答案
- 2024年秋新苏教版三年级上册科学全册复习资料
评论
0/150
提交评论