网站MySQL数据库优化方案网络运维信息管理中心(2020年8月)数据库为网站提供数据的结构化存储,是网站系统的重要组成部分,但随着业务逻辑的复杂度的增加,数据库需要不断的优化,单一的数据库已无法满足现在要求。
1.1优化目标针对网站的MySQL数据库部署架构进行优化,其优化的目的是为了防止数据库出现单点故障问题,提高数据库的处理能力,提高数据库的可靠性,为保证网站业务正常办理。
1.2优化工作思路1、对现有数据库现状分析包括现有数据库配置合理性分析、现有数据库部署情况两部分工作内容;2、梳理现有网站的功能模块,目的是通过梳理网站的各功能模块对数据读取时效性,分析其是否可以实现读写;3、以数据库主从架构及数据库读写分离方式,对网站的MySQL 数据库提出数据库部署架构优化的方案,数据库主从架构的多数据库模式,解决数据库单点存在的问题,当主数据库出现宕机时,可以将从数据库代替主数据库恢复业务系统正常运行,而且避免数据的丢失,提高数据库高可靠性和高可用性;通过部分查询统计功能,实现数据库读写分离,以便对数据库负载进行分流,缓解主数据库的读取压力。
2.1当前数据库部署架构图当前网站的数据库采用单台MySQL数据库提供数据库服务,当前部署架构图如下:2.2现有数据库主要配置梳理2.3数据库部署情况梳理2.3.1数据库安装部署情况梳理2.3.2现有应用连接数据库情况梳理连接数据库的应用系统有会员管理、权限管理、订单模块、商品管理、促销管理、广告管理、报表统计、文章管理、评论管理、系统设置、数据库管理、短信管理、推荐管理、邮件群发管理等。
2.3.3数据库服务启动、停止方式梳理1、启动命令(1)普通启动:/data/soa/mysql/bin/mysqld(2)centos6以前版本:service start mysqld(3)centos7+:systemctl mysqld start2、重启命令先停止:killall mysqld后启动:/data/soa/mysql/bin/mysqldcentos6以前版本:service restart mysqldcentos7+:systemctl mysqld restart3、停止命令killall mysqld 或 killall -9 mysqldcentos6以前版本:service stop mysqldcentos7+:systemctl mysqld stop2.4数据库主机配置及运行情况2.4.1数据库主机硬件配置及操作系统2.4.2数据库主机资源使用情况2.5现有使用数据库的功能模块2.5.1当前技术开发架构网站采用springboot2的开发框架,springboot2 是基于Java语言的极速 web 开发框架,其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。
springboot2 同时支持多数据源,并且可以针对这多个数据源配置独立的缓存、事务级别等。
2.5.2现有功能模块梳理3数据库优化方案设计3.1数据库配置优化3.2数据库主从架构设计3.2.1网站当前数据库部署架构1、当前数据库部署架构图2、当前数据库部署架构存在问题及优化思路通过当前数据库部署架构图可知,网站的数据库采用单台数据库。
当数据库出现故障时,整个网站系统无法正常使用,影响系统正常运行,即网站的数据库存在单点故障;而且数据库服务器资源无法满足增长的读写请求。
针对网站的数据库架构进行优化,优化思路是增加数据库数量,实现数据库主从架构,其优化的目的是为了防止数据库出现单点故障问题,提高数据库的处理能力,提高数据库的可靠性,为保证网站业务正常办理。
3.2.2数据库主从架构优势1、什么是数据库主从架构MySQL数据库主从架构,是通过主从复制方式,让一个数据库与其他的数据库同步,保持两个或多个数据库的数据一致。
2、数据库主从架构与单一数据库比较3、数据库主从架构优点(1)数据分布:MySQL复制通常不会对带宽造成很大的压力,并且可以随意的停止或开始复制,并在不同的地理位置来分布数据备份,例如不同的数据中心。
即使在不稳定的网络环境下,远程复制也是可以工作。
但如果为了保持很低的复制延迟,最好有一个稳定的、低延迟的连接。
(2)负载均衡:通过MySQL复制可以将读操作分不到多个服务器上,实现对读密集型应用的优化,并且实现很方面,通过简单的代码修改就能实现基本的负载均衡。
对于小规模的应用,可以简单对机器,名做硬编码或使用DNS轮询。
当然也可以使用更复杂的方法,例如网络负载均衡这一类的标准负载均衡解决方案。
能够很好的将负载均衡分配到不同的MySQL服务器上。
(3)备份:对于备份来说,复制是一项很有意义的技术补充,但复制既不是备份也不能取代备份。
(4)高可用性和故障切换:复制能够补助应用程序避免MySQL 单点失败,一个包含复制的设计良好的故障切换系统能显著缩短当机时间。
(5)MySQL升级测试:这种做法比较普遍,使用一个更高版本的mysql作为备库,保证在升级全部实例前,查询能够在备库按照预期执行。
4、优化后的网站数据库部署架构(1)数据库主从架构图2、数据库主从架构说明将主数据库与从数据库配置为主从同步模式,主数据库负责写入状态,从数据库将同步到主数据库刚写入的数据,保证从数据库与主数据库的数据一致。
优点是实时灾备,当主库出现问题,可以快速切换到从库提供服务;同时该架构容易扩展,比如实现读写分离,提高系统读写数据的性能,缓解数据库的压力,增加了数据库的处理能力。
3.2.3数据库主从架构实现原理1、数据库主从实现架构图2、数据库主从实现架构说明(1)数据库主从实现整体有三个步骤第一步:主数据库将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);第二步:从数据库将主数据库的binary log events拷贝到它的中继日志(relay log);第三步:从数据库重做中继日志中的事件,将改变反映它自己的数据。
(2)数据库主从架构具体实现过程第一部分就是主数据库记录二进制日志。
在每个事务更新数据完成之前,主数据库在二日志记录这些改变。
MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。
在事件写入二进制日志完成后,主数据库通知存储引擎提交事务。
下一步就是从数据库将主数据库的binary log拷贝到它自己的中继日志。
首先,从数据库开始一个工作线程——I/O线程。
I/O线程在主数据库上打开一个普通的连接,然后开始binlog dump process。
Binlog dump process从主数据库的二进制日志中读取事件,如果主数据库没有新的binary log记录,它会睡眠并等待主数据库产生新的事件。
I/O线程将这些事件写入中继日志。
从数据库SQL线程(SQL thread)处理该过程的最后一步。
SQL 线程从中继日志读取事件,并重放其中的事件而更新从数据库的数据,使其与主数据库中的数据一致。
只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在主数据库中也有一个工作线程:和其它MySQL的连接一样,从数据库在主数据库中打开一个连接也会使得主数据库开始一个线程。
复制过程有一个很重要的限制——复制在从数据库上是串行化的,也就是说主数据库上的并行更新操作不能在从数据库上并行操作。
3.2.4数据库主从架构搭建的硬件要求1、数据库主机数量主数据库和从数据库部署建议在不同的主机上,这样实现一主一从的架构,需要两台数据库主机,目的是主数据库出现故障时,切换到从数据库继续提高数据库服务。
2、CPU要求CPU尽量选择64位CPU,这样才可以安装64位操作系统,有了64位操作系统才能利用好更大的内存,便于后期服务器硬件扩展。
3、内存要求内存IO高于SSD的IO,SSD的IO高于磁盘IO,足够的内存满足读请求与写请求,在选择内存时,要虑数据库并发量、数据库热数据的大小等。
4、硬盘要求数据库的数据硬盘最好与操作系统的系统硬盘分开,目的是提高数据库I/O性能和保证数据安全,原因是系统盘使用频率(I/O)较高,而且操作系统最容易出现问题,在修复或重新安装操作系统时,容易将系统盘数据丢失。
3.2.5主数据库搭建流程1、修改MySQL数据库配置文件f,配置一台数据库为主数据库,在MySQL数据库配置文件添加MySQL服务器id标识和开启二进制日志(binary log)功能,配置如下:[mysqld]log-bin=mysql-binserver-id=1参数说明如下:2、修改完配置文件后,重启MySQL数据库服务。
3、主数据库上创建复制账号,通过SQL语句创建,SQL语句如下:mysql> GRANT REPLICATION SLAVE ON *.* to 'replication'@'%' identified by '123456';4、查询主数据库状态,查看主数据库状态SQL语句为:mysql> show master status;比如如下结果如下:记录主数据库的两个关键数值File和Position,两个字段说明如下:执行完此步骤后不要再操作主数据库,防止主服务器状态值变化。
5、通过MySQL的mysqldump命令进行对需要做主从同步的库进行备份,命令如下:mysqldump -u root -p --lock-tables -R -q --databases --extended-insert=true --default-character-set=utf8 数据库名 > 数据库名.sqlmysqldump参数说明:6、将mysqldump备份出来的备份文件“数据库名.sql”复制到从数据库服务器上。
3.2.6从数据库搭建流程1、修改MySQL从数据库配置文件f,增加 server-id参数,配置参数如下:[mysqld]server-id=2参数说明如下:2、从数据库配置修改完后,使用 - -skip-slave- start选项启动从数据库,这样不会立即启动从数据库服务上的复制进程,方便我们对从数据库的服务进行进一步的配置,操作命令:mysql> mysqld_safe --defaults-file=/etc/f --skip-slave-start注:此示例的f路径只做参考,具体实施时按实际路径填写。
3、对从数据库做相应设置,指定复制使用的用户、密码,主数据库服务器的IP、端口,以及开始执行复制的日志文件和位置等,执行SQL语句如下:mysql> CHANGE MASTER TO MASTER_HOST='192.168.xxx.xxx',MASTER_PORT=3306,MASTER_USER ='replication',MASTER_PASSWORD='123456' ,MASTER_LOG_FILE=' mysql-bin.000004',MASTER_LOG_POS=308;SQL语句参数说明:4、启动从数据库复制功能,执行SQL语句如下:mysql> start slave;5、检查从服务器复制功能状态,执行SQL语句如下:mysql> show slave status\G********************** 1. row ********************* Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.xxx.xxx//主服务器地址Master_User: 'replication' //授权帐户名,尽量避免使用rootMaster_Port: 3306 //数据库端口,部分版本没有此行Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_PosRelay_Log_File: relay-bin.000003Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: Yes //此状态必须YESSlave_SQL_Running: Yes //此状态必须YES注:Slave_IO及Slave_SQL进程必须正常运行,Slave_IO_Running和Slave_SQL_Running显示为“YES”状态,如果有错误,Last_IO_Error或Last_SQL_Error显示相对应的错误信息。