SFTP全解析:深入了解组件功能与适用场景

文章目录

  • 一、组件功能
  • 二、适用场景
  • 三、SFTP优势
  • 四、SFTP原理
  • 五.SFTP与同类产品对比
  • 六、部署方案
    • 1.裸金属部署
    • 2.k8s容器化部署
  • 七、高可用方案
  • 八、监控方案
  • 九、常见问题及解决方法

一、组件功能

安全文件传输协议SFTP(SSH File Transfer Protocol)是文件传输协议(FTP)的安全版本,也是SSH协议的一部分,可通过安全SHELL(SSH)数据流轻松进行数据传输和数据访问。SFTP也被称为SSH文件传输协议。它提供了一个安全的连接来传输文件,并在本地和远程系统上遍历文件系统。SFTP中的加密是通过SSH连接来完成的,文件可以通过WinSCP和SFTP客户端进行传输。

二、适用场景

SFTP服务使用标准的SFTP协议实现上传/下载数据,您也可以创建SFTP用户来实现精确的权限控制。在各个不同行业之间或公司不同部门之间进行数据交换时,SFTP服务器提供了一种安全、简单、高效的文件传输方式。

三、SFTP优势

  1. 安全:SFTP协议提供了一个安全通道,用于在网络上的主机之间传输文件。
  2. 易用:SFTP是SSH协议的一部分,它是一种远程登录信息。
  3. 权限控制:通过建立独立的ssh用户进行精准权限控制
  4. 兼容性:sftp适用于所有平台
  5. 可靠性:基于SSH来加密传输文件,可靠性高,可断点续传

四、SFTP原理

在这里插入图片描述
SFTP,代表SSH File Transfer传输Protocol协议,是类似于FTP的网络协议,它允许文件访问,传输和文件管理,但可以通过安全可靠的数据流。
与FTP不同,它不使用单独的命令和数据通道。相反,它在单个连接中以特殊格式的软件包传输文件。名称中的SSH代表Secure SHell协议,SFTP是该协议的扩展。使用SFTP协议时,这提供了更高的安全性。
您可以以与FTP相同的方式使用SFTP,最大的区别是安全连接。 Filezilla和Cyber​​duck还提供SFTP作为其免费软件包的一部分,您肯定会利用它。
在这里插入图片描述
连接到SFTP服务器时,它假定连接正在安全通道上运行。由于客户端用户身份可用于协议,因此无需客户端身份验证。
WordPress是一个很好的示例,该站点允许同时进行FTP和SFTP连接。尝试添加已保存到计算机或服务器的主题时,可能需要通过FTP或SFTP传输该主题。
这是为了避免WordPress拒绝主题在正常传输过程中可能需要的某些代码行。

五.SFTP与同类产品对比

最明显的区别就是定义。 SFTP是安全的网络协议,而FTP则不是。另一种可能是协议类型。 FTP是基于TCP / IP的协议。 SFTP是基于SSH的协议。
TCP / IP表示T传输C控制Protocol / I互联网P协议。换句话说,这是控制互联网上所有计算机之间通信的标准协议。
在这里插入图片描述

  • FTP在TCP端口21上建立其控制连接,而SFTP在客户端和服务器之间通过SSH协议建立的连接下传输文件。
  • FTP仅以纯文本格式发送数据,而SFTP在将其所有数据发送到主机之前对其进行加密。
  • SFTP还是一个独立的协议,它提供主机到主机的传输,而FTP是一个更为开放的协议。 FTP,Netscape创建了SSL,或S确保S火箭Layer(当前为TLS或Transport Layer S安全性)。然后将SSL应用于FTP以创建FTPS。

这允许通过两个安全变体使用FTP以安全的方式交换数据:FTPS隐式SSL和FTPS显式SSL。两者都使用SSL加密。
最后,大多数人唯一需要担心的唯一关键区别是SFTP提供了一种将文件从一台主机传输到另一台主机的安全方法。 FTP仅通过两个通道(命令和数据通道)提供标准的纯文本传输,而没有加密。
而vsftpd是一个软件程序,是(very secure FTP daemon)的缩写,是一款在Linux发行版中最受推崇的FTP服务器程序,特点是小巧轻快,安全易用,支持ftp协议,但是不支持sftp协议。

六、部署方案

1.裸金属部署

  1. 添加用户配置目录权限
 [root@db1 conf]# groupadd sftp #新建用户组
[root@db1 conf]# useradd -g sftp -s /sbin/nologin -M hsi_ftp #添加用户
[root@db1 conf]# passwd hsi_ftp #设置密码
Changing password for user hsi_ftp.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@db1 data]# mkdir -p /data/sftp/hsi_ftp
[root@db1 data]# usermod -d /data/sftp/hsi_ftp hsi_ftp
[root@db1 data]# chown root:sftp /data/sftp/ #根目录所有者必须是root否则无法登录
[root@db1 data]# chown hsi_ftp:sftp /data/sftp/hsi_ftp/ #修改权限
  1. 修改配置
    在这里插入图片描述
[root@db1 data]# vi /etc/ssh/sshd_config注释行
#Subsystem      sftp    /usr/libexec/openssh/sftp-server末尾添加行
Subsystem       sftp    internal-sftp
Match Group sftp
ChrootDirectory /data/sftp
ForceCommand    internal-sftp
AllowTcpForwarding no 
X11Forwarding no重启
[root@db1 data]# service sshd restart 
  1. 验证
yzb-book:~ yzb$ sftp hsi_ftp@192.168.10.15
hsi_ftp@192.168.10.15's password: 
Connected to hsi_ftp@192.168.10.15.
sftp> ls
hsi_ftp   
sftp> cd hsi_ftp
sftp> put /Users/yzb/Downloads/dfcf.dmg ./
Uploading /Users/yzb/Downloads/dfcf.dmg to /hsi_ftp/./dfcf.dmg
/Users/yzb/Downloads/dfcf.dmg                 100%   28MB  11.0MB/s   00:02    
sftp> ls
dfcf.dmg  
sftp> rm dfcf.dmg
Removing /hsi_ftp/dfcf.dmg
sftp> ls
sftp> 

2.k8s容器化部署

cat sftp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: sftp
spec:replicas: 2 #可自行修改副本的个数selector:matchLabels:app: sftptemplate:metadata:labels:app: sftpspec:nodeSelector:sftp: "true"containers:- command: ["/entrypoint", "$(user):$(passwd):::$(path)"]image: atmoz/sftp:alpine-3name: sftpports:- containerPort: 22hostPort: 32222name: httpprotocol: TCPenv:- name: TZvalue: "CST-8"- name: uservalue: "sftp"- name: passwdvalue: "123456"- name: pathvalue: "upload"resources:limits:cpu: "1"memory: 200Mirequests:cpu: "0.1"memory: 100MisecurityContext:capabilities:add: # 添加- CAP_SYS_ADMINdrop:  # 删除- KILL volumeMounts:- mountPath: /etc/ssh/ssh_host_ed25519_keyname: ssh-host-ed25519-key- mountPath: /etc/ssh/ssh_host_rsa_keyname: ssh-host-rsa-key- mountPath: "/opt/data"name: data
#        - mountPath: "/home/foo/"
#          name: data
#        - mountPath: "/home/bar/"
#          name: data- name: usersmountPath: /etc/sftp- name: bindmountmountPath: /etc/sftp.dvolumes:- hostPath:path: /etc/ssh/ssh_host_ed25519_keyname: ssh-host-ed25519-key- hostPath:path: /etc/ssh/ssh_host_rsa_keyname: ssh-host-rsa-key- name: datapersistentVolumeClaim:claimName: pvc-nfs- name: usersconfigMap:name: users-cm- name: bindmountconfigMap:name: bindmount-cm
---
apiVersion: v1
data:user.conf: |foo:123:1001:100:/home/sftp/uploadbar:abc:1002:100:/home/sftp/uploadbaz:xyz:1003:100
kind: ConfigMap
metadata:name: user-cm
---
apiVersion: v1
data:bind-mount.sh: |#!/bin/bash# File mounted as: /etc/sftp.d/bindmount.sh# Just an example (make your own)function bindmount() {if [ -d "$1" ]; thenmkdir -p "$2"fimount --bind $3 "$1" "$2"}# Remember permissions, you may have to fix them:# chown -R :users /data/commonbindmount /opt/data /home/sftp/uploadbindmount /opt/data /home/foo/uploadbindmount /opt/data /home/bar/upload
kind: ConfigMap
metadata:name: bindmount-cmkubectl apply -f sftp.yaml

七、高可用方案

SFTP是单节点的服务,本身不支持集群模式,但可组合keepalived、rsync,共享存储,负载均衡等组件,建立起SFTP的高可用方案
在这里插入图片描述

  1. 部署sftp
    参考部署方案-裸金属部署章节(两台服务器都需要部署)
  2. RSYNC编译安装
安装前提:需要保持双向同步的服务器主机时间同步
下载地址:https://download.samba.org/pub/rsync/src/rsync-3.1.3.tar.gz
解压编译安装
[root@db1 ~]# tar -zxvf rsync-3.1.3.tar.gz 
[root@db1 ~]# cd rsync-3.1.3
[root@db1 rsync-3.1.3]# ./configure --prefix=/usr/local/rsync --disable-ipv6
[root@db1 rsync-3.1.3]# make && make install
[root@db1 rsync-3.1.3]# ln -s /usr/local/rsync/bin/rsync /usr/local/bin/rsync简历需要同步的目录(客户端主机和服务端主机均需要建目录保持一致)
[root@db1 rsync-3.1.3]# mkdir -p /data/sftp/hsi_ftp/upload/
[root@db1 rsync-3.1.3]# chown -R hsi_ftp:sftp /data/sftp/hsi_ftp/
[root@db1 rsync-3.1.3]# chmod -R 777 /data/sftp/hsi_ftp/
[root@db1 rsync-3.1.3]# vi /etc/xinetd.d/rsync
将disable = yes 改为 no

服务端配置,双向同步时2台服务器是客户端同时也都是服务端

[root@db1 sftp]# vi /usr/local/rsync/rsyncd.conf 
pid file = /var/run/rsyncd.pid
port = 873
uid = hsi_ftp#服务端系统用户
gid = sftp#服务端系统用户组
use chroot = yes
max connections = 5
timeout 600
lock file = /var/run/rsyncd.lock
log file = /var/run/rsyncd.log
#secrets file = /usr/local/rsync/rsyncd.secrets 
motd file = /etc/rsyncd.motd[hsi_sftp]#名称可以随意
path = /data/sftp/hsi_ftp/#需要同步的目录,拥有者和用户组必须和上面的pid,gid一致
#ignore errors
read only = no#非只读
write only = no#非只写
list = yes
hosts allow = *
#hosts deny = 0.0.0.0/32
secrets file = /usr/local/rsync/rsyncd.secrets
auth users = hsi_ftp  #该用户系统中存在且对后面指定的备份目录拥有权限
comment = sftp  hsi_sftp配置帐号密码格式:帐号:密码
[root@db1 sftp]# vi /usr/local/rsync/rsyncd.secrets 
hsi_ftp:hsi_ftp修改配置文件权限
[root@db1 sftp]# chmod 600 /usr/local/rsync/rsyncd.conf 
[root@db1 sftp]# chmod 600 /usr/local/rsync/rsyncd.secrets

客户端配置

客户端登录服务端密码,注意这里只写密码,和服务端的/usr/local/rsync/rsyncd.secrets文件对应
[root@db1 sftp]# vi /usr/local/rsync/rsyncd.pass 
hsi_ftp修改密码配置文件权限,如果不修改则可能无法使用
[root@db1 sftp]# chmod 600 /usr/local/rsync/rsyncd.pass 

测试

启动服务端
[root@db1 rsync]# rsync --daemon --config=/usr/local/rsync/rsyncd.conf[root@db2 ~]# rsync -avz --password-file=/usr/local/rsync/rsyncd.pass /data/sftp/hsi_ftp/ hsi_ftp@192.168.10.15::hsi_sftpsending incremental file list
upload/
upload/rsyncd.conf1sent 463 bytes  received 39 bytes  334.67 bytes/sec
total size is 492  speedup is 0.98
  1. INOTIFY-TOOLS安装(双向同步2台主机分别都要执行操作)
下载
[root@db1 upload]# wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz解压
[root@db1 upload]# tar -zxvf inotify-tools-3.14.tar.gz 
[root@db1 upload]# cd inotify-tools-3.14
[root@db1 inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify
[root@db1 inotify-tools-3.14]# make && make install检查是否安装成功
[root@db1 inotify-tools-3.14]# ls -alh /usr/local/inotify/bin/inotify*
-rwxr-xr-x. 1 root root 44K Feb 28 14:38 /usr/local/inotify/bin/inotifywait
-rwxr-xr-x. 1 root root 41K Feb 28 14:38 /usr/local/inotify/bin/inotifywatch建立软连接
[root@db1 inotify-tools-3.14]# ln -s /usr/local/inotify/bin/inotifywait /usr/bin/inotifywait
[root@db1 inotify-tools-3.14]# ln -s /usr/local/inotify/bin/inotifywatch /usr/bin/inotifywatch配置rsync.sh同步监控脚本
[root@db1 inotify]# vi /usr/local/inotify/rsync.sh
# 内容如下
#!/bin/bash
src=/data/sftp/hsi_ftp/ #同步目录
des=hsi_sftp #视情况自己配置,注意与下面的rsync命令结合配置
user=hsi_ftp
host="192.168.10.16" #服务端主机ip
/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src | while read file
dorsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsyncd.pass $src $user@$host::$des echo "$file was rsynced" >> /tmp/rsync.log 2>&1
done
[root@db1 inotify]# chmod +x /usr/local/inotify/rsync.sh
nohup sh /usr/local/inotify/rsync.sh &#建立守护进程运行rsync.sh脚本
echo “nohup sh /usr/local/inotify/rsync.sh &” >> /etc/rc.local测试:分别在2台机器/data/sftp/hsi_ftp/目录修改,新增,删除文件查看另一台服务器上是否也同步修改
  1. KEEPALIVED配置 安装详见 HTTP://WWW.YANGZB.COM/ARTICLE/16
vi /usr/local/keepalived/etc/keepalived/keepalived.conf后添加内容
virtual_server 192.168.10.160 22 {delay_loop 6lb_algo rrlb_kind DRpersistence_timeout 50protocol TCPreal_server 192.168.10.15 22 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}real_server 192.168.10.16 22 {weight 1TCP_CHECK {connect_timeout 3retry 3delay_before_retry 3}}
}

八、监控方案

SFTP成熟的监控方案比较少,因sftp可监控项也比较少
下面以prometheus监控sftp为例,进行演示

  1. 采用https://github.com/billabongrob/sftp-exporter进行sftp指标采集
    docker run -p 9816:9816 --env SFTPHOST=127.0.0.1 --env SFTPUSER=hsi_ftp --env SFTPPASS=123456 ghcr.io/billabongrob/sftp-exporter:latest

  2. prometheus job 添加

- job_name: 'prome'static_configs:- targets: ['localhost:9816']labels:id: sftp-instanceinstance: sftp
  1. grafana dashboard
    https://grafana.com/grafana/dashboards/15744-sftp-connectivity/
    在这里插入图片描述

九、常见问题及解决方法

  1. 发布服务时文件启动pod异常排查
Kubectl logs pod名称 –n 分区名称查看
[root@vm-paasyy24-097 ~]# kubectl get po -n sftp-images
NAME                          READY   STATUS    RESTARTS   AGE
sftp-image-7d4d766b94-ftl6b   1/1     Running   0          131m
[root@vm-paasyy24-097 ~]# kubectl logs sftp-image-7d4d766b94-ftl6b -n sftp-images

或在kem上直接查看
在这里插入图片描述
日志中应该是如下报错
在这里插入图片描述
解决办法,密钥文件粘贴注意格式,粘贴到kem页面上注意最后一行加回车,避免pod无法启动或正常启动后登录sftp服务器上验证失败。
另外还有一种可能是转码问题,用文本编辑工具处理一下即可。

  1. Sftp登录sftp服务器报密码错误排查
    日志的结尾部分基本上是如下错误:
 Unable to load host key "/etc/ssh/ssh_host_ed25519_key": invalid format
Unable to load host key: /etc/ssh/ssh_host_ed25519_key
Invalid user demo1-admin from 10.248.24.101 port 18416
Could not get shadow information for NOUSER

解决办法,这个就是ldap服务验证不通过,检查下启动deplayment的ldap相关的环境变量。一定要与kem服务器上application.properties文件中ldap配置部分一致。修改后重启即可。

  1. ftp上传镜像到指定的目录上,未生成result结果文件,在镜像库中查不到
  • 配置文件未正确挂载:
进入pod容器内或在kem上直接进入容器,查看容器内对应的配置文件,看有没有正常加载,或进入容器挂载在本地的日志的目前查看日志。
[root@vm-paasyy24-097 ~]# kubectl exec -it sftp-image-7d4d766b94-ftl6b -n sftp-images bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@sftp-image-7d4d766b94-ftl6b:/home# cd /opt/images/config
root@sftp-image-7d4d766b94-ftl6b:/opt/images/config# ls -l
total 0
lrwxrwxrwx 1 root root 17 Aug  6 15:09 config.ini -> ..data/config.ini
lrwxrwxrwx 1 root root 25 Aug  6 15:09 harbor_config.conf -> ..data/harbor_config.conf
lrwxrwxrwx 1 root root 27 Aug  6 15:09 ssh_host_ed25519_key -> ..data/ssh_host_ed25519_key
lrwxrwxrwx 1 root root 23 Aug  6 15:09 ssh_host_rsa_key -> ..data/ssh_host_rsa_key
root@sftp-image-7d4d766b94-ftl6b:/opt/images/config#
[root@vm-paasyy24-097 ftpdata]# cd logs
[root@vm-paasyy24-097 logs]# ls -l
total 5760
-rw-r--r-- 1 root root       0 Aug  6 14:59 images_error.log
-rw-r--r-- 1 root root 4799150 Aug  6 17:50 images_info.log
[root@vm-paasyy24-097 logs]# tail -f images_info.log
2021-08-06 17:50:32,690 - images_share_main.py[line:210] - INFO:事件触发租户为:pass-uer001-admin,项目为:wzk
2021-08-06 17:50:32,690 - images_share_main.py[line:210] - INFO:事件触发租户为:pass-uer001-admin,项目为:wzk
2021-08-06 17:50:32,691 - base.py[line:144] - INFO:Job "addImagesPath (trigger: interval[0:00:05], next run at: 2021-08-06 17:50:37 CST)" executed successfully
2021-08-06 17:50:32,702 - images_share_harbor_v2.py[line:91] - INFO:调用harbor:10.248.24.215:1121项目接口成功
2021-08-06 17:50:32,702 - images_share_push.py[line:138] - INFO:##############镜像上传harbor开始 2021-08-06 17:50:32##############
2021-08-06 17:50:32,702 - images_share_push.py[line:139] - INFO:获取项目列表返回值 200
2021-08-06 17:50:32,703 - images_share_push.py[line:142] - INFO:10.248.24.215:1121 harbor获取项目列表成功
2021-08-06 17:50:32,703 - images_share_push.py[line:149] - INFO:已存在的项目列表是 {'123': 11, 'eee': 12, 'google_containers': 6, 'kube_system': 5, 'library': 1, 'paas-admin': 4, 'paas-monitor': 3, 'test': 10, 'test1': 7, 'test2': 8}
2021-08-06 17:50:32,703 - images_share_push.py[line:151] - INFO:10.248.24.215:1121 harbor eee 项目已存在
2021-08-06 17:50:32,703 - images_share_push.py[line:237] - INFO:docker开始load镜像。。。。。
^C
[root@vm-paasyy24-097 logs]#

如果配置文件加载不正常,重新粘贴配置文件,注意格式。重启即可

  • 配置文件正确挂载,但上传镜像后没有结果文件
    在这里插入图片描述
    如上图的错误为harbor_config.conf配置项未配置正确,harbor地址错误,修改为正确的harbor地址,上传镜像成功。
    在这里插入图片描述

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

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

相关文章

Android 中文文件名排序实现案例教程

Android 中文文件名排序实现案例教程 一、问题分析二、解决方法2.1 使用系统提供的 Collator 类2.2 使用第三方库 Pinyin4J2.3 自定义排序规则 三、总结 在 Android 应用中,经常需要对包含中文的文件名进行排序。由于中文的特殊性,直接使用字符串比较的方…

java——Spring MVC的工作流程

Spring MVC的工作流程是基于模型-视图-控制器(MVC)设计模式的一个典型实现,以下是其主要工作流程步骤: 客户端请求提交: 用户通过浏览器向服务器发送请求,该请求首先到达Spring MVC的前端控制器DispatcherS…

Mutex::Autolock 和 std::lock_guard 的区别

Mutex::Autolock 和 std::lock_guard 都是 C 中用于管理互斥锁(mutex)的一种方式,它们的目标是自动获取和释放锁,避免手动管理锁的复杂性,从而防止死锁和遗漏解锁等问题。尽管它们有相似的功能,但二者也存在…

<项目代码>YOLOv8 红绿灯识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

mac下安装Ollama + Open WebUI + Llama3.1

本文介绍mac下安装Ollama Open WebUI Llama3.1 8b具体步骤。 目录 推荐配置Ollama Open WebUI Llama3.1简介安装Ollama安装Open WebUI 推荐配置 m1以上芯片,16g内存,20g以上硬盘空间 Ollama Open WebUI Llama3.1简介 Ollama: 下载,管理…

Linux 无图形界面磁盘空间排查与优化实践20241127

Linux 无图形界面磁盘空间排查与优化实践 引言:磁盘空间问题的痛点与挑战 🔍 常见问题 当系统磁盘空间超过 90% 时,不仅可能导致性能下降,还可能让关键操作无法正常完成。这种情况下,如何高效且精准地排查磁盘占用来…

【Fargo】27:ffmpeg ffprobe 和python分析h264文件并绘制

从帧和包两个层面进行分析。帧级别分析 ffprobe 可以读取264文件信息 -Y9KP MINGW64 /d/XTRANS/thunderbolt/ayame/zhb-bifrost/player-only (main) $ ffprobe test.h264 ffprobe version N-116778-g7e4784e40c-20240827 Copyright (c) 2007-2024 the FFmpeg developersbuilt …

uniapp生命周期:应用生命周期和页面生命周期

文章目录 1.应用的生命周期2.页面的生命周期 1.应用的生命周期 生命周期的概念:一个对象从创建、运行、销毁的整个过程被称为生命周期 生命周期函数:在生命周期中每个阶段会伴随着每一个函数的出发,这些函数被称为生命周期函数 所有页面都…

【AI】JetsonNano启动时报错:soctherm OC ALARM

1、问题描述 将JetsonNano烧写SD卡镜像为Ubuntu20.04后,启动时报错:soctherm OC ALARM,启动失败;然后系统一直重启 2、原因分析 “soctherm OC ALARM”是检测到系统温度超过安全阈值时发出的过热警告。 “soctherm”代表系统…

SycoTec 4060 ER-S德国高精密主轴电机如何支持模具的自动化加工?

SycoTec 4060 ER-S高速电主轴在模具自动化加工中的支持体现在以下几个关键方面: 1.高精度与稳定性:SycoTec 4060 ER-S锥面跳动小于1微米,确保了加工过程中的极高精度,这对于模具的复杂几何形状和严格公差要求至关重要。高精度加工…

构建一个去中心化的零售生态参与者的商业模型

在数字化和去中心化技术快速发展的背景下,传统零售行业正迎来革命性的转型。去中心化零售生态不仅让消费者、商家和内容创作者在同一平台上共同参与价值的创造和分配,还推动了零售体验、数据控制和社会互动的彻底变革。本文将探讨如何构建一个去中心化的…

clickhouse 使用global in 优化 in查询

文章目录 in例子使用global in in例子 SELECT uniq(UserID) FROM distributed_table WHERE CounterID 101500 AND UserID IN (SELECT UserID FROM distributed_table WHERE CounterID 34)对于in 查询来说,本来查询的就是分布式表,假设这个表有100 个…

Docker 启动和停止的精准掌舵:操控指南

Docker 启动和停止的精准掌舵:操控指南 Docker是一个开源的应用容器引擎,基于Go语言开发,能够让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。Do…

Oracle Universal Unique Identifier (UUID)

本文介绍Oracle生成全局唯一ID的函数SYS_GUID,后续会对SYS_GUID和Sequence两种方法进行比较。 SYS_GUID 函数生成并返回一个由 16 个字节组成的全局唯一标识符(RAW 值)。在大多数平台上,生成的标识符由主机标识符、调用该函数的进…

微信小程序页面配置详解:从入门到精通

微信小程序页面配置详解:从入门到精通 引言 随着移动互联网的飞速发展,微信小程序作为一种新兴的应用形式,因其便捷性和丰富的功能而受到广泛欢迎。在小程序的开发过程中,页面配置是至关重要的一环。本文将深入探讨微信小程序的页面配置,帮助开发者从基础到高级逐步掌握…

d3-contour 生成等高线图

D3.js 是一个强大的 JavaScript 库,用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块,用于生成等高线图(contour plots)。 属性和方法 属性 x: 一个函数,用于从数据点中提取 x 坐标。y: 一个函…

Vue 中 data 属性为函数的深度剖析:原理、区别与实践

在 Vue.js 中,data 属性通常是一个 函数 而不是一个对象,这背后有一系列设计上的原因和原理,尤其是与 Vue 的组件系统、实例化机制、以及响应式数据的管理有关。下面我将详细解答这个问题,并结合实际项目示例和代码分析,进行全面讲解。 1. Vue 中 data 为什么是一个函数而…

钉钉与企业微信机器人:助力网站定时任务高效实现

钉钉、企业微信机器人在网站定时任务中的应用,主要体现在自动化通知、提醒以及数据处理等方面。 以下是一些具体的应用场景: 1. 自动化通知 项目进度提醒:在蒙特网站所负责的软件开发或网站建设项目中,可以利用机器人设置定时任…

# [Unity] 【游戏开发】Unity开发基础2-Unity脚本编程基础详解

Unity脚本编程是创建互动式游戏体验的核心技能之一。本文将详细讲解Unity脚本编程的基础知识,包括变量和数据类型、程序逻辑、方法等方面,并通过实例展示如何使用这些基本知识完成简单功能的实现。 1. 新建Unity脚本的基本结构 当在Unity中创建一个脚本时,Unity会生成如下基…

Windows系统下安装Triton 3.0.0预编译Triton 2.1.0

Triton是一个用于编写高效自定义深度学习原语的语言和编译器。它旨在提供一个开源环境,使得编写代码的速度比CUDA更快,同时比其他现有的DSLs(领域特定语言)更灵活。 在开始安装之前,请确保您的系统满足以下要求&#x…