```
"replication_allocation"="tag.location.group_a:1, tag.location.group_b:1, tag.location.group_c:1"
第四步:设置用户的资源使用权限,来限制某一用户的查询只能使用其指定资源组中的节点来执行。
set property for 'flume_etl' 'resource_tags.location' = 'group_a';
set property for 'cdc_etl' 'resource_tags.location' = 'group_b';
set property for 'etl' 'resource_tags.location' = 'group_c';
set property for 'mkui_readonly' 'resource_tags.location' = 'group_a';
set property for 'SaaS_readonly' 'resource_tags.location' = 'group_a, group_b, group_c';
set property for 'dev' 'resource_tags.location' = 'group_b';
值得一提的是,与社区交流中我们得知在即将发布的 Apache Doris 2.0 版本中还基于 Pipeline 执行引擎增加了 Workload Group 能力。该能力通过对 Workload 进行分组管理,以保证内存和 CPU 资源的精细化管控。通过将 Query 与 Workload Group 相关联,可以限制单个 Query 在 BE 节点上的 CPU 和内存资源的百分比,并可以配置开启资源组的内存软限制。当集群资源紧张时,将自动 Kill 组内占用内存最大的若干个查询任务以减缓集群压力。当集群资源空闲时,一旦 Workload Group 使用资源超过预设值时,多个 Workload 将共享集群可用空闲资源并自动突破阙值,继续使用系统内存以保证查询任务的稳定执行。更详细的 Workload Group 介绍可以参考:https://doris.apache.org/zh-CN/docs/dev/admin-manual/workload-group/
create workload group if not exists etl_group
properties (
"cpu_share"="10",
"memory_limit"="30%",
"max_concurrency" = "10",
"max_queue_size" = "20",
"queue_timeout" = "3000"
);
批量建表
初始化完成 Doris 的建表映射往往需要构建许多表单,而单独建表低效且易出错。为此,我们根据官方文档的建议使用 Cloudcanal 进行表结构同步来批量建表,大大提高了数据初始化的效率。
建表时需要注意的是:以 MySQL 为例,MySQL 数据源映射到 Doris 表结构的过程中需要进行一定的表结构调整。在 MySQL 中varchar(n)
类型的字段长度是以字符个数来计算的,而 Doris 是以字节个数计算的。因此,在建表时需要将 Doris varchar 类型字段的长度调整到 MySQL 对应字段长度的 3 倍。在使用 Unique 模型时需要注意建表时 UNIQUE KEY 列要放在 Value 列前面声明,且保证有序排列和设置多副本配置。
除了以上方式,日前新发布的 Doris-Flink-Connector 1.4.0 版本中已集成了 Flink CDC、实现了从 MySQL 等关系型数据库到 Apache Doris 的一键整库同步功能,用户无需提前在 Doris 中建表、可以直接使用 Connector 快速将多个上游业务库的表结构及数据接入到 Doris 中。推荐大家尝试使用。相关链接:https://mp.weixin.qq.com/s/Ur4VpJtjByVL0qQNy_iQBw
计算实现
根据我们对架构 2.0 的规划,我们将所有计算转移在 Doris 中完成。然而在支撑实时和准实时的场景下,具体的技术实现会有所不同,主要区别如下:
实时计算
如上文提到我们会以实时数据采集 + Doris 视图模型的方式提供实时计算结果,而为了在计算过程中达到更高的数据时效支持,应该尽量减少不必要的数据冗余设计。如传统数据仓库会按照 ODS->DWD->DWS->ADS 等分层逐层计算落表。而在实时计算场景下可以适当进行裁剪,裁剪的依据为整体查询时效的满足情况。此外,在实际的业务场景中也会有多层视图嵌套调用的情况。
准实时计算
在业务能接受的准实时场景下(10分钟、30分钟、小时级),可以通过实体表单 + 微批任务实现计算,计算过程按照调度层级依赖关系逐层完成。
通过 Java UDF 生成增量/全量数据
在实际业务中,存在增量/全量的日、月、年等不同时间频度数据生成需求。我们通过 Doris 的 Java UDF 功能(1.2 版本后支持) + 调度系统传参的方式实现了一套脚本动态的生成增量/全量及日、月、年等不同的指标汇总。
实现思路:
period_type
:计算频度 D/W/M/Y 代表计算日、周、月、年
run_type
:INC(增量)/ DF(全量)是通过传递begin_date
,end_datel
来筛选 business_date
数据进行汇总。
增量满足:begin_date(对应计算频度开始日期) <= business_date <= end_date (对应计算频度结束日期)
全量满足:begin_date(写死一个业务最小日期) <= business_date <= end_date (对应计算频度结束日期)
基于以上思路实现etlbegindate
函数来返回不同计算频度下增量、全量的 begin_date
etlbegindate(run_type,period_type,end_date)
为了在统计不同频度时能够生成对应频度的识别id
字段,我们还需要实现一个periodid
函数
periodid(period_type,business_date)
该函数的主要功能为:
period_type = ‘D’ 返回 business_date 所在日, ‘YYYYMMDD’ 格式的 period_id 字段
period_type = ‘W’ 返回 business_date 所在周的起始日期, ‘YYYYMMDDYYYYMMDD’ 格式的 period_id 字段
period_type = ‘M’ 返回 business_date 所在月,‘YYYYMM’ 格式的 period_id 字段
period_type = ‘Y’ 返回 business_date 所在年,‘YYYY’ 格式的 period_id 字段
结合 etlbegindate
与 periodid
两个函数,假定当前时间为 2023 年 6 月 16 日则相应的实现如下:
SQL 脚本使用函数示例
-- 示例Demo
select ${period_type} as period_type -- 统计频度 D/W/M/Y
,period_id(${period_type},business_date) as period_id -- 时间频度ID
,count(goods_id) as goods_cnt -- 商品数
where business_date >= etlbegindate(${run_type},${period_type},${end_date})
and business_date <= ${end_date}
group by period_id
运行调度前参数配置:
任务运行结果示例:W/M/Y 是的实现方式一致,只是数据返回的 period_id
格式会按照上文描述的格式输出。
基于以上方法,我们高效地为公司 SaaS 产品构建了相应的数据指标库应用。
基于 Doris 的大表优化
我们的业务涉及基于用户页面访问和景区设备日志信息的统计分析业务,这类指标计算需要处理大量日志数据。接下来,我们将介绍如何利用 Doris 提供的功能对数据进行优化处理。
数据分区分桶:
Doris 支持两级分区,第一级叫做 Partition,支持 Range Partitioning 和 List Partitioning 两种分区策略。第二级分区叫做 Bucket,支持 Hash Partitioning 分区策略。
对于用户浏览行为的埋点事件表,我们按照时间做为分区(Range Partitioning):
在实际应用中,业务的历史冷数据可以按年进行分区,而近期的热数据可以根据数据量增幅按照日、周、月等进行分区。另外,Doris 自 1.2.0 版本后支持批量创建 RANGE 分区,语法简洁灵活。
从 Doris 1.2.2 版本开始,Doris 支持了自动分桶功能,免去了在分桶上面的投入,一个分桶在物理层面为一个 Tablet,官方文档建议 Tablet 大小在 1GB - 10GB 之内,Y因此对于小数据量分桶数不应太多。自动分桶的开启只需要建表时新增一个属性配置:
DISTRIBUTED BY HASH(openid) BUCKETS AUTO PROPERTIES ("estimate_partition_size" = "1G")
Like Query 和 SEQUENCE_COUNT 介绍
Like Query
在使用埋点日志数据进行漏斗分析时,需要针对某些特定 URL 数据进行汇总分析。这些 URL 中带有参数信息,以 String 或者 Varchar 类型存储为例,在计算过程中需要对含有特定参数的数据进行筛选。
根据该 Issue:https://github.com/apache/doris/pull/10355,我们了解到 Doris 对于 like/not like 有一定的优化处理,操作符可以下推到存储引擎进行数据过滤。因此在这个场景下,我们尝试使用 like 操作符对数据进行筛选处理。
另外在 Apache Doris 2.0 版本中将增加 Ngram BloomFilter 索引,使用该索引可以用来提升 Like Query 的性能,未我们也将进行升级使用。Doris 提供了gram_size
和 bf_size
两个参数进行配置,示例如下:
CREATE TABLE `test_ngrambf` (
`id` int(11),
`str` varchar(32),
INDEX idx_str (`str`) USING NGRAM_BF PROPERTIES("gram_size"="3", "bf_size"="256")
) ENGINE=OLAP
DUPLICATE KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 10
PROPERTIES (
"replication_num" = "1"
);
mysql> INSERT INTO test_ngrambf VALUES (1, 'hello world'), (2, 'ngram test');
Query OK, 2 rows affected (0.18 sec)
{'label':'insert_fbc5d3eca7204d52_965ce9de51508dec', 'status':'VISIBLE', 'txnId':'11008'}
mysql> SELECT * FROM test_ngrambf WHERE str LIKE '%hel%';
+------+-------------+
| id | str |
+------+-------------+
| 1 | hello world |
+------+-------------+
1 row in set (0.03 sec)
mysql> SELECT * FROM test_ngrambf WHERE str LIKE '%abc%';
Empty set (0.02 sec)
mysql> SELECT * FROM test_ngrambf WHERE str LIKE '%llm%';
Empty set (0.04 sec)
下面对 Ngram BloomFilter 索引的原理作简要介绍:
假如将“hello world"
存入 Bloom Filter 中,将gram_size
配置为 3,这时会将"hello world"
分为["hel", "ell", "llo",...]
分别进行存储,每个 gram 通过 N 个哈希函数 h1, h2, …, hn 映射到 Bloom Filter中,对应的索引值设为 1。当处理where column_name like 'hel'
这样的查询语句时,'hel'
会经过相同哈希函数的映射和 Bloom Filter 进行比较,如果映射出的索引和 Bloom Filter 的索引的值都是 1,那么判断'hel'
在Bloom Filter 中(True Positive),但也存在一定概率会将本来不在 Bloom Filter 中的元素判断为在集合中(False Positive),比如上图中的'llm'
,但将其判断为不在 Bloom Filter 中的元素(True Negative)一定不会存在,比如图中的过滤条件like 'abc'
。
在实际使用 Ngram BloomFilter 索引时有一些注意事项:
使用 Ngram BloomFilter 索引时需要根据实际查询情况合理配置gram_size
的大小。小的gram_size
支持搜索查询更多的 String,但是同时也带来更多数量的 ngram 和需要应用更多的哈希函数,这将会增大 False Positive 的概率。
因为存在 False Positive 的可能性,Ngram BloomFilter 索引不能被用来处理 column_name != 'hello'
或者 column_name not like '%hello%'
这样使用负运算符的过滤条件。
SEQUENCE_COUNT
针对用户留存或漏斗分析等指标的计算,可以使用 Doris 提供的 SEQUENCE_COUNT(pattern, timestamp, cond1, cond2, ...)
函数。这里 pattern
参数用来指定用户一系列浏览行为的事件链,比如:
-- 计算用户浏览商品、加入购物车以及支付这一连串事件的数量
SELECT SEQUENCE_COUNT('(?1)(?2)(?3)', timestamp, event = 'view_product', event = 'add_cart', event = 'pay') FROM user_event;
通过 SEQUENCE_COUNT
可以非常方便地计算我们指定的事件链的数量。
Doris Borker 的协同计算
业务中存在部分大数据量的历史数据统计需求,针对这部分需求我们进行了协同计算处理
FlinkCDC 读取 Binglog 实时同步数据到 Doris 明细表
Doris 明细表会存储近 30 日热数据(需要进行 TTL 管理)
Doris 每日通过 Borker Export 同步一份日增量数据至 HDFS,并加载至 Hive 中
Hive 中储存所有明细数据,数据初始化生成计算结果在 Hive 中完成 Borker Load 至 Doris
Doris 在生成结果数据时仅生成当前日期数据,每天的增量生成沉淀为历史结果
当业务有需要时通过 Borker Export 加载 Hive 全量计算结果刷新 Doris 结果表
当业务有基于此明细数据的新开发需求时,可在 Hive 中计算完成初始化结果至 Doris
数据导出(Export): Export 是 Doris 提供的一种将数据导出的功能。该功能可以将用户指定的表或分区的数据以文本的格式,通过 Broker 进程导出到远端存储上,如 HDFS 或对象存储(支持 S3 协议) 等。用户提交一个 Export 作业后,Doris 会统计这个作业涉及的所有 Tablet,然后对这些 Tablet 进行分组,每组生成一个特殊的查询计划。这些查询计划会读取所包含的 Tablet 上的数据,然后通过 Broker 将数据写到远端存储指定的路径中。
数据导入(Broker load): Broker Load 是 Doris 的一种异步数据导入方式,可以导入 Hive、HDFS 等数据文件。Doris 在执行 Broker Load 时占用的集群资源比较大,一般适合数据量在几十到几百 GB 级别下使用。同时需要注意的是单个导入 BE 最大的处理量为 3G,如果超过 3G 的导入需求就需要通过调整B roker Load 的导入参数来实现大文件的导入。
联邦查询在数据分析场景下的尝试
由于上游数据源较多,我们仅对常用的数据表单进行了数据仓库采集建模,以便更好地进行管理和使用。对于不常用到的数据表单,我们没有进行入仓,但业务方有时会临时提出未入仓数据的统计需求,针对这种情况,我们可以通过 Doris 的 Multi-Catalog 进行快速响应、完成数据分析 ,待需求常态化后再转换成采集建模的处理方式。
Multi-Catalog 是 Doris 1.2.0 版本中推出的重要功能。该功能支持将多种异构数据源快速的接入 Doris,包括 Hive、Iceberg、Hudi、MySQL、Elasticsearch 和 Greenplum 等。使用 Catalog 功能,可以在 Doris 中统一的完成异构数据源之间的关联计算。Doris 1.2.0 以后的版本官方推荐通过 Resource 来创建 Catalog,这样在多个使用场景下可以复用相同的 Resource。下面是 Doris 本地表与通过 Multi-Catalog 映射的远程表单组合完成关联计算的场景示例。
Multi-Catalog 带来的收益:
更高的灵活性:通过 Multi-Catalog,用户可以灵活地管理不同数据源的数据,并在不同的数据源之间进行数据交换和共享。这可以提高数据应用的可扩展性和灵活性,使其更适应不同的业务需求。
高效的多源管理:由于 Multi-Catalog 可以管理多个数据源,用户可以使用多个 Catalog 来查询和处理数据,解决了用户跨库访问不便的问题,从而提高数据应用的效率。
社区中已经有非常多的伙伴基于 Multi-Catalog 功能落地了应用场景。另外如果要深度使用该功能,建议建立专门用于联邦计算的 BE 节点角色,当查询使用 Multi-Catalog 功能时,查询会优先调度到计算节点。
运维保障
守护进程
为了保障 Doris 进程的持续运行,我们按照 Doris 官网的建议在生产环境中将所有实例都的守护进程启动,以保证进程退出后自动拉起。我们还安装部署了Supervisor 来进行进程管理,Supervisor 是用 Python 开发的一套通用的进程管理程序,可以将一个普通的命令行进程变为后台 Daemon 并监控进程状态,当进程异常退出时自动重启。使用守护进程后,Doris 的进程变成了 Supervisor 的子进程,Supervisor 以子进程的 PID 来管理子进程,并可以在异常退出时收到相应的信号量。
配置 Supervisor 时的注意事项:
通过 supervisorctl status
查询出来的进程 id 不是 Fe、Be、Broker 的进程 ID,而是启动它们的 Shell 进程 ID。在 start_xxx.sh
中会启动真正的 Doris 进程,因此才有了进程树的说法。
stopasgroup=true ;
是否停止子进程、killasgroup=true ;
是否杀死子进程,需要保证这两个参数为true
,否则通过 supervisorctl
控制 Doris 的后台进程是无效的,这也是通过 Supervisor 守护 Doris 进程的关键。
配置完 Supervisor 后则通过守护进程的方式来管理 FE、BE、Borker……
由于 Superviosr 自带的 Web UI 不支持跨机器管理,当多节点时管理非常不便,这里可以使用 Cesi 来对 Supervisor 进行合并管理:
Grafana 监控报警
关于 Doris 的运行监控,我们按照官网相关内容部署了 Prometheus 和 Grafana ,并进行监控项的采集。同时对于一些关键指标进行了预报警,利用企微 Bot 完成信息推送。
以下为测试环境示例图:
集群CPU空闲情况:
集群内存使用情况: 之前发现集群存在内存泄露
BDBJE 写入情况: 超过秒级可能会出现元数据写入延迟的问题
开始调度运行的 Tablet 数量: 正常情况该值基本为 0 或个位数,出现波动的 Tablet 说明可能在进行 Recovery 或 Balance。
除此之外,我们还使用 QPC/99th Latency……等指标来查看监测集群服务能力,建议可以在 Doris 监控的基础上额外加入集群机器的监控,因为我们的机器部署在VM中,曾经出现过硬盘问题、内存问题、网络波动、专线异常等情况,多一层报警机制就多一份稳定性保障。
总结收益
通过新架构的成功搭建,实现了以 Apache Doris 为核心数据仓库 + OLAP 引擎的使用方式(All in One),有效缩减了数据处理流程,大大降低了投递型项目的实施成本。在旧架构下,需要部署、适配、维护非常多的组件,无论是实施还是运维都会比较繁重。相比之下,新架构下的 Doris 易于部署、扩展和维护,组合方案也灵活多变。在我们近半年的使用时间内,Doris 运行非常稳定,为项目交付提供了强有力的计算服务保障能力。
此外,基于 Apache Doris 丰富的功能、完善的文档,我们可以针对离线和在线场景进行高效且细致的数据开发和优化。通过引入 Doris 我们在数据服务时效性方面也有了大幅提高,当前我们已经成功地落地了多个数据项目,并孵化出了一个基于 Doris 的 SaaS 产品。同时,Doris 拥有一个成熟活跃的社区,SelectDB 技术团队更是为社区提供了一支全职的技术团队,推动产品迭代、解决用户问题,也正是这强有力的技术支持,帮助我们更快上线生产,快速解决了我们在生产运用中遇到的问题。
未来规划
未来,我们将密切关注 Apache Doris 社区的发展,并计划构建基于 K8S 的 Doris 服务方式。在项目交付场景下,常常需要进行整套环境的部署。目前,我们已经在 K8S 上集成了 2.0 版本架构下除 Doris 以外的其他数据服务组件。随着 Doris 社区 2.0 版本全面支持 K8S 的计划,我们也会将方案集成到我们的新体系中,以方便后期的项目投递。除此之外,我们还将结合 Doris 的功能特性提炼基于 Doris 的数仓方法论,优化开发过程。Doris 是一个包容性非常好的存储计算引擎,而想要将原有的数据仓库开发内容全部适配在 Doris 上还需要不断的学习、优化与调整,以充分发挥 Doris 的优势,同时我们也将在此基础上沉淀一套与之相匹配的开发规范。
最后,我非常推荐大家使用 Apache Doris 作为数据项目的解决方案。它具有功能强大、包容性强、社区活跃、迭代更新快等优势,这些优势将助推你的项目达成目标。在此,我要感谢 Apache Doris 社区和 SelectDB 的同学们给予我们的支持和帮助,也祝愿 Apache Doris 社区越来越壮大。
你可能感兴趣的:(apache,大数据,数据库,后端)
SQL Server的个人学习笔记
萌尛喵
sql 学习 数据库
1.基础SQLServer是由Microsoft开发和销售的关系数据库管理系统或RDBMS。SQLServer建立于SOL之上,是一种用于关系数据交互的标准编程语言。2.组件SQLServer主要由数据库引擎和SQLOS两个组件组成。①数据库引擎SQLServer的核心组件是数据库引擎。数据库引擎由处理查询的关系引擎和管理数据库文件、页面、索引等的存储组成。数据库引擎也创建并执行数据库对象,如存储
什么是 Paxos和Raft
MonkeyKing.sun
paxos raft
Raft和Paxos是两种经典的分布式一致性算法(ConsensusAlgorithms),广泛应用于数据库、分布式系统、微服务架构中,用来确保在多个节点中即使有部分节点故障,系统仍然可以就“某一值”达成一致(即:分布式共识)。它们不是区块链专属,但在联盟链、私有链或数据库复制系统中常被用来替代PoW、PBFT等共识机制。一、什么是Paxos?定义:Paxos是一种保证在部分节点失效或网络延迟时,
SQLserver数据库学习笔记
溪衡
学习
小记1:1.newid()我觉得是一个生成唯一键的好方法,不用自增控制主键,可以用这个试试,注意不做处理的话,需要36位。例如:在数据库中直接使用语句selectnewid()2.nolock按我的理解是“不上锁的”,所谓的脏读,大多用的都是这个东西,据说可以提高查询速度。3.go批处理语句,将前面的代码作为一批处理。4.内连接与简单多表在数据量少的时候查询速度差距并不明显。5.删除和更新数据时,
SQL学习笔记1
1.数据库1、什么是数据库数据库(DB)即用于存放数据的服务器,如MySQL等软件是数据库管理系统(DBMS),用于管理存放在数据库中的数据,SQL是用于操作DBMS的标准语言。2、数据库的类型数据库分为关系型数据库和非关系型数据库;关系型数据库是指用建立在关系模型上互相关联的二维表组成的数据库,MySQL是用于管理关系型数据库的数据库管理系统2.MySQL启动与连接1、MySQL启动安装好MyS
Centos7.9+mysql8.0开启指定IP远程连接数据库
洋滔
服务器 数据库 tcp/ip mysql
公司服务器换了,需要重新搭建下web环境,在配置mysql远程连接的时候碰到了几个坑,之前也配置过,但这次由于mysql版本的不同,配置方法稍微不同,这里做个记录。首先是,创建mysql用户,命令如下CREATEUSER'jkxtc178'@'215.55.284.149';@‘IP’,如果你不想指定ip访问,使用%即可,下边的命令出现@'IP’的都是这样。然后是设置用户登陆密码:ALTERUSE
Learning PostgresSQL读书笔记: 第8章 Triggers and Rules
dingdingfish
PostgresSQL postgresql database architecture tutorial
本章将讨论以下内容:•探索PostgreSQL中的规则•管理PostgreSQL中的触发器•事件触发器探索PostgreSQL中的规则文档中的这段话阐述了rule和trigger的区别:PostgreSQL规则系统允许定义在数据库表中插入、更新或删除时执行的替代操作。粗略地说,当对给定表执行给定命令时,规则会执行其他命令。或者,INSTEAD规则可以用另一个命令替换给定命令,或者导致命令根本不执行
从台式电脑硬件架构看前后端分离开发模式
程序猿全栈の董
电脑 硬件架构 状态模式
在软件开发领域,前后端分离早已成为主流架构设计理念。它将系统的业务逻辑处理与用户界面展示解耦,提升开发效率与系统可维护性。有趣的是,我们日常生活中常见的台式电脑硬件架构,竟与这一理念有着异曲同工之妙。今天,就让我们从台式电脑的硬件组成出发,深入探讨其与前后端分离开发模式的内在联系。文章目录一、台式电脑硬件架构与前后端的类比1.1主机:后端的硬件化身1.2显示屏:前端的硬件呈现二、二者分离模式的共同
前端 E2E 测试实践:打造稳定 Web 应用的利器!
朱公子的Note
编程语言 前端 端到端E2E测试
在现代Web开发中,端到端(E2E)测试就像为应用程序配备了一面“照妖镜”,它模拟真实用户的操作流程,从用户点击到获得反馈的每一步都进行验证。想象一下,你刚刚完成了一个完美的登录功能,结果用户反馈“点了登录按钮没有反应”——这种“我以为OK其实不行”的问题,正是E2E测试要解决的。E2E测试并不止于前端界面,它涵盖了前端、后端及数据库等所有环节,确保每个节点都能正常工作。历史经验也提醒我们其重要性
《Redis高并发优化策略与规范清单:从开发到运维的全流程指南》
猕员桃
redis 运维 数据库
Redis高并发优化策略与规范清单:从开发到运维的全流程指南在互联网应用的后端架构中,Redis凭借其高性能、高并发的特性,成为缓存和数据存储的首选方案。无论是电商抢购、社交平台的点赞计数,还是在线旅游平台的实时数据查询,Redis都在支撑着海量请求的快速处理。然而,随着业务规模的扩大和流量的激增,Redis在高并发场景下也面临诸多挑战,如性能瓶颈、内存溢出、缓存雪崩等。为了确保Redis在高并发
手搓钉钉小程序登陆(借助RuoYi框架)
脑袋大大的
钉钉生态创业者专栏 钉钉 小程序
文章讲述如何在开发钉钉小程序的时候,实现免登陆功能,本系统基于RuoYiSpringBoot3版本测试,有些类找不到可以去RuoYi官网查看。前言钉钉小程序开发时,需要实现免登陆功能,即用户在钉钉小程序无需账号密码登录,后续进入小程序,也不需要再次登录。主要流程在钉钉小程序端获取authCode将authCode发送到服务器后端服务器获取AccessToken,通过authCode获取获取user
el-table合并行+数据按照相同名称排序+相同名称内的数据在排序
Web·强
elementui 遇到的问题 前端 java javascript
项目场景:项目需求:后端给我返回的数据:原因分析:后端数据所有的内容排列是无顺序的相同名称的不一定靠在一起图片只是巧合,如果按照后端返回的格式直接赋给表格的tabledata那么顺序就不是我们想要的,所以我们首先要把数据处理成我们想要的数据格式。①根据需求首先把数据里的相同名称进行排序然后在将相同名称里的版本从高到低排序②将名称相同的合并成一行并将序号也进行合并解决方案:需求①:this.tabl
校园志愿者系统前端代码实现及技术解析
创新工场
本文还有配套的精品资源,点击获取简介:本项目集中展示了Web开发中的关键技术和框架,包含PHP、Vue.js、ElementUI和Laravel在校园志愿者系统前台构建中的应用。首先,PHP用于后端开发,处理业务逻辑并与数据库交互。接着,Vue.js作为前端框架,实现交云动界面和用户交互。ElementUI提供企业级UI组件,加速开发流程,提高界面美观度。Laravel框架则用于搭建后端架构,处理
Tair向量数据库:阿里云原生内存数据库服务的高性能向量检索解决方案
mmlihaio
数据库 云原生 python
Tair向量数据库:阿里云原生内存数据库服务的高性能向量检索解决方案1.引言在当今的人工智能和大数据时代,高效的向量检索已成为许多应用场景的关键需求。Tair作为阿里云开发的云原生内存数据库服务,不仅提供了丰富的数据模型和企业级能力,还引入了基于非易失性内存(NVM)存储介质的持久内存优化实例。本文将深入探讨如何利用Tair向量数据库功能,实现高性能的向量存储和检索。2.Tair向量数据库概述Ta
前后端分离与不分离解析,很全面!
涔溪
前端
从多个维度对前后端分离与不分离进行更加深入、系统的分析,包括技术架构、开发流程、部署维护、性能优化、团队协作、适用场景等方面全面理解两者的区别和优劣。一、概念定义1.前后端不分离(传统服务端渲染)前端页面由服务器端生成并返回给浏览器,如PHP、JSP、ASP.NET等。前端逻辑和后端业务耦合在一起,通常一个请求对应一个完整的HTML页面。2.前后端分离(现代Web开发模式)前端独立开发为一个完整的
解锁阿里云E-MapReduce:大数据处理的超能力秘籍
云资源服务商
阿里云 云计算 人工智能 云原生
一、引言在数字化浪潮汹涌澎湃的当下,大数据已然成为推动各行业创新发展的核心驱动力。从电商平台精准的个性化推荐,到金融机构严密的风险评估,再到医疗领域高效的疾病预测,大数据的应用场景无处不在,深刻地改变着我们的生活与工作方式。在这片充满机遇与挑战的大数据领域中,阿里云E-MapReduce宛如一颗璀璨的明星,占据着举足轻重的地位。它凭借强大的大数据处理能力、卓越的性能表现以及丰富的功能特性,为企业和
SQL Server 中的 GO 及其与其他数据库的对比
杨云龙UP
三大数据库学习 数据库 sqlserver sql Oracle oracle MySQL mysql
在SQLServer中,GO不是SQL语言的一部分,而是一个批处理分隔符,用于分隔脚本中的多个SQL语句或执行块。它由SQLServerManagementStudio(SSMS)等工具处理,用来指示执行一个批次的SQL语句。1、SQLServer中的GO作用分隔批次(处理多批次脚本):将SQL脚本中的语句分成多个批次执行。每个GO表示一个独立的执行块。例如,在某些操作中,创建表的语句可能依赖于先
【MSSQL】sql server怎样整理某个表的碎片
厦门德仔
MSSQL sqlserver 数据库 服务器
SQLServer如何整理某个表的碎片在数据库的维护过程中,碎片化是一个常见的问题。随着数据的插入、更新和删除,SQLServer中的表和索引可能会出现碎片,这会导致查询性能下降。本文将介绍如何在SQLServer中整理某个表的碎片,并提供代码示例帮助你理解。什么是碎片化?碎片化是指数据在物理存储上不连续,导致数据库无法有效利用存储空间。碎片化通常分为两种类型:内部碎片:数据页中存在空闲空间,没有
HarmonyOS Next IM实战:数据库查询慢的优化过程分享
HarmonyOSNextIM实战:数据库查询慢的优化过程分享1、背景介绍在IMSDK开发中,客户端要使用关系型数据库存储会话、用户、消息等数据,最开始做C端应用一直没发现问题,今年开始有B端用户使用时反馈应用卡,消息延迟等,经过定位发现是B端用户的会话和消息更多,在数据库查询时更慢,由于之前都在主线程所以导致应用卡和慢。本文分享整个优化过程中的遇到问题、解决思路,最终效果等。2、HarmonyO
java课程设计体会_Java课程设计(阶段一)
XY LIU
java课程设计体会
1选题选题一算术运算测试题目要求实现十道100以内加减法数学题,能根据题目计算出答案,与输入答案对比,判断做题是否正确,最后计算分数。添加排行榜功能存放到文件或数据库中。使用Java知识String类IO:Reader、Writer类集合:ArrayLiastsort()方法选题二猜数游戏题目要求计算机产生随机数,猜中即胜,猜不中,提示是大了还是小了,继续猜,直至猜到,给出所用时间和评语。保留用户
Fiddler抓包工具在多端调试中的实战应用:结合Postman与Charles构建调试工作流
2501_91600747
http udp https websocket 网络安全 网络协议 tcp/ip
在如今前后端分离、接口驱动开发逐渐成为主流的背景下,开发者越来越依赖于各类调试工具,以应对复杂的网络请求管理、多设备调试和跨团队协作等问题。而在诸多网络分析工具中,Fiddler抓包工具以其功能全面、扩展灵活、支持HTTPS抓包和断点调试等特性,在开发者圈中拥有稳定的口碑。本文将从一个更贴近日常开发流程的角度,探讨如何在多端调试、接口测试、数据模拟等环节中,灵活运用Fiddler,并与Postma
移动端iOS调试与问题解决:WebView调试多工具协作
游戏开发爱好者8
http udp https websocket 网络安全 网络协议 tcp/ip
在开发过程中,调试工作不仅仅是前端开发者的职责。当出现复杂的线上问题,调试往往需要涉及到多个团队的协作:前端、后端、测试和运营等。尤其是在移动端WebView页面和原生页面混合开发中,调试工作通常是多部门之间的互动与配合。这篇文章分享了我们在一个社交平台项目中的调试实践,重点讲解了跨团队合作调试中的问题解决策略,并介绍了我们如何通过工具协同与有效沟通,解决了上线后部分用户出现的问题。背景:移动端W
windows mysql主从备份_windows下mysql主从备份设置
韩山云客
windows mysql主从备份
Windowsserver2008mysql主从数据设置步骤:一、安装MySQL说明:在两台MySQL服务器192.168.21.169和192.168.21.168上分别进行如下操作,安装MySQL5.5.22二、配置MySQL主服务器(192.168.21.169)mysql-uroot-p#进入MySQL控制台createdatabaseosyunweidb;#建立数据库osyunweidb
mysql主从备份_mysql实现主从备份
Lucas HC
mysql主从备份
mysql主从备份的原理:主服务器在做数据库操作的时候将所有的操作通过日志记录在binlog里面,有专门的文件存放。如localhost-bin.000003,这种,从服务器和主服务配置好关系后,通过I/O线程获取到这个binlog文件然后写入到从服务器的relaylog(中继日志)中,然后从服务器执行从服务器中的sql语句进行数据库的同步。实现:准备:两台服务器,mysql环境,可以是Windo
Mysql 主从备份
龙那个猫robot
数据库 mysql
英文好的可以直接去mysql官网查看https://dev.mysql.com/doc/refman/5.7/en/replication.html1环境准备我这里准备两套linux虚拟机,主mysql服务器,从mysql服务区ip192.168.1.30ip192.168.1.1001.1备份主mysql数据库1.2从数据库恢复主mysql数据库1.3配置主mysql服务器配置server-id
使用 Docker 部署 MySQL 8
使用Docker部署MySQL8详细指南MySQL是一个广泛使用的开源关系型数据库管理系统。通过Docker部署MySQL8可以快速搭建一个可移植、可扩展的数据库环境。本文将详细介绍如何使用Docker部署MySQL8,并讲解如何根据需求配置MySQL。从拉取镜像开始的详细步骤1.拉取MySQL8镜像首先,从DockerHub拉取MySQL8的官方镜像。dockerpullmysql:8.0mys
【SequoiaDB】4 巨杉数据库SequoiaDB整体架构
Alen_Liu_SZ
巨杉数据库 SequoiaDB架构 编目节点 协调节点 数据节点 巨杉数据库
1整体架构SequoiaDB巨杉数据库作为分布式数据库,由数据库存储引擎与数据库实例两大模块组成。其中,数据库存储引擎模块是数据存储的核心,负责提供整个数据库的读写服务、数据的高可用与容灾、ACID与发你不是事务等全部核心数据服务能力。数据库实例模块则作为协议与语法的适配层,用户可根据需要创建包括MySQL、PostgreSQL与SparkSQL在内的结构化数据实例;支持JSON语法的MongoD
软件测试从业者必备的SQL知识
十二测试录
数据库 sql 数据库
作为职场人,学一门技能是用来解决日常工作问题的,没必要从头到尾把这块知识弄透,没那么多时间。基于此,十二根据自己的经验,把软件测试从业者需要掌握的SQL知识,整理如下;只要跟着这个顺序,从头到尾执行即可。前置准备事项:1、在自己电脑上安装一个mysql数据库,文章见->虚拟机Centos下安装Mysql完整过程(图文详解)_虚拟机安装mysql-CSDN博客2、找一个mysql客户端链接工具:初学
平台再升级!接入DeepSeek AI,三大能力一键生成
橙武科技
低代码 AI deepseek 人工智能
在数字化项目落地过程中,很多企业都会面临相同的问题:数据库建模要写SQL表结构;业务流程需要画LogicFlow流程图;前端页面还要写AMISJSON配置。从想法到实现,中间至少要经历产品经理、架构师、后端、前端多轮沟通。每个环节都耗时,改起来还要推翻重来。demo地址:https://admin.cwcode.top✨我们的平台,现在直接整合了DeepSeekAI大模型只要输入一句需求,就能:✅
MySQL事务深度解析:原理、优化及最佳实践
木木丰
mysql mysql 数据库 java windows
MySQL中的事务(Transaction)是数据库操作的基本单位,它代表着一组逻辑上相互关联的操作,要么全部成功,要么全部失败。这种“要么全做,要么全不做”的特性确保了数据库的完整性和一致性。事务在MySQL中扮演着至关重要的角色,特别是在处理复杂业务逻辑和并发访问时。下面将详细探讨MySQL事务的概念、使用方法、注意事项以及在实际应用中的最佳实践。一、事务的概念事务是一个不可分割的工作逻辑单元
MCP-Proxy:开发多LLM & 多MCP 支持并安全访问MCP Server的秘密
IT古董
技术杂谈 安全 MCP MCP-Proxy
在构建多模型、多协议、可控可信的大模型接入平台时,MCP-Proxy扮演着关键中枢。它不仅要支持多个LLM接入,还要保障对后端MCPServer的安全访问、请求审计、能力切换与资源隔离。什么是MCP/MCP-Proxy?MCP(ModelCapabilityProtocol)是新一代模型能力调用协议,类似于OpenAI的API,但可支持:多厂商大模型(OpenAI、DeepSeek、Yi、Chat
312个免费高速HTTP代理IP(能隐藏自己真实IP地址)
yangshangchuan
高速 免费 superword HTTP代理
124.88.67.20:843
190.36.223.93:8080
117.147.221.38:8123
122.228.92.103:3128
183.247.211.159:8123
124.88.67.35:81
112.18.51.167:8123
218.28.96.39:3128
49.94.160.198:3128
183.20
pull解析和json编码
百合不是茶
android pull解析 json
n.json文件:
[{name:java,lan:c++,age:17},{name:android,lan:java,age:8}]
pull.xml文件
<?xml version="1.0" encoding="utf-8"?>
<stu>
<name>java
[能源与矿产]石油与地球生态系统
comsci
能源
按照苏联的科学界的说法,石油并非是远古的生物残骸的演变产物,而是一种可以由某些特殊地质结构和物理条件生产出来的东西,也就是说,石油是可以自增长的....
那么我们做一个猜想: 石油好像是地球的体液,我们地球具有自动产生石油的某种机制,只要我们不过量开采石油,并保护好
类与对象浅谈
沐刃青蛟
java 基础
类,字面理解,便是同一种事物的总称,比如人类,是对世界上所有人的一个总称。而对象,便是类的具体化,实例化,是一个具体事物,比如张飞这个人,就是人类的一个对象。但要注意的是:张飞这个人是对象,而不是张飞,张飞只是他这个人的名字,是他的属性而已。而一个类中包含了属性和方法这两兄弟,他们分别用来描述对象的行为和性质(感觉应该是
新站开始被收录后,我们应该做什么?
IT独行者
PHP seo
新站开始被收录后,我们应该做什么?
百度终于开始收录自己的网站了,作为站长,你是不是觉得那一刻很有成就感呢,同时,你是不是又很茫然,不知道下一步该做什么了?至少我当初就是这样,在这里和大家一份分享一下新站收录后,我们要做哪些工作。
至于如何让百度快速收录自己的网站,可以参考我之前的帖子《新站让百
oracle 连接碰到的问题
文强chu
oracle
Unable to find a java Virtual Machine--安装64位版Oracle11gR2后无法启动SQLDeveloper的解决方案
作者:草根IT网 来源:未知 人气:813标签:
导读:安装64位版Oracle11gR2后发现启动SQLDeveloper时弹出配置java.exe的路径,找到Oracle自带java.exe后产生的路径“C:\app\用户名\prod
Swing中按ctrl键同时移动鼠标拖动组件(类中多借口共享同一数据)
小桔子
java 继承 swing 接口 监听
都知道java中类只能单继承,但可以实现多个接口,但我发现实现多个接口之后,多个接口却不能共享同一个数据,应用开发中想实现:当用户按着ctrl键时,可以用鼠标点击拖动组件,比如说文本框。
编写一个监听实现KeyListener,NouseListener,MouseMotionListener三个接口,重写方法。定义一个全局变量boolea
linux常用的命令
aichenglong
linux 常用命令
1 startx切换到图形化界面
2 man命令:查看帮助信息
man 需要查看的命令,man命令提供了大量的帮助信息,一般可以分成4个部分
name:对命令的简单说明
synopsis:命令的使用格式说明
description:命令的详细说明信息
options:命令的各项说明
3 date:显示时间
语法:date [OPTION]... [+FORMAT]
eclipse内存优化
AILIKES
java eclipse jvm jdk
一 基本说明 在JVM中,总体上分2块内存区,默认空余堆内存小于 40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。 1)堆内存(Heap memory):堆是运行时数据区域,所有类实例和数组的内存均从此处分配,是Java代码可及的内存,是留给开发人
关键字的使用探讨
百合不是茶
关键字
//关键字的使用探讨/*访问关键词private 只能在本类中访问public 只能在本工程中访问protected 只能在包中和子类中访问默认的 只能在包中访问*//*final 类 方法 变量 final 类 不能被继承 final 方法 不能被子类覆盖,但可以继承 final 变量 只能有一次赋值,赋值后不能改变 final 不能用来修饰构造方法*///this()
JS中定义对象的几种方式
bijian1013
js
1. 基于已有对象扩充其对象和方法(只适合于临时的生成一个对象):
<html>
<head>
<title>基于已有对象扩充其对象和方法(只适合于临时的生成一个对象)</title>
</head>
<script>
var obj = new Object();
表驱动法实例
bijian1013
java 表驱动法 TDD
获得月的天数是典型的直接访问驱动表方式的实例,下面我们来展示一下:
MonthDaysTest.java
package com.study.test;
import org.junit.Assert;
import org.junit.Test;
import com.study.MonthDays;
public class MonthDaysTest {
@T
LInux启停重启常用服务器的脚本
bit1129
linux
启动,停止和重启常用服务器的Bash脚本,对于每个服务器,需要根据实际的安装路径做相应的修改
#! /bin/bash
Servers=(Apache2, Nginx, Resin, Tomcat, Couchbase, SVN, ActiveMQ, Mongo);
Ops=(Start, Stop, Restart);
currentDir=$(pwd);
echo
【HBase六】REST操作HBase
bit1129
hbase
HBase提供了REST风格的服务方便查看HBase集群的信息,以及执行增删改查操作
1. 启动和停止HBase REST 服务 1.1 启动REST服务
前台启动(默认端口号8080)
[hadoop@hadoop bin]$ ./hbase rest start
后台启动
hbase-daemon.sh start rest
启动时指定
大话zabbix 3.0设计假设
ronin47
What’s new in Zabbix 2.0?
去年开始使用Zabbix的时候,是1.8.X的版本,今年Zabbix已经跨入了2.0的时代。看了2.0的release notes,和performance相关的有下面几个:
:: Performance improvements::Trigger related da
http错误码大全
byalias
http协议 javaweb
响应码由三位十进制数字组成,它们出现在由HTTP服务器发送的响应的第一行。
响应码分五种类型,由它们的第一位数字表示:
1)1xx:信息,请求收到,继续处理
2)2xx:成功,行为被成功地接受、理解和采纳
3)3xx:重定向,为了完成请求,必须进一步执行的动作
4)4xx:客户端错误,请求包含语法错误或者请求无法实现
5)5xx:服务器错误,服务器不能实现一种明显无效的请求
J2EE设计模式-Intercepting Filter
bylijinnan
java 设计模式 数据结构
Intercepting Filter类似于职责链模式
有两种实现
其中一种是Filter之间没有联系,全部Filter都存放在FilterChain中,由FilterChain来有序或无序地把把所有Filter调用一遍。没有用到链表这种数据结构。示例如下:
package com.ljn.filter.custom;
import java.util.ArrayList;
修改jboss端口
chicony
jboss
修改jboss端口
%JBOSS_HOME%\server\{服务实例名}\conf\bindingservice.beans\META-INF\bindings-jboss-beans.xml
中找到
<!-- The ports-default bindings are obtained by taking the base bindin
c++ 用类模版实现数组类
CrazyMizzz
C++
最近c++学到数组类,写了代码将他实现,基本具有vector类的功能
#include<iostream>
#include<string>
#include<cassert>
using namespace std;
template<class T>
class Array
{
public:
//构造函数
hadoop dfs.datanode.du.reserved 预留空间配置方法
daizj
hadoop 预留空间
对于datanode配置预留空间的方法 为:在hdfs-site.xml添加如下配置
<property>
<name>dfs.datanode.du.reserved</name>
<value>10737418240</value>
 
mysql远程访问的设置
dcj3sjt126com
mysql 防火墙
第一步: 激活网络设置 你需要编辑mysql配置文件my.cnf. 通常状况,my.cnf放置于在以下目录: /etc/mysql/my.cnf (Debian linux) /etc/my.cnf (Red Hat Linux/Fedora Linux) /var/db/mysql/my.cnf (FreeBSD) 然后用vi编辑my.cnf,修改内容从以下行: [mysqld] 你所需要: 1
ios 使用特定的popToViewController返回到相应的Controller
dcj3sjt126com
controller
1、取navigationCtroller中的Controllers
NSArray * ctrlArray = self.navigationController.viewControllers;
2、取出后,执行,
[self.navigationController popToViewController:[ctrlArray objectAtIndex:0] animated:YES
Linux正则表达式和通配符的区别
eksliang
正则表达式 通配符和正则表达式的区别 通配符
转载请出自出处:http://eksliang.iteye.com/blog/1976579
首先得明白二者是截然不同的
通配符只能用在shell命令中,用来处理字符串的的匹配。
判断一个命令是否为bash shell(linux 默认的shell)的内置命令
type -t commad
返回结果含义
file 表示为外部命令
alias 表示该
Ubuntu Mysql Install and CONF
gengzg
Install
http://www.navicat.com.cn/download/navicat-for-mysql
Step1: 下载Navicat ,网址:http://www.navicat.com/en/download/download.html
Step2:进入下载目录,解压压缩包:tar -zxvf navicat11_mysql_en.tar.gz
批处理,删除文件bat
huqiji
windows dos
@echo off
::演示:删除指定路径下指定天数之前(以文件名中包含的日期字符串为准)的文件。
::如果演示结果无误,把del前面的echo去掉,即可实现真正删除。
::本例假设文件名中包含的日期字符串(比如:bak-2009-12-25.log)
rem 指定待删除文件的存放路径
set SrcDir=C:/Test/BatHome
rem 指定天数
set DaysAgo=1
跨浏览器兼容的HTML5视频音频播放器
天梯梦
html5
HTML5的video和audio标签是用来在网页中加入视频和音频的标签,在支持html5的浏览器中不需要预先加载Adobe Flash浏览器插件就能轻松快速的播放视频和音频文件。而html5media.js可以在不支持html5的浏览器上使video和audio标签生效。 How to enable <video> and <audio> tags in
Bundle自定义数据传递
hm4123660
android Serializable 自定义数据传递 Bundle Parcelable
我们都知道Bundle可能过put****()方法添加各种基本类型的数据,Intent也可以通过putExtras(Bundle)将数据添加进去,然后通过startActivity()跳到下一下Activity的时候就把数据也传到下一个Activity了。如传递一个字符串到下一个Activity
把数据放到Intent
C#:异步编程和线程的使用(.NET 4.5 )
powertoolsteam
.net 线程 C# 异步编程
异步编程和线程处理是并发或并行编程非常重要的功能特征。为了实现异步编程,可使用线程也可以不用。将异步与线程同时讲,将有助于我们更好的理解它们的特征。
本文中涉及关键知识点
1. 异步编程
2. 线程的使用
3. 基于任务的异步模式
4. 并行编程
5. 总结
异步编程
什么是异步操作?异步操作是指某些操作能够独立运行,不依赖主流程或主其他处理流程。通常情况下,C#程序
spark 查看 job history 日志
Stark_Summer
日志 spark history job
SPARK_HOME/conf 下:
spark-defaults.conf 增加如下内容
spark.eventLog.enabled true spark.eventLog.dir hdfs://master:8020/var/log/spark spark.eventLog.compress true
spark-env.sh 增加如下内容
export SP
SSH框架搭建
wangxiukai2015eye
spring Hibernate struts
MyEclipse搭建SSH框架 Struts Spring Hibernate
1、new一个web project。
2、右键项目,为项目添加Struts支持。
选择Struts2 Core Libraries -<MyEclipes-Library>
点击Finish。src目录下多了struts