大数据Doris(二十五):Doris数据Binlog Load导入方式介绍

news2024/11/23 3:05:32

文章目录

Doris数据Binlog Load导入方式介绍

一、基本原理

二、Canal原理及配置

1、Canal同步MySQL数据原理

2、开启MySQL binlog

3、Canal配置及启动

三、Doris同步MySQL数据案例

1、MySQL中创建源表

2、Doris中创建目标表

3、创建同步作业

四、注意事项

1、关于配置

2、关于注意点


Doris数据Binlog Load导入方式介绍

Binlog Load提供了一种使Doris增量同步用户在Mysql数据库的对数据更新操作的CDC(Change Data Capture)功能。针对MySQL数据库中的INSERT、UPDATE、DELETE、过滤Query支持,暂不兼容DDL(Data Definition Language)语句。

一、基本原理

当前版本设计中,Binlog Load需要依赖canal作为中间媒介,让canal伪造成一个从节点去获取Mysql主节点上的Binlog并解析,再由Doris去获取Canal上解析好的数据,主要涉及Mysql端、Canal端以及Doris端,总体数据流向如下:

如上图,用户向FE提交一个数据同步作业,FE会为每个数据同步作业启动一个canal client,来向canal server端订阅并获取数据。

client中的receiver将负责通过Get命令接收数据,每获取到一个数据batch,都会由consumer根据对应表分发到不同的channel,每个channel都会为此数据batch产生一个发送数据的子任务Task。

在FE上,一个Task是channel向BE发送数据的子任务,里面包含分发到当前channel的同一个batch的数据。

channel控制着单个表事务的开始、提交、终止。一个事务周期内,一般会从consumer获取到多个batch的数据,因此会产生多个向BE发送数据的子任务Task,在提交事务成功前,这些Task不会实际生效。

满足一定条件时(比如超过一定时间、达到提交最大数据大小),consumer将会阻塞并通知各个channel提交事务。 当且仅当所有channel都提交成功,才会通过Ack命令通知canal并继续获取并消费数据 。如果有任意channel提交失败,将会重新从上一次消费成功的位置获取数据并再次提交( 已提交成功的channel不会再次提交以保证幂等性 )。

整个数据同步作业中,FE通过以上流程不断的从canal获取数据并提交到BE,来完成数据同步。

二、Canal原理及配置

Canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。

早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。

当前的canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x。

Canal目前没有独立的官网,可以在GitHub上下载和查看Canal文档,地址如下:Home · alibaba/canal Wiki · GitHub

  • Canal Server架构如下 :

  • server 代表一个 canal 运行实例,对应于一个 jvm。
  • instance 对应于一个数据队列 (1个 canal server 对应 1..n 个 instance )
  • instance 下的子模块
    • eventParser: 数据源接入,模拟 slave 协议和 master 进行交互,协议解析
    • eventSink: Parser 和 Store 链接器,进行数据过滤,加工,分发的工作
    • eventStore: 数据存储
    • metaManager: 增量订阅 & 消费信息管理器

1、Canal同步MySQL数据原理

Canal同步MySQL数据工作原理如下图所示:

  • MySQL主备复制原理
  1. MySQL master 将数据变更写入二进制日志( binary log, 其中记录叫做二进制日志事件binary log events,可以通过 show binlog events 进行查看)
  2. MySQL slave 将 master 的 binary log events 拷贝到它的中继日志(relay log)
  3. 注意:中继日志是从服务器I/O线程将主服务器的二进制日志读取过来,记录到从服务器本地文件,然后从服务器SQL线程会读取relay-log日志的内容并应用到从服务器,从而使从服务器和主服务器的数据保持一致。
  4. MySQL slave 重放 relay log 中事件,将数据变更反映它自己的数据
  • canal 工作原理
  1. canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议
  2. MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal )
  3. canal 解析 binary log 对象(原始为 byte 流)

注意:mysql-binlog是MySQL数据库的二进制日志,记录了所有的DDL和DML(除了数据查询语句)语句信息。一般来说开启二进制日志大概会有1%的性能损耗。

 

2、开启MySQL binlog

对于自建MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,开启Mysql binlog日志步骤如下:

2.1、登录mysql查看MySQL是否开启binlog日志

[root@node2 ~]# mysql -u root -p123456
mysql> show variables like 'log_%';

2.2、开启mysql binlog日志

在/etc/my.cnf文件中[mysqld]下写入以下内容:

[mysqld]
# 随机指定一个不能和其他集群中机器重名的字符串,配置 MySQL replaction 需要定#义,不要和 canal 的 slaveId 重复
server-id=123 

#配置binlog日志目录,配置后会自动开启binlog日志,并写入该目录
log-bin=/var/lib/mysql/mysql-bin

# 选择 ROW 模式
binlog-format=ROW

MySQL binlog-format有三种模式:Row、Statement 和 Mixed 。

  • Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。

优点: binlog中可以不记录执行的sql语句的上下文相关的信息,仅需要记录那一条记录被修改成什么了。所以row level的日志内容会非常清楚的记录下每一行数据修改的细节。

缺点:所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容,比如一条update语句,修改多条记录,则binlog中每一条修改都会有记录,这样造成binlog日志量会很大,特别是当执行alter table之类的语句的时候,由于表结构修改,每条记录都发生改变,那么该表每一条记录都会记录到日志中。

  • Statement(默认):每一条会修改数据的sql都会记录在binlog中。

这种模式下,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。

优点:不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。

缺点:由于只记录语句,所以,在statement level下 已经发现了有不少情况会造成MySQL的复制出现问题,主要是修改数据的时候使用了某些定的函数或者功能的时候会出现。 例如:update 语句中含有uuid() ,now() 这种函数时,Statement模式就会有问题(update t1 set xx = now() where xx = xx)

  • Mixed: 混合模式

在Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志格式,也就是在Statement和Row之间选择一种。如果sql语句确实就是update或者delete等修改数据的语句,那么还是会记录所有行的变更。

2.3、重启mysql 服务,重新查看binlog日志情况

3、Canal配置及启动

这里所说的Canal安装与配置,首先需要在Canal中配置CanalServer 对应的canal.properties,这个文件中主要配置Canal对应的同步数据实例(Canal Instance)位置信息及数据导出的模式,例如:我们需要将某个mysql中的数据同步到Kafka中,那么就可以创建一个“数据同步实例”,导出到Kafka就是一种模式。其次,需要配置Canal Instance 实例中的instance.properties文件,指定同步到MySQL数据源及管道信息。

这里我们将MySQL数据同步到Doris中,只需要在canal.properties文件中配置Doris destination名称即可,Canal可以根据该destination名字找到对应的Canal instance实例的配置信息,对应的instance目录中,配置instance.properties 指定同步MySQL的源及数据管道相关信息。

Canal详细安装步骤及配置如下:

3.1、下载Canal

Doris使用Canal建议使用canal 1.1.5及以上版本,Cannal下载地址如下:Releases · alibaba/canal · GitHub

这里选择Canal 1.1.6版本下载

3.2、上传解压

将下载好的Canal安装包上传到node3节点上,解压

#首先创建目录 “/software/canal”
[root@node3 ~]# mkdir -p /software/canal
#将Canal安装包解压到创建的canal目录中
[root@node3 ~]# tar -zxvf /software/canal.deployer-1.1.6.tar.gz  -C /software/canal/

3.3、关于配置canal.properties

Canal同步到消息队列时,需要配置CANAL_HOME/conf中canal.properties文件“canal.destinations”配置型,指定destinations 信息,多个destination使用逗号隔开,启动Canal后,Canal会根据配置的 destination名字在CANAL_HOME/conf/${destination}目录下找到对应的instance .properties实例配置,进一步找到同步的MySQL源信息,进行CDC数据同步。

如果是Doris同步Mysql数据,在Doris中启动Doris同步作业时需要指定对应的destination 名称,所以这里不必单独再配置$CANAL_HOME/conf中canal.properties文件指定destination名称。

3.4、配置Canal instance实例信息

#在$CANAL_HOME/conf中创建doris目录作为instance的根目录,该目录名需要与创建的Doris job 中指定的destination名称保持一致。
[root@node3 ~]# cd /software/canal/conf/
[root@node3 conf]# mkdir doris

#复制$CANAL_HOME/conf/example目录中的instance.properties到创建的doris目录中
[root@node3 conf]# cd /software/canal/conf/
[root@node3 conf]# cp ./example/* ./doris/

#配置instance.properties,只需要配置如下内容:
[root@node3 doris]# vim /software/canal/conf/doris/instance.properties 

## canal instance serverId
canal.instance.mysql.slaveId = 1234
## mysql adress
canal.instance.master.address = node2:3306 
## mysql username/password
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal

 

3.5、配置doris instance 实例连接mysql的权限

Canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限 ,授权Canal连接MySQL具有作为MySQL slave的权限:

mysql> CREATE USER canal IDENTIFIED BY 'canal'; 
mysql> GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';  
mysql> FLUSH PRIVILEGES;
mysql> show grants for 'canal' ;

3.6、启动Canal Server

进入$CANAL_HOME/canal/bin 目录中,执行”startup.sh”脚本启动Canal:

#启动Canal
[root@node3 ~]# cd /software/canal/bin/
[root@node3 bin]# ./startup.sh 

#查看对应的Canal 进程
[root@node3 bin]# jps
...
18940 CanalLauncher
...

注意:如果启动canal后没有对应的进程,可以在CANALH​OME/logs/{destination}/${destination}.log中查看对应的报错信息。

三、Doris同步MySQL数据案例

下面步骤演示使用Binlog Load 来同步MySQL表数据,需要的Canal已经配置完成,只需要经过MySQL中创建源表、Doris创建目标表、创建同步作业几个步骤即可完成数据同步。详细步骤如下:

1、MySQL中创建源表

在MySQL中创建表source_test作为Doris同步MySQL数据的源表,MySQL建表语句如下:

mysql> create database demo;
mysql> create table demo.source_test (id int(11),name varchar(255));

2、Doris中创建目标表

在Doris端创建好与Mysql端对应的目标表,Binlog Load只能支持Unique类型的目标表,且必须激活目标表的Batch Delete功能(建表默认开启), Doris目标表结构和MySQL源表结构字段顺序必须保持一致 :

#node1连接Doris
[root@node1 bin]# ./mysql -u root -P 9030 -h 127.0.0.1

#建库及目标表
mysql> create database mysql_db
mysql> create table mysql_db.target_test (
    -> id int(11),
    -> name varchar(255)
    -> ) engine = olap
    -> unique key (id)
    -> distributed by hash(id) buckets 8;

3、创建同步作业

在Doris中 创建同步作业的语法格式如下:

CREATE SYNC [db.]job_name
(
channel_desc, 
column_mapping
...
)
binlog_desc
  • job_name

job_name是数据同步作业在当前数据库内的唯一标识,相同job_name的作业只能有一个在运行。

  • channel_desc

channel_desc用来定义mysql源表到doris目标表的映射关系。在设置此项时,如果存在多个映射关系,必须满足mysql源表应该与doris目标表是一一对应关系,其他的任何映射关系(如一对多关系),检查语法时都被视为不合法。

  • column_mapping

column_mapping主要指mysql源表和doris目标表的列之间的映射关系,如果指定,写的列是目标表中的列,即:源表这些列导入到目标表对应哪些列;如果不指定,FE会默认源表和目标表的列按顺序一一对应。但是我们依然建议显式的指定列的映射关系,这样当目标表的结构发生变化(比如增加一个 nullable 的列),数据同步作业依然可以进行。否则,当发生上述变动后,因为列映射关系不再一一对应,导入将报错。

  • binlog_desc

binlog_desc中的属性定义了对接远端Binlog地址的一些必要信息,目前可支持的对接类型只有canal方式,所有的配置项前都需要加上canal前缀。有如下配置项:

canal.server.ip: canal server的地址。
canal.server.port: canal server的端口,默认是11111。
canal.destination: 前文提到的instance的字符串标识。
canal.batchSize: 每批从canal server处获取的batch大小的最大值,默认8192。
canal.username: instance的用户名。
canal.password: instance的密码。
canal.debug: 设置为true时,会将batch和每一行数据的详细信息都打印出来,会影响性能。

 在Doris中创建同步作业,命令如下:

CREATE SYNC mysql_db.job
(
FROM demo.source_test INTO target_test
(id,name)
)
FROM BINLOG
(
"type" = "canal",
"canal.server.ip" = "node3",
"canal.server.port" = "11111",
"canal.destination" = "doris",
"canal.username" = "canal",
"canal.password" = "canal"
);

注意:target_test 不能指定对应的库名,默认该目标表就是当前所在的库。

以上执行完成之后,可以通过执行如下命令,查看执行的job任务:

#查看执行的job任务 ,可以查看到对应提交的job 状态为运行。
mysql> show sync job;
...
 23067 | job     | CANAL | RUNNING   ...
...

向MySQL源表中插入如下数据,同时在Doris中查询对应的目标表,可以看到MySQL中的数据被监控到Doris目标表中。

#node2节点中,向MySQL源表demo.source_test表 中插入如下数据
mysql> insert into source_test values (1,"zs"),(2,"ls"),(3,"ww");

#node1节点通过Mysql客户端查看同步结果,可以看到数据同步成功。
mysql> select * from target_test;
+------+------+
| id   | name |
+------+------+
|    3 | ww   |
|    2 | ls   |
|    1 | zs   |
+------+------+

#node2节点中,对MySQL源表删除数据
mysql> delete from source_test where id =1;
#node1节点通过Mysql客户端查看同步结果,可以看到数据同步成功。
mysql> select * from target_test;
+------+------+
| id   | name |
+------+------+
|    2 | ls   |
|    3 | ww   |
+------+------+

如果想要暂停、停止、重新执行同步任务的job,可以执行如下命令:

#暂停同步任务,jobname为提交的job名称
PAUSE SYNC JOB jobname;

#停止同步任务,jobname为提交的job名称
STOP SYNC JOB jobname;

#重新执行同步任务,jobname为提交的job名称
RESUME SYNC JOB jobname;

四、注意事项

1、关于配置

下面配置属于数据同步作业的系统级别配置,主要通过修改 fe.conf 来调整配置值。

  • sync_commit_interval_second

默认10s,提交事务的最大时间间隔。若超过了这个时间channel中还有数据没有提交,consumer会通知channel提交事务。

  • min_sync_commit_size

提交事务需满足的最小event数量。若Fe接收到的event数量小于它,会继续等待下一批数据直到时间超过了 sync_commit_interval_second 为止。默认值是10000个events,如果你想修改此配置,请确保此值小于canal端的 canal.instance.memory.buffer.size配置(默认16384),否则在ack前Fe会尝试获取比store队列长度更多的event,导致store队列阻塞至超时为止。

  • min_bytes_sync_commit

提交事务需满足的最小数据大小。若Fe接收到的数据大小小于它,会继续等待下一批数据直到时间超过了sync_commit_interval_second为止。默认值是15MB,如果你想修改此配置,请确保此值小于canal端的canal.instance.memory.buffer.size和canal.instance.memory.buffer.memunit的乘积(默认16MB),否则在ack前Fe会尝试获取比store空间更大的数据,导致store队列阻塞至超时为止。

  • max_bytes_sync_commit

提交事务时的数据大小的最大值。若Fe接收到的数据大小大于它,会立即提交事务并发送已积累的数据。默认值是64MB,如果你想修改此配置,请确保此值大于canal端的canal.instance.memory.buffer.size和canal.instance.memory.buffer.memunit的乘积(默认16MB)和min_bytes_sync_commit。

  • max_sync_task_threads_num

默认10个,数据同步作业线程池中的最大线程数量。此线程池整个FE中只有一个,用于处理FE中所有数据同步作业向BE发送数据的任务task,线程池的实现在SyncTaskPool类。

2、关于注意点

  •   数据同步作业并不能禁止alter table的操作,当表结构发生了变化,如果列的映射无法匹配,可能导致作业发生错误暂停,建议通过在数据同步作业中显式指定列映射关系,或者通过增加 Nullable 列或带 Default 值的列来减少这类问题。
  • 删除doris 目标表后,数据同步作业会被EF的定时调度停止。
  • doris中多个数据同步作业不能配置相同的ip:port+destination,主要为了防止出现多个作业连接到同一个instance的情况。
  • Doris本身浮点类型的精度与Mysql不一样,所以数据同步时浮点类型的数据精度在Mysql端和Doris端不一样,可以选择用Decimal类型代替。  

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

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

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

相关文章

关于我用python下载两千四百四十四章保存txt这件事。。。

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 女同事最近迷上了一本书 但她又不想下载软件,就想要我给你下载成txt慢慢看 一看章节,两千四百四十四章,这我能答应嘛? 面对美女小姐姐的请求,我当场表示&#xff1…

看ChatGPT是如何教我爬取上千家上市公司的股票代码

现在有一个这样的需求,要爬取雪球网上A股的股票名称、代码和总市值这些信息并把它保存到execl表格中。对于一个新手想学习爬虫,如何通过chatGPT来完成这个任务呢? 首先,我们把自己的需求详细的描述向ChatGPT提问,问题…

数据库可视化神器,你在用哪一款呢

唠嗑部分 在我们日常开发中,作为开发者,与数据库是肯定要打交道的,比如MySQL,Oracle、sqlserver… 那么数据库可视化工具,你用什么呢?小白今天将常用地几款工具列一下,各位小伙伴如有喜欢的自…

亚马逊开放个人卖家验证入口?亚马逊卖家验证到底怎么搞?

亚马逊卖家账户的安全对于所有卖家来说都非常重要。如果卖家想要在亚马逊上长期稳定地发展,赚取更多的钱并推出更多热卖产品,就必须确保他们的亚马逊卖家账户安全,特别是一直存在的亚马逊账户验证问题。 近期,根据亚马逊官方披露的…

【VPX302】基于3U VPX总线架构的高性能数据预处理平台/XCKU115

板卡概述 VPX302是一款基于3U VPX总线架构的高性能数据预处理FMC载板,板卡具有1个FMC(HPC)接口,1个X8 GTH背板互联接口,可以实现1路PCIe x8;具有4路SRIO X4。板卡采用Xilinx的高性能Kintex UltraScale系列F…

简单实现远程访问Linux SVN服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

以太网、工业以太网和Profinet之间的区别

总的来说,以太网是一种局域网规范,工业以太网是应用于工业控制领域的以太网技术,Profinet是一种在工业以太网上运行的实时技术规范。 下面,我们来详细说说这三者的区别。 1.以太网 以太网是当今现有局域网采用的最通用的通信协议…

数据可视化-CSS3

CSS3 数据可视化 数据可视化是将数据转换为图形或图表的过程,以便更好地理解和分析数据。它是数据分析和数据科学中的重要组成部分,可以帮助人们更好地理解数据中的模式和趋势。 更好地理解数据:通过可视化数据,人们可以更好地…

告别腾讯企业邮箱:探寻多种可替代方案

腾讯企业邮箱凭借其直观的界面、qq和微信带来的大量基础用户以及作为常规腾讯企业邮箱帐户附加的各种免费生产力工具,在企业邮箱市场占据主导地位。但是,人们对腾讯如何使用您的电子邮件存在严重担忧,而且并不是每个人都喜欢腾讯企业邮箱界面…

ngrok实现内网穿透,vue项目invalid host header报错

目的:使自己的本地的vue项目可以在外网上访问。 本地访问:http://localhost:8080/ 外网访问:通过ngrok生成一个链接,这个链接在其他网络环境下都可以访问。 windows下安装 1.注册并下载ngrok,注册的时候需要验证码&am…

动手学习卷积神经网络(CNN)(一)---卷积运算

卷积神经网络可以直接从原始数据中学习其特征表示并完成最终任务,可以说卷积网络是“端”到“端”的思想,在整个学习流程中并进行认为的子问题划分,而是交给深度学习模型直接学得从原始输入到期望输出得映射。 卷积神经网络是包含卷积层&…

一个BLIP2加两个ChatGPT就能造一个机器人?KAUST提出具身智能框架LLM-Brain

最近,来自阿卜杜拉国王科技大学(KAUST)的研究团队开发了一种基于现有LLMs的机器人交互框架LLM-Brain,LLM-Brain可以直接将LLM作为机器人的大脑,并以此来构建一个以自我为中心的记忆和控制框架。 论文链接: …

【笔试强训选择题】Day18.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

红队工具合集

一个 Red Team 攻击的生命周期,整个生命周期包括: 信息收集、攻击尝试获得权限、持久性控制、权限提升、网络信息收集、横向移动、数据分析(在这个基础上再做持久化控制)、在所有攻击结束之后清理并退出战场。 相资 信息搜集 http…

自信裸辞:一晃 ,失业都3个月了.....

最近,找了很多软测行业的朋友聊天、吃饭 ,了解了一些很意外的现状 。 我一直觉得他们技术非常不错,也走的测开/管理的路径;二三月份裸辞的,然后一直在找工作,现在还没找到工作 。 经过我的分析&#xff0…

OpenVINO 2022.3实战三:POT API实现图像分类模型 INT8 量化

OpenVINO 2022.3实战三:POT API实现图像分类模型 INT8 量化 1 准备需要量化的模型 这里使用我其他项目里面,使用 hymenoptera 数据集训练好的 MobileNetV2 模型,加载pytorch模型,并转换为onnx。 import os from pathlib import…

鸿蒙Hi3861学习十八-DevEco Device Tool环境搭建

一、简介 在之前的文章中,我们是通过在windows下烧录,在ubuntu下编译的方式进行开发。今天我们同样是采用windowsubuntu混合环境进行开发。为什么要采用这种方式呢?因为就目前而言,大部分的开发板还不支持在Windows环境下进行编译…

典型的高可用设计(二):MySQL

一、高可用模式 MySQL数据库提供了数据库建的复制能力,做到了多个数据库同时拥有同一个数据副本,保证了数据的安全性,一台数据库服务器出现问题,其他数据库可以做到数据不丢失。MySQL的服务高可用设计也是以数据库复制能力为基础&…

云计算专业怎么样,大学应届生学的话难不难?

云计算专业学起来挺难的,一般人建议不要轻易尝试!!! 虽然IT行业一直以来发展前景、技术更新、新领域的开发或者新概念的提出等各方面都还不错,云计算也是当下非常火的一个就业方向,很多人也非常想进入云计…

IT系统方案大纲模版,以智慧工地系统为例

# 咖米智慧工地解决方案 ## 第1章 智慧工地系统概述 ### 1.1应用背景 ### 1.2需求分析 ### 1.3总体目标 ## 第2章 系统总体设计 ### 2.1设计理念 ### 2.2设计依据 ### 2.3设计架构 ### 2.4系统描述 ### 2.5系统特点 ## 第3章 详细设计 ### 3.1工地远程监控子系统 #### 3.1.1需求…