Ubuntu 20.04 搜索引擎环境搭建 (PostgreSQL 12.3, Redis 6, ELK[Elasticsearch 7.8, Logstash 7.8, Kibana 7.8])
2021/02/04 更新redis安装步骤
在软件开发项目中,会遇到搜索引擎、日志收集等需求,本教程在阿里云选择公共镜像 Ubuntu 20.04 后,部署 apt-fast, java, axel, NodeJS, postgres, Redis, ELK(Elasticsearch, Logstash, Kibana, 均为开箱即用) 服务并设置开机自启。阿里云 Ubuntu 20.04 系统镜像下自带Python3。
目录
- 安装
- 创建目录
- 更新一波软件
- 安装 Apt-fast
- 安装 Java
- 安装 Axel
- 安装 NodeJS
- 安装 PostgreSQL
- 安装 Redis
- 安装 ELK
- 准备安装包(参考方式)
- 安装 Elasticsearch
- 安装 Logstash
- 安装 Kibana
- 配置
- PostgreSQL
- Redis
- Elasticsearch
- Kibana
- 启动
- PostgreSQL
- Redis
- Elasticsearch
- Kibana
- 开机自启
- Redis
- Elasticsearch
- Elasticsearch-head
- Kibana
- 其他
- Ubuntu如何删除添加的仓库
- PostgreSQL相关操作
- Linux相关操作
提醒:文件修改前请自己做好备份
软件安装在 /usr/local目录下,日志文件放在**/var**目录下
相关服务版本信息
软件 | 版本 | 查询命令 |
---|---|---|
apt-fast | 2.0.3 (amd64) | apt-fast -v |
Java | openjdk 14.0.1 | java --version |
Axel | 2.17.5 (linux-gnu) | axel -V |
Node.js | 14.7.0 | node -v |
PostgreSQL | 12.3 | psql -V |
Redis | 6.0.6 | redis-server -v |
Elasticsearch | 7.8.0 | |
Elasticsearch-head | 5.0.0 | |
Elasticsearch-analysis-ik | 7.8.0 | |
Logstash | 7.8.0 | |
Kibana | 7.8.0 |
安装
创建目录
# 创建environment目录
mkdir /usr/local/environment
# 移动到environment目录
cd /usr/local/environment
# 创建软件目录
mkdir redis elk elk/elasticsearch elk/logstash elk/kibana# 赋予读写权限
chmod 777 /usr/local/environment
更新一波软件
sudo apt-get upgrade
安装 Apt-fast
sudo apt install software-properties-common
sudo add-apt-repository ppa:apt-fast/stable
sudo apt-get -y install apt-fast
# 安装过程的配置,选择apt-get, 最大线程数换成16,选择no
安装 Java
sudo apt install openjdk-14-jdk-headless
安装 Axel
sudo apt-get install axel
安装 NodeJS
sudo apt install npm
安装 PostgreSQL
# Create the file repository configuration:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'# Import the repository signing key:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -# Update the package lists
# Install the latest version of PostgreSQL.
# If you want a specific version, use 'postgresql-12' or similar instead of 'postgresql':
sudo apt-get update && sudo apt-get install postgresql
#如果上面安装速度太慢,使用apt-fast安装
sudo apt-fast update
sudo apt-fast install postgresql
# 执行npm install速度慢,更换淘宝镜像
npm config set registry http://registry.npm.taobao.org
安装 Redis
# 进入redis安装目录
cd /usr/local/environment/redis
# 获取redis安装包
wget http://download.redis.io/releases/redis-6.0.6.tar.gz
# 解压(请使用对应的文件名)
tar -xvf redis-6.0.6.tar.gz
# 创建软链接(为了方便,非必须,如果没有创建,接下来的涉及到redis路径请用redis-6.0.5)
# ln -s 原始目录名 快速访问目录名
ln -s redis-6.0.6 redis
# 进入redis目录,对解压的Redis文件进行编译
cd redis
make
# 进入src文件夹进行Redis安装
# ( 注意: 6.0.10 及以上的版本不需要运行下面两条命令)
cd src
make install
redis安装包下载链接从 redis 官网获取。
安装 ELK
准备安装包(参考方式)
# 进入 ELK 目录
cd /usr/local/environment/elk
# 通过filezilla、FinalShell等工具将下载好的安装包传输到服务器
官网/下载源:
Elasticsearch, elasticsearch-analysis-ik, elasticsearch-head, Logstash, Kibana
百度网盘:
链接: 百度网盘 提取码: kdi9
PS: 7-zip可以(解压ZIP文件然后)压缩文件得到.tar.gz压缩包
分别将[elasticsearch, elasticsearch-analysis, elasticsearch-head], [logstash], [kibana] 的压缩包放在 elasticsearch, logstash, kibana 目录下
安装 Elasticsearch
# 进入 elasticsearch 目录
cd /usr/local/environment/elk/elasticsearch
# 解压安装包
tar -zxvf elasticsearch-7.8.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-head-5.0.0.tar.gz
tar -zxvf elasticsearch-analysis-ik-7.8.0.tar.gz
# 将 IK分词器 文件移动到elasticsearch的plugins目录下
mv elasticsearch-analysis-ik-7.8.0 ./elasticsearch-7.8.0/plugins
# 进入 elasticsearch-head 目录,安装 elasticsearch-head 依赖包
cd elasticsearch-head-5.0.0
npm install
安装 Logstash
# 进入 logstash 目录
cd /usr/local/environment/elk/logstash
# 解压安装包
tar -zxvf logstash-7.8.0.tar.gz
安装 Kibana
# 进入 Kibana 目录
cd /usr/local/environment/elk/kibana
# 解压安装包
tar -zxvf kibana-7.8.0-linux-x86_64.tar.gz
配置
PostgreSQL
创建用户
# 修改数据库用户
sudo su - postgres
# 连接数据库(连接后命令输入头变成 postgres=# )
psql
# 修改密码
\password
修改配置文件 postgresql.conf 允许所有ip访问
listen_addresses = '*'
修改认证权限配置文件 pg_hba.conf ,添加一下配置,并将所有的"peer"改为"md5"(密码认证)
# IPv4 local connections:
host all all 0.0.0.0/0 md5
(我的配置文件在/etc/postgresql/12/main目录下)
Redis
# 在/var/log目录下创建redis文件夹,存放redis日志文件
mkdir /var/log/redis
# 进入redis安装目录,创建conf、data文件夹
cd /usr/local/environment/redis/redis
mkdir data conf
# 进入conf目录,编写配置文件 redis-端口号.conf
# 例:redis-6379.conf
cd conf
touch redis-6379.conf
(除了带注释的行,其他均为默认设置,见redis目录下的redis.conf文件)
# 绑定的ip,请根据需求自行更换
# bind 127.0.0.1
# 远程访问 protected-mode no
protected-mode no
# 端口设置
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
# 以守护进程的方式启动,redis以服务的形式存在,日志不再打印到命令窗口中
daemonize yes
supervised no
pidfile /var/run/redis-6379.pid
loglevel notice
# 日志文件,使用绝对路径,防止出问题
logfile "/var/log/redis/6379.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
# 当前服务文件保存位置,包含日志文件、持久化文件等,使用绝对路径,防止出问题
dir /var/log/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
# 内存到达上限之后的处理策略
maxmemory-policy noeviction
# 1. volatile-lru:对设置了过期时间的key执行LRU逐出策略(默认值)
# 2. allkeys-lru : 对所有key使用LRU逐出策略
# 3. volatile-random:随机删除即将过期key(LFU)
# 4. allkeys-random:随机删除
# 5. volatile-ttl : 删除即将过期的
# 6. noeviction : 永不过期,返回错误
Elasticsearch
# 进入Elasticsearch安装目录
cd /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0
# 创建文件夹data、logs,存放elasticsearch数据,日志
mkdir data logs
# 进入Elasticsearch配置文件目录
cd /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0/config
# 编辑该目录下的elasticsearch.yml文件,在文件末尾加上下面配置(或者取消注释后修改)
#集群名称
cluster.name: SUSTech-Town-ES#节点名称
node.name: node-st#数据和日志的存储目录(若安装路径不同, 请注意更改)
path.data: /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0/data
path.logs: /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0/logs#设置绑定的ip,0.0.0.0代表任意ip访问
network.host: 0.0.0.0#端口
http.port: 9200#设置在集群中的所有节点名称
cluster.initial_master_nodes: ["node-st"]# 配置elasticsearch允许跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
修改系统的进程内存限制,否则启动es会报错
/etc/security目录下的***limits.conf***文件,更新/添加以下数据
* soft nofile 65536
* hard nofile 131072
* soft nproc 4096
* hard nproc 4096
/etc目录下的***sysctl.conf***文件,添加以下配置
# elasticsearch
vm.max_map_count=262145
添加完成并保存后执行
sysctl -p
elasticsearch不允许以root用户启动,故新建其他用户来启动
# 创建用户组es
groupadd elk
# 创建新用户elk, -g elk 设置其用户组为elk, -p 123456 设置其密码123456
useradd elk -g elk -p 123456
# 更改 elk 文件夹及内部文件的所属用户及组为 elk:elk
chown -R elk:elk /usr/local/environment/elk
Kibana
修改/usr/local/environment/elk/kibana/kibana-7.8.0-linux-x86_64/config目录下的***kibana.yml***文件
server.port: 5601
# 允许所有ip访问
server.host: "0.0.0.0"
server.name: "SUSTechTown"
elasticsearch.hosts: ["http://localhost:9200"]# 按需开启
#elasticsearch.username: "kibana_system"
#elasticsearch.password: "pass"pid.file: /var/run/kibana.pid# 语言中文
i18n.locale: "zh-CN"# 加密,注意:参数值至少32位,否则启动会报错提示
xpack.encryptedSavedObjects.encryptionKey: SUSTechTownencryptedSavedObjects0123456789
xpack.security.encryptionKey: SUSTechTownencryptionKeysecurity01234567890
xpack.reporting.encryptionKey: SUSTechTownencryptionKeyreporting0123456789
# 给elasticsearch及其以下子目录赋予读写权限
chmod -R 777 /usr/local/environment
启动
PostgreSQL
命令行的各个参数解释说明:
- -U username 用户名,默认值postgres
- -d dbname 要连接的数据库名,默认值postgres。如果单指定-U,没指定-d参数,则默认访问与用户名名称相同的数据库。
- -h hostname 主机名,默认值localhost
- -p port 端口号,默认值5432
Redis
# 进入redis配置文件目录
cd /usr/local/environment/redis/redis/conf
# 指定配置文件开启redis服务
redis-server redis-6379.conf
PS: /usr/local/environment/redis/redis/data 目录下的日志 6379.log 如有 WARING 则按照其提示操作
(最初安装没有配置是有WARING的,操作提示很明了)
Elasticsearch
# 进入elasticsearch安装目录
cd /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0
# 切换用户
su elk
# 启动elasticsearch
./bin/elasticsearch
# 或者 后台启动
./bin/elasticsearch -d
# 启动elasticsearch-head(必须先启动elasticsearch)
cd /usr/local/environment/elk/elasticsearch/elasticsearch-head-5.0.0
npm run start
# 或者 后台启动
nohup npm run start &
如果出现一下报错,说明IK分词器插件安装不正确
java.lang.IllegalStateException: Could not load plugin descriptor for plugin directory [elasticsearch-analysis-ik-7.8.0]
Likely root cause: java.nio.file.NoSuchFileException: /usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0/plugins/elasticsearch-analysis-ik-7.8.0/plugin-descriptor.properties
检查elasticsearch-analysis-ik-7.8.0文件夹(或者ik分词器压缩包)下是否存在plugin-descriptor.properties文件
Kibana
# 进入kibana安装目录
cd /usr/local/environment/elk/kibana/kibana-7.8.0-linux-x86_64
# 切换用户
su elk
# 启动kibana
./bin/kibana
# 或者 后台启动
nohup ./bin/kibana &
若出现一下报错无法启动
FATAL Error: EACCES: permission denied, open '/var/run/kibana.pid'
则到/var/run目录下新建文件kibana.pid或执行一下命令
touch /var/run/kibana.pid
开机自启
配置使用 systemctl 管理 redis, elasticsearch, elasticsearch-head, kibana
# 进入脚本文件目录
cd /etc/init.d
# 创建脚本文件
touch redis elasticsearch elasticsearch-head kibana
Redis
#!/bin/bash
#chkconfig: 22345 10 90
#description: Start and Stop redis# redis安装目录
REDIS_PATH=/usr/local/environment/redis/redis-6.0.6
# 启动端口号
REDIS_PORT=6379
EXEC=$REDIS_PATH/src/redis-server
CLIEXEC=$REDIS_PATH/src/redis-cliPIDFILE=/var/run/redis-6379.pid
# redis配置文件路径
CONF="$REDIS_PATH/conf/redis-6379.conf"case "$1" instart)if [ -f $PIDFILE ];thenecho "$PIDFILE exists,process is already running or crashed"elseecho "Starting Redis server..."$EXEC $CONFfi;;stop)if [ ! -f $PIDFILE ];thenecho "$PIDFILE does not exist,process is not running"elsePID=$(cat $PIDFILE)echo "Stopping..."$CLIEXEC -p $REDIS_PORT shutdownwhile [ -x /proc/${PID} ]doecho "Waiting for Redis to shutdown..."sleep 1doneecho "Redis stopped"fi;;restart)"$0" stopsleep 3"$0" start;;*)echo "Please use start or stop or restart as first argument";;
esac
# 修改文件权限
chmod +x /etc/init.d/redis
Elasticsearch
#!/bin/sh
#chkconfig: 2345 80 05#description: elasticsearch# 用于启动elasticsearch的用户
ES_USER=elk
# elasticsearch安装目录
ES_PATH=/usr/local/environment/elk/elasticsearch/elasticsearch-7.8.0case "$1" instart)su $ES_USER << !$ES_PATH/bin/elasticsearch -d;
!echo "elasticsearch startup";;stop)es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`kill -9 $es_pidecho "elasticsearch stopped";;restart)es_pid=`ps aux|grep elasticsearch | grep -v 'grep elasticsearch' | awk '{print $2}'`kill -9 $es_pidecho "elasticsearch stopped"sleep 3su $ES_USER << !$ES_PATH/bin/elasticsearch -d;
!echo "elasticsearch restarted";;*)echo "Usage: $0 {start|stop|restart|force-reload|status}";;
esac
# 修改文件权限
chmod +x /etc/init.d/elasticsearch
Elasticsearch-head
#!/bin/sh#chkconfig: 2345 80 05
#description elasticsearch-head# elasticsearch-head 启动端口
ES_HEAD_HOST=9100
# elasticsearch-head 安装路径
ES_HEAD_PATH=/usr/local/environment/elk/elasticsearch/elasticsearch-head-5.0.0
# 用于启动elasticsearch-head的用户
ES_HEAD_USER=elk
# nodejs 安装路径(可以通过此命令获得: which node)
export NODE_PATH=/usr/bin/node
export PATH=$PATH:$NODE_PATH/bincase "$1" instart)su $ES_HEAD_USER<<!cd $ES_HEAD_PATH;nohup npm run start >$ES_HEAD_PATH/nohup.out 2>&1 &
!echo "elasticsearch-head startup";;stop)es_head_pid=`lsof -i :9100 | awk '{print $2}' | sed -n '2p'`kill -9 $es_head_pidecho "elasticsearch-head stopped";;restart)es_head_pid=`lsof -i :9100 | awk '{print $2}' | sed -n '2p'`kill -9 $es_head_pidecho "elasticsearch-head stopped"sleep 3su $ES_HEAD_USER<<!cd $ES_HEAD_PATH;nohup npm run start >$ES_HEAD_PATH/nohup.out 2>&1 &
!echo "elasticsearch-head restarted";;*)echo "Usage: $0 {start|stop|restart|force-reload|status}"esac
# 修改文件权限
chmod +x /etc/init.d/elasticsearch-head
Kibana
#!/bin/sh
#
# /etc/init.d/kibana4_init -- startup script for kibana4
### BEGIN INIT INFO
# Provides: kibana4_init
# Required-Start: $network $remote_fs $named
# Required-Stop: $network $remote_fs $named
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts kibana4_init
# Description: Starts kibana4_init using start-stop-daemon
### END INIT INFO#!/bin/sh
#chkconfig: 2345 80 05#description: kibana# 用于启动 kibana 的用户
KIBANA_USER=elk
# kibana安装目录
KIBANA_PATH=/usr/local/environment/elk/kibana/kibana-7.8.0-linux-x86_64case "$1" instart)su $KIBANA_USER << !nohup $KIBANA_PATH/bin/kibana &
!echo "kibana startup";;stop)kibana_pid=`ps aux|grep kibana | grep -v 'grep kibana' | awk '{print $2}'`kill -9 $kibana_pidecho "kibana stopped";;restart)kibana_pid=`ps aux|grep kibana | grep -v 'grep kibana' | awk '{print $2}'`kill -9 $kibana_pidecho "kibana stopped"su $KIBANA_USER << !nohup $KIBANA_PATH/bin/kibana &
!echo "kibana restarted";;*)echo "Usage: $0 {start|stop|restart|force-reload|status}";;
esac
# 修改文件权限
chmod +x /etc/init.d/kibana
此时可以通过以下命令启动、停止redis服务,查看服务状态
systemctl start redis
systemctl stop redis
systemctl status redis
设置开机启动
打开 /lib/systemd/system 目录下的 rc.local.service 文件,末尾加入以下内容
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
在 /etc 目录下新建 rc.loacl 文件并加上权限
sudo touch /etc/rc.local
sudo chmod +x /etc/rc.local
编写 rc.loacl 文件内容
#!/bin/sh
echo never > /sys/kernel/mm/transparent_hugepage/enabled# 服务自启
systemctl start redis
systemctl start elasticsearch
systemctl start elasticsearch-head
systemctl start kibana
exit 0
重启命令测试
reboot
其他
Ubuntu如何删除添加的仓库
我们在安装某些软件的时候需要提前设置他的仓库,但是装好后每次运行apt-get update 都会从重新去扫描这个仓库,没报错还好,但有些仓库会报错。因此我们需要删除没用的仓库。
方法:
1.用代码,这里不写了。
2.不用代码,直接在/etc/apt/sources.list.d/文件夹里面找到需要删除的仓库
PostgreSQL相关操作
# 查看PostgreSQL状态
service postgresql status
# 重启PostgreSQL
service postgresql restart# client命令行登录(下列参数自己替换)
psql -U {USERNAME} -d {DATABASE} -h {HOST} -p {PORT}# 登录数据库之后的操作
# 建立新的数据库用户
create user zhangsan with password '123456';
# 为新用户建立数据库
create database testdb owner zhangsan;
# 把新建的数据库权限赋予新用户
grant all privileges on database testdb to zhangsan;#创建超级用户
create user checker with superuser;
\password checker;
Linux相关操作
# 查看后台 redis 进程
ps -ef | grep redis
# 查看后台 elasticsearch 进程
ps -ef | grep elasticsearch
# 查看 nginx 安装目录
nginx -t
我的小站、Github
Ubuntu 20.04 搜索引擎环境搭建 (PostgreSQL 12.3, Redis 6, ELK[Elasticsearch 7.8, Logstash 7.8, Kibana 7.8])相关推荐
- ubuntu 20.04 ROS 环境下 使用 velodyne
ubuntu 20.04 ROS 环境下 使用 velodyne 系统环境配置 硬件连接 网口配置 运行驱动程序 通过rviz可视化点云 系统环境配置 安装ROS依赖 sudo apt install ...
- 零基础 Ubuntu 20.04.01 下搭建51单片机开发环境[开源编译器SDCC]
原创首发于CSDN,转载请注明出处,谢谢! 文章目录 为何会在Linux下开发单片机 个人系统环境与所用开发板 安装开源编译器 sdcc STC MCU ISP 闪存工具 stcgal 的安装 单片机 ...
- 基于ubuntu 20.04与cri-docker 搭建部署高可用k8s 1.25.3
目录 一.overlay简介 二.overlay通信过程 三.overlay应用场景 四.underlay简介 五.underlay实现模式简介 六.MAC Vlan工作模式 七.kubernetes ...
- Ubuntu 20.04 VNC server 搭建及客户端访问
vnc server安装 sudo su root apt-get update apt install gnome-panel gnome-settings-daemon metacity naut ...
- Ubuntu 20.04 LTS Server搭建软路由
首先是安装Ubuntu 20.04 LTS Server,这个步骤网上都可以找到 注意的是,安装的时候开启openssh-server 下述步骤是是指定安装好Ubuntu 20.04 LTS Serv ...
- ubuntu 10.04 CTS 环境搭建
CTS4.0测试完全教程 一.测试环境搭建 PC必须是linux系统 1.安装java6环境 下载java6 http://www.oracle.com/technetwork/java/javase ...
- ubuntu系统20.4搭建c语言环境,ubuntu 20.04 中文环境和英文环境切换
摘要: 在 ubuntu 中通过修改 /etc/default/locale 文件中 LANG 和 LANGUAGE 的值来实现中文和英文语言环境的切换. 1.查看当前安装的所有语言包 locale ...
- Ubuntu 20.04使用qemu搭建ARM64 Linux系统
1.安装所需依赖 $ sudo apt-get install debian-archive-keyring gcc-aarch64-linux-gnu bison flex bc build-ess ...
- Ubuntu 20.04 下安装 OpenCV 3.4.11 并测试使用
目录 0 操作环境 1 什么是 Opencv 2 安装 Opencv 2.1 下载 Opencv 2.2 Opencv 的配置环境 3 Opencv 对图片进行处理 3.1 代码文件创建 3.2 编译 ...
最新文章
- OpenCV(十五)边缘检测1 -- Sobel算子(一阶微分算子,X、Y方向边缘检测)
- XAML 编辑调试工具 Kaxaml
- c++怎么保留小数位数
- 存储过程Procedure
- js php 分段上传文件,php+js实现文件分块上传
- .NET Core 如何调试 CPU 爆高?
- Spring Data JPA 从入门到精通~@Query详解
- HTTP协议&SOCKET协议
- 18awg线材最大电流_USB4来了,最大的变化是这个
- SAP 根据excel模板导入并批量生成销售订单
- Hexo博客新建文章以及Next主题多层级分类
- 数据结构-直接选择排序
- 机械设计:机械加工中获得工件尺寸精度的常用方法!
- 国外素材网站打不开?还想要同品质图片?
- QT应用编程: 基于FFMPEG设计的流媒体播放器(播放rtmp视频流)
- 赛格威机器人待遇_赛格威配送机器人:年内做到10天无故障 3年10万台
- 干货来了 | SQL 进阶技巧
- 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...
- 查询计算机系教师开设的所有课程的课程号和课程名
- pfx格式是什么文件
热门文章
- IM消息送达保证机制实现(一):保证在线实时消息的可靠投递
- 解决manjaro更新后pacman: error while loading shared libraries
- 1968. [AHOI2005]约数研究【数论】
- 设置背景图片,解决手机上背景图片高度适应问题
- 逻辑地址,线性地址,物理地址
- MVC4建立DBContext的EF6数据
- SpringBoot整合Spring Security——第三章异常处理
- spring boot基础配置
- go的错误处理(异常捕获、处理):defer+recover机制处理错误、自定义异常(自定义错误)
- k8s节点亲和性:pod和node的亲和性、硬策略、软策略