实时备份工具

news2024/9/21 21:19:43

实时同步工具

    • 1. 常用实时同步工具
      • 1.1 sersync
      • 1.2 inotify-tools
      • 1.3 ‌lsync‌
    • 2. 工具对比
      • 2.1 常用实时同步工具对比
      • 2.2 ‌sersync和lsyncd对比
    • 3. 实践
      • 3.1 sersync
        • 1. 简易架构
        • 2. 服务器
        • 3. 搭建简易web服务器
        • 4. 配置NFS服务器
        • 5. 配置备份服务器
        • 6. 实时同步部分
        • 7. 验证

1. 常用实时同步工具

1.1 sersync

sersync是一个基于inotifyrsync的文件同步工具,设计用于实时监控指定目录或文件的变化,并在变化发生时自动触发同步操作,确保数据的实时一致性。

Sersync适用于需要进行实时数据同步的场景,如服务器同步、Web镜像备份等,其性能和可靠性得到了广泛认可。作为一个开源项目,Sersync拥有活跃的社区支持,用户可以从社区获得帮助和资源‌

官网 https://sersync.sourceforge.net/

1.2 inotify-tools

‌inotify-tools‌是一个用于监控文件系统变化的工具,它基于Linux内核的inotify子系统,提供了灵活的监控选项和输出格式。这个工具集包括两个主要的命令行工具:‌inotifywait‌和‌inotifywatch

Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。学习如何将 inotify 集成到您的应用程序中,并发现一组可用来进一步自动化系统治理的命令行工具。

官网 https://inotify.aiken.cz/

1.3 ‌lsync‌

‌lsync‌是一个基于inotifyrsync的实时文件同步工具,设计用于高效地同步大量数据。它通过Linux内核2.6.13及以后版本中的inotify触发机制,利用rsync进行差异同步,达到实时同步的效果。

lsync的主要特点和优势包括:

  • 实时同步‌:通过inotify机制监控文件系统的变化,当文件或目录发生变化时,立即通过rsync进行差异同步,确保数据的一致性。
  • 高效传输‌:lsync能够高效地传输海量数据,通过优化算法减少不必要的数据传输,节省带宽和计算资源。
  • 简单配置‌:lsync的配置使用Lua语言编写,配置灵活且易于理解,支持多种工作模式,如本地目录cp、本地目录rsync、远程目录rsyncssh等。
  • 解决频繁发送文件列表问题‌:通过时间延迟或累计触发事件次数,lsync解决了inotify+rsync在处理海量文件同步时可能遇到的频繁发送文件列表的问题。
  • 适用于多种场景‌:无论是本地到本地的同步,还是本地到远程的同步,lsync都能提供快速且高效的解决方案。

此外,lsync还支持通过Zabbix进行监控,提供分布式系统监视以及网络监视功能,确保服务器系统的安全运营,并通过灵活的通知机制快速定位和解决问题。这使得lsync成为企业级应用中一个重要的组成部分,特别是在需要实时监控和数据同步的场景中‌

官网 https://github.com/axkibe/lsyncd

2. 工具对比

2.1 常用实时同步工具对比

工具说明优缺点
inotifyinotify本身是用来监控文件系统操作,能够检查目录/文件变化,一般通过和rsync组合,来做实时同步性能较差
sersync内置了inotifyrsync,通过配置文件控制同步目录性能较好,基本不更新
lsync通过配置实现实时同步性能较好
drbd同步基于磁盘分区级别(block),通常给数据库做高可用一般为主备模式,主节点正常运行,则备节点一直不可用

2.2 ‌sersync和lsyncd对比

‌sersync和lsyncd都是用于实时同步文件的工具,但它们在设计、功能和使用场景上有所不同。‌

  • ‌sersync‌:
    sersync是一个国内开发者开源的工具,使用C++编写,采用多线程方式进行同步,具有失败重传机制和对临时文件的过滤功能。它自带crontab定时同步功能,支持配置文件管理,但自2011年后没有更新,文档和社区支持可能相对有限‌。
    sersync的性能优化主要体现在对大文件的同步异常处理上,通过多线程和重传机制提高同步的稳定性和可靠性。它的设计初衷是为了解决inotify+rsync在大文件同步时可能出现的问题,尽管它提供了较高的性能,但在功能和配置的灵活性方面可能不如lsyncd‌
  • ‌lsyncd‌:
    lsyncd实际上是用Lua语言封装了inotify和rsync工具,利用Linux内核的inotify触发机制,通过rsync进行差异同步,达到实时效果。它的特点是配置简单,可读性强,支持多种工作模式,包括本地目录cp、本地目录rsync、远程目录rsyncssh等‌。
    lsyncd的优势在于解决了inotify+rsync在处理大量文件同步时频繁发送文件列表的问题,通过时间延迟或累计触发事件次数实现优化。它的配置方式简单直观,非常适合需要简单实时同步的场景‌。

综上所述,sersync和lsyncd各有优势。sersync在性能和稳定性方面表现更优,适合对性能要求较高和对大文件同步有特殊需求的场景;而lsyncd则在配置灵活性和易用性方面更胜一筹,适合需要简单实时同步的场景。

3. 实践

3.1 sersync

我们将使用nfs+rsync+sersync搭建全网备份及实时备份

1. 简易架构

在这里插入图片描述

说明:

  • web服务器们把/upload挂载到NFS服务器/webupload,共享存储用户上传的数据,图片,视频等等。这部分数据可能会频繁更改,也相对来说比较重要,所以进行实时备份。在NFS服务器安装sersync,实时检测/webupload变化,并同步到备份服务器的/Realtime_backup目录中。
  • web服务器上的其他数据/data,可能包括:网页文件,配置文件,程序等,变化频率不会很频繁,所以进行日备份或定时备份。这部分内容直接备份到备份服务器的/backup目录中
  • 数据库文件备份不在本文的实践范围中,后面会单独整理一个篇幅进行实践
2. 服务器
服务器ip系统版本说明安装软件
web-svr-01192.168.202.131CentOS Linux release 7.9.2009 (Core)web服务器nginx
nfs-svr-01192.168.202.130CentOS Linux release 7.9.2009 (Core)网络存储服务器nfs-utils、rpcbind、sersync2
backup-svr-01192.168.202.128CentOS Linux release 7.9.2009 (Core)备份服务器rsync
3. 搭建简易web服务器
yum install -y nginx

[root@web-svr-01 html]# cat /etc/nginx/nginx.conf
...
http {
 ...
    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /data/html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /data/html;
        }
...

修改网页文件路径,当然这不是必须的,为了演示整体备份效果而已

[root@web-svr-01 html]# curl 127.0.0.1
hello, this is test rsync
[root@web-svr-01 html]# curl 127.0.0.1/page
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>

创建模拟用户上传数据路径/upload

[root@web-svr-01 html]# mkdir /upload
4. 配置NFS服务器

安装nfs及依赖rpcbind

yum install -y nfs-utils rpcbind

配置nfs

[root@nfs-svr-01 ~]# mkdir /webupload
[root@nfs-svr-01 ~]# chown nfsnobody.nfsnobody /webupload/
[root@nfs-svr-01 ~]# cat /etc/exports
/webupload   192.168.202.1/24(rw,all_squash)
[root@nfs-svr-01 ~]# systemctl restart nfs
[root@nfs-svr-01 ~]# showmount -e 192.168.202.130
Export list for 192.168.202.130:
/webupload 192.168.202.1/24

web服务器挂载nfs存储目录

[root@web-svr-01 html]# showmount -e 192.168.202.130
Export list for 192.168.202.130:
/webupload 192.168.202.1/24

[root@web-svr-01 html]# mount -t nfs 192.168.202.130:/webupload /upload
[root@web-svr-01 html]# df -h
Filesystem                  Size  Used Avail Use% Mounted on
devtmpfs                    894M     0  894M   0% /dev
tmpfs                       910M     0  910M   0% /dev/shm
tmpfs                       910M   22M  889M   3% /run
tmpfs                       910M     0  910M   0% /sys/fs/cgroup
/dev/mapper/centos-root      17G   15G  2.1G  89% /
/dev/sdb1                   4.8G  321M  4.3G   7% /mnt/sdb
/dev/sda1                  1014M  168M  847M  17% /boot
tmpfs                       182M     0  182M   0% /run/user/0
192.168.202.130:/webupload   17G   16G  1.8G  90% /upload

测试

[root@web-svr-01 html]# touch  /upload/123
[root@web-svr-01 html]# ll /upload/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 14:09 123
[root@nfs-svr-01 ~]# ll /webupload/
total 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 14:40 123
5. 配置备份服务器

安装rysnc

[root@backup-svr-01 share]# yum install -y rsync

配置rsync 可以参考https://blog.csdn.net/u010230019/article/details/141682071,这里笔者在此基础上进行修改

[root@backup-svr-01 ~]# useradd -s /sbin/nologin -M rsync
[root@backup-svr-01 ~]# id rsync
uid=1003(rsync) gid=1004(rsync) groups=1004(rsync)


[root@backup-svr-01 ~]# chown rsync.rsync /backup/
[root@backup-svr-01 ~]# ll /backup/ -d
drwxr-xr-x 2 rsync rsync 6 Aug 29 16:39 /backup/

[root@backup-svr-01 ~]# echo "rsync_bak_01:rsync" > /etc/rsync.passwd
[root@backup-svr-01 ~]# cat /etc/rsync.passwd
rsync_bak_01:rsync
[root@backup-svr-01 ~]# chmod 400 /etc/rsync.passwd
[root@backup-svr-01 ~]# ll /etc/rsync.passwd
-r-------- 1 root root 19 Aug 29 16:51 /etc/rsync.passwd

修改配置文件

[root@backup-svr-01 share]# cat /etc/rsyncd.conf
# /etc/rsyncd: configuration file for rsync daemon mode

uid = rsync
gid = rsync
use chroot = no
max connections = 4
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
# exclude = lost+found/
# transfer logging = yes
timeout = 900
# ignore nonreadable = yes
# dont compress   = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2
fake super = yes
[backup]
path = /backup/
ignore errors
read only = false
list = true
hosts allow = 192.168.202.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_bak_01
secrets file = /etc/rsync.passwd


[Realtime_backup]
path = /Realtime_backup/
ignore errors
read only = false
list = true
hosts allow = 192.168.202.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_bak_01
secrets file = /etc/rsync.passwd

配置客户端(即NFS存储服务器)

[root@nfs-svr-01 html]# cat /etc/rsync.passwd
rsync

验证

[root@nfs-svr-01 html]# rsync -avz /etc/hostname rsync_bak_01@192.168.202.128::backup --password-file=/etc/rsync.passwd
sending incremental file list
hostname

sent 106 bytes  received 43 bytes  14.19 bytes/sec
total size is 11  speedup is 0.07
[root@backup-svr-01 ~]# cat /backup/hostname
web-svr-01

到这里,常规的备份内容基本结束了,剩下的定时任务和打包数据等可以参考以前的文章

6. 实时同步部分

在NFS服务器安装sersync,通过inotify监控/webupload(即web服务器的upload)目录内文件变化,并进行推送到备份服务器

sersync 官网为我们提供了二进制安装包,下载并上传到本地。笔者下载的是
sersync2.5.4_64bit_binary_stable_final.tar.gz

[root@nfs-svr-01 share]# tar -zxvf sersync2.5.4_64bit_binary_stable_final.tar.gz
GNU-Linux-x86/
GNU-Linux-x86/sersync2
GNU-Linux-x86/confxml.xml

可以看到sersync提供的工具包中,只包括一个执行文件和一个配置文件

首先,我们修改配置文件

[root@nfs-svr-01 share]# cat sersync/confxml.xml
...
    <sersync>
    	#修改本地同步目录,实时监测
        <localpath watch="/webupload">
        	#配置远程服务器IP及模块名,推送数据
            <remote ip="192.168.202.128" name="Realtime_backup"/>
            <!--<remote ip="192.168.8.39" name="tongbu"/>-->
            <!--<remote ip="192.168.8.40" name="tongbu"/>-->
        </localpath>
        <rsync>
            <commonParams params="-artuz"/>
            #配置rsync的用户及密码
            <auth start="true" users="rsync_bak_01" passwordfile="/etc/rsync.passwd"/>
            <userDefinedPort start="false" port="874"/><!-- port=874 -->
            <timeout start="false" time="100"/><!-- timeout=100 -->
            <ssh start="false"/>
        </rsync>
        #faillog更换路径,并且每60分钟对失败的log进行重新同步
        <failLog path="/usr/local/share/sersync/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
        <crontab start="false" schedule="600"><!--600mins-->
            <crontabfilter start="false">
                <exclude expression="*.php"></exclude>
                <exclude expression="info/*"></exclude>
            </crontabfilter>
        </crontab>
        <plugin start="false" name="command"/>
    </sersync>

...

创建连接

[root@nfs-svr-01 share]# mv GNU-Linux-x86 sersync
[root@nfs-svr-01 share]# ln -s /usr/local/share/sersync/sersync2  /usr/bin/sersync2

开启守护进程

[root@nfs-svr-01 sersync]# sersync2 -dro /usr/local/share/sersync/confxml.xml
set the system param
execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches
execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events
parse the command param
option: -d      run as a daemon
option: -r      rsync all the local files to the remote servers before the sersync work
option: -o      config xml name:  /usr/local/share/sersync/confxml.xml
daemon thread num: 10
parse xml config file
host ip : localhost     host port: 8008
daemon start,sersync run behind the console
use rsync password-file :
user is rsync_bak_01
passwordfile is         /etc/rsync.passwd
config xml parse success
please set /etc/rsyncd.conf max connections=0 Manually
sersync working thread 12  = 1(primary thread) + 1(fail retry thread) + 10(daemon sub threads)
Max threads numbers is: 22 = 12(Thread pool nums) + 10(Sub threads)
please according your cpu ,use -n param to adjust the cpu rate
------------------------------------------
rsync the directory recursivly to the remote servers once
working please wait...
execute command: cd /webupload && rsync -artuz -R --delete ./ rsync_bak_01@192.168.202.128::Realtime_backup --password-file=/etc/rsync.passwd >/dev/null 2>&1
run the sersync:
watch path is: /webupload
7. 验证

在这里插入图片描述
搭建完成实时备份后,加上前面web服务器使用的NFS网络存储系统,理论上,我们在web服务器的/upload目录中新增文件,在NFS服务器/webupload和备份服务器/Realtime_backup目录中,几乎也会同时新增相同文件,下面让我们看看是不是这样的:

web服务器

[root@web-svr-01 upload]# touch "this is a test file"
[root@web-svr-01 upload]# ll
total 0
-rw-r--r-- 1 root      root      0 Sep  5 16:05 123
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 16:38 123456
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 16:48 this is a test file

NFS服务器

[root@nfs-svr-01 sersync]# ll /webupload/
total 0
-rw-r--r-- 1 root      root      0 Sep  5 16:05 123
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 16:38 123456
-rw-r--r-- 1 nfsnobody nfsnobody 0 Sep  5 16:48 this is a test file

备份服务器

[root@backup-svr-01 share]# ll /Realtime_backup/
total 0
-rw-r--r-- 1 rsync rsync 0 Sep  5 16:05 123
-rw-r--r-- 1 rsync rsync 0 Sep  5 16:38 123456
-rw-r--r-- 1 rsync rsync 0 Sep  5 16:48 this is a test file

本次搭建基本到达预期

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2107319.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

穿越机的应用行业!!!

1. 军事领域 侦察与目标搜索&#xff1a;穿越机能够快速穿越危险区域&#xff0c;执行侦察任务&#xff0c;实时获取战场信息&#xff0c;对敌方目标进行精确搜索和定位。其灵活性和机动性使其成为战场上的重要侦察工具。 目标摧毁&#xff1a;经过改装的穿越机可挂载火箭弹或…

重磅活动!南开大学赵宏教授倾情分享AI挑战下的教育教学新理念与新方法

人工智能是科技发展的前沿领域&#xff0c;也是推动新质生产力形成的关键动力。当前&#xff0c;各个高校正积极探索人工智能对高等教育的改革&#xff0c;以培养适应未来社会发展需求的新型人才。 本次活动旨在传播 AI 挑战下的教育教学新理念与新方法&#xff0c;推动人才培养…

常见echart图表 返回数据与Java实体类

返回数据示例详见 Examples - Apache ECharts 一、折线图 实体类 public class LineChart {String name;List<BaseSeries> series;List<String> xAxis; }public class BaseSeries {String name;Double[] data; } 二、柱状图 实体类 public class Chart {String…

深度解析Linux系统的基本概念及优缺点和原理

目录 基本概念 操作系统简介 架构组成 多任务处理 安全性与开放性 发行版本 使用场景 学习资源 优点 缺点 1. 软件兼容性问题 2. 图形界面应用程序较少 3. 安装和配置复杂 4. 学习曲线陡峭 5. 缺乏技术支持 6. 硬件兼容性问题 7. 安全风险 8. 性能问题 9. 游…

数据结构代码集训day16(适合考研、自学、期末和专升本)

本题来自B站up&#xff1a;白话拆解数据结构 今日题目就一个&#xff1a;约瑟夫环问题。 一个圈共有N个人&#xff08;N为不确定的数字&#xff09;&#xff0c;第一个人的编号为0或者1&#xff08;两个都可以&#xff0c;看你的程序如何编写&#xff09;&#xff0c;假设这边我…

提升App推广效果,从精准获取下载数据开始

在App推广的过程中&#xff0c;获取准确的下载数据一直是一个令人头疼的问题。你知道吗&#xff1f;无法精确追踪用户来源和下载量&#xff0c;就像是在黑暗中摸索&#xff0c;让推广效果大打折扣。今天&#xff0c;我们就来揭秘如何轻松获取App下载数据&#xff0c;优化你的推…

解题--有关动态内存开辟 几道经典的笔试题

文章目录 前言 一、题目一 二、题目二 三、题目三 四、题目四 总结 前言 路漫漫其修远兮&#xff0c;吾将上下而求索。 一、题目一 运行Test 函数会出现什么样的结果&#xff1f; 在Test函数之中&#xff0c;首先创建了一个指针变量 str , 并将其赋值为NULL&#xff1b; …

查看HBA卡是否支持FC协议

cat /sys/class/fc_host/host*/port_name lspci | grep -i fibre # 看有无fibre channel控制器 官网查询 Emulex Lpe32000 https://docs.broadcom.com/doc/12357773 https://cn.genuinemodules.com/image/catalog/pdf/18/LPe32000.pdf

Python【2】问题

目录 模块与包是什么&#xff1f; 赋值、浅拷贝和深拷贝的区别&#xff1f; Python中如何生成随机数&#xff1f; Python中的os模块常用方法&#xff1f;□ os.path和sys.path分别表示什么意思&#xff1f;□ 赋值 read、readline和readlines的区别&#xff1f; 介绍一…

vTESTstudio系列13--vTESTstudio中的动态函数库介绍3

在上一篇文章中&#xff08;vTESTstudio系列12--vTESTstudio中的动态函数库介绍2&#xff09;&#xff0c;给大家介绍了如何通过osek_tp.dll的接口去发送诊断指令&#xff0c;本篇文章给大家介绍如何去处理诊断回复内容&#xff0c;确保实际的诊断回复是符合需求。Lets Go!!! …

Java项目: 基于SpringBoot+mysql在线文档管理系统(含源码+数据库+开题报告+答辩PPT+毕业论文)

一、项目简介 本项目是一套基于SpringBootmysql在线文档管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

VScode:前端开发中的常用快捷键和技巧

1.菜单栏 2.内容相关&#xff1a; 格式化文档 搜索文件名

海外盲盒APP系统开发,盲盒全球化发展机遇

盲盒全球化 近几年&#xff0c;盲盒在海外市场中迎来了爆发式增长&#xff0c;成为了一种新的潮流&#xff0c;拥有极高的人气&#xff0c;盲盒出海也已经成为了一个大风口&#xff0c;为我国盲盒市场带来了商业机遇&#xff01;在盲盒出海的热潮下&#xff0c;海外盲盒APP系统…

相亲交友系统开发中的关键要素

相亲交友系统开发旨在构建一个在线平台&#xff0c;专为单身人士设计&#xff0c;以促进他们寻找合适的伴侣或朋友。以下是该系统开发的关键要素&#xff1a; 用户账户管理&#xff1a;允许用户创建账户&#xff0c;进行注册和登录&#xff0c;以便他们能够建立个人资料并参与…

01:【铁头山羊stm32-HAL库】对GPIO的操作

对GPIO的操作 1、LED闪烁2、按键控制LED3、芯片调试接口被锁死导致无法下载程序 1、LED闪烁 使用的是STM32CubeMXKeilv5进行HAL库的开发。 开发的步骤&#xff1a; 第一步&#xff1a;新建工程 第二步&#xff1a;选择芯片 第三步&#xff1a;如下图哈哈 第四步&#xff1a;…

图像去噪实验:基于全变分(TV)模型的MATLAB实现

一、背景 全变分模型在图像处理领域中被广泛用于去除噪声&#xff0c;同时保持图像边缘的清晰度。 二、实验步骤 图像的读取、噪声添加、去噪处理以及结果的显示。 三、实验仿真结果图 四、结论 全变分模型是一种有效的图像去噪方法&#xff0c;它能够在去除噪声的同时&#…

shell脚本的变量与应用

Shell脚本是一种解释性语言&#xff0c;用于编写自动化任务和系统管理脚本。在Shell脚本中&#xff0c;变量用于存储和操作数据。变量在脚本中可以被赋值、读取和修改。 在shell脚本中&#xff0c;变量用于存储数据&#xff0c;可以是数字、字符串或其他类型的值。可以使用…

基于yolov8的道路病害道路裂缝道路坑洞检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的道路病害检测系统&#xff0c;特别是针对道路裂缝和坑洞的检测&#xff0c;是一种高效、准确的智能解决方案。该系统利用YOLOv8这一先进的深度学习算法&#xff0c;通过深度神经网络对图像进行特征提取和分类&#xff0c;实现对道路病害的实时检测和…

期权会不会爆仓?如果期权亏了,会亏到倒欠吗?!

今天带你了解期权会不会爆仓&#xff1f;如果期权亏了&#xff0c;会亏到倒欠吗&#xff1f;&#xff01;期权作为一种金融衍生工具&#xff0c;已经被广大的投资者所接受&#xff0c;并广泛地应用于风险管理等诸多领域。 期权会爆仓吗&#xff1f; 对于期权而言&#xff0c;…

杭州网站建设网页手机版

杭州作为中国的电子商务之都&#xff0c;网站建设在杭州可谓是异常繁荣。随着移动互联网的兴起&#xff0c;越来越多的企业开始注重网页的手机版建设&#xff0c;以满足用户在移动设备上的浏览需求。杭州网站建设公司也专门针对手机版网页进行优化&#xff0c;提供更好的用户体…