在express站点中使用ejs模板引擎
在express站点中使用ejs模板引擎
选择ejs 是因为使用类似jsp技术,使用方式很像,页面可读性要比jade要好,个人习惯使用ejs。
配置模板
1 | var express = require('express'); |
后台代码
1 | app.use('/demo', function (req, res, next) { |
模板代码
demo.html
1 | <!DOCTYPE html> |
选择ejs 是因为使用类似jsp技术,使用方式很像,页面可读性要比jade要好,个人习惯使用ejs。
1 | var express = require('express'); |
1 | app.use('/demo', function (req, res, next) { |
demo.html
1 | <!DOCTYPE html> |
在node.js项目中如何获取json文件,本篇文章主要讲述两个方面:1.客户端 2.服务端。
本次采用web框架为express
1.客户端
目录结构为:
1 | / |
index.js内容如下:
1 | var express = require('express'); |
在index.html中获取如下:
1 | $.getJSON('conf/demo.json', function (data) { |
2.服务端
index.js内容如下:
1 | var express = require('express'); |
Slack是一个团队协作沟通平台,至于它的强大,就不在这里多说了,sentinl 集成slack,可以将监控告警发送至其中,这个平台支持PC和APP,可以让开发运维人员实时获取监控服务状态。
在kibana.yml配置文件中增加以下内容
1 | sentinl: |
其中hook配置项为Webhook URL
在sentinl中增加slack action
1 | "slack action": { |
node.js发送邮件有多种第三方模块,比较有名的是emailjs,nodemailer,个人感觉emailjs更轻量级,使用更简单,nodemailer关注人更多,功能更加完善。
本次选用这两种,仅实现简单发送邮件功能,更多功能,请查询官网API.
首先新建文件夹node,然后在该文件夹下新建package.json文件,在其中增加以下配置
1 | { |
在node 目录下执行命令
1 | npm install |
1 | var email = require("emailjs"); |
执行即可发送成功!
1 | node myemailjs.js |
1 | const nodemailer=require("nodemailer"); |
执行即可发送成功!
1 | node mynodemailer.js |
1 | { Error: no form of authorization supported |
1 | telnet smtp.sohu.com 25 |
最近公司ES集群升级到5.5.1,新版增加了许多新的功能,也废弃了一些特性,同时整合一些插件,做了一个统一的封装,ES栈也越来越丰富,强大了。
最近有增加X-PACK,X-Pack是一个Elastic栈扩展,将安全性,警报,监视,报告和图形功能捆绑到一个易于安装的软件包中。 X-Pack组件旨在无缝协同工作,您可以轻松地启用或禁用要使用的功能。
然并卵,这个东西是要收费的,但是这个并不妨碍开源方案,Sentinl就是一个开源方案,作为kibana插件,集成在kibana中,主要提供了预警和报告功能,在架构设计上往X-PACK上靠拢,只提供了一些基本功能,但对于目前一些简单业务需求,完全可以满足需求,这个软件开源不久,期待更多完善。
Sentinl 5扩展自Kibi / Kibana 5,具有警报和报告功能,可使用标准查询,可编程验证器和各种可配置操作来监控,通知和报告数据系列更改 - 将其视为一个独立的“观察者” “报告”功能(PNG / PDFs快照)。
SENTINEL还旨在通过直接在Kibana UI中整合来简化在Kibi / Kibana中创建和管理警报和报告的过程。
Watchers是Sentinl核心,主要由 input,Condition,Transform,Actions几大块组成,可以和X-Pack一一对应,部分文档可参考X-Pack,但需要注意的是它和X-Pack还有一些区别,主要体现在input只实现了search,其他并未实现,Actions也并未都实现
1. 安装
1 | /opt/kibana/bin/kibana-plugin install https://github.com/sirensolutions/sentinl/releases/download/tag-5.5/sentinl-v5.5.1.zip |
2. 配置
在kibana.yml添加以下内容,可以根据具体需求删减
1 | sentinl: |
业务需求:
监控指定索引1小时内数量大于1w,控制台提醒
实践:
输入名称和监控频率
2. 配置input
1 | { |
其中shoppingcartapi-*为索引模糊名称,post_date为时间字段
3. 配置Condition
1 | payload.hits.total > 10 |
配置一个console action message填写以下内容
1 | payload.hits.total:{ {payload.hits.total} } |
Tip:通过{ { } }
可以拿出search结果中的值,此处有空格是避免hexo问题,正常使用无需如此。
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。
Node.js 的包管理器 npm,是全球最大的开源库生态系统。
NodeJS的工作原理其实就是事件循环。可以说每一条NodeJS的逻辑都是写在回调函数里面的,而回调函数都是有返回之后才异步执行的!
既然NodeJS处理并发的能力强,但处理计算和逻辑的能力反而很弱,因此,如果我们把复杂的逻辑运算都搬到前端(客户端)完成,而NodeJS只需要提供异步I/O,这样就可以实现对高并发的高性能处理。情况就很多啦,比如:RESTFUL API、实时聊天、客户端逻辑强大的单页APP,具体的例子比如说:本地化的在线音乐应用,本地化的在线搜索应用,本地化的在线APP等。
优点
缺点
最近做docker image,编写shell 脚本,遇到以下问题,做个记录
1.问题一:
1 | if [ "${1:0:1}" = '-' ]; then |
解释:以上if 条件是指第一个参数的第一个字符为-
,则符合条件
2.问题二:
1 | exec "$@" |
解释:exec执行命令
3.问题三:
1 | set -- elasticsearch "$@" |
解释:set设置环境,这句话的意思其实是将elasticsearch 作为第一个参数补充到”$@”中
例如:
demo.sh
1 | #!/bin/bash |
执行脚本
1 | bash demo.sh hello truman |
输出结果为:elasticsearch hello truman
4.问题四:
1 | "$(id -u)" |
解释:输出当前shell 环境UID(用户ID)
RediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。
特性
1 | wget https://github.com/RedisLabsModules/RediSearch/archive/v0.19.1.tar.gz |
1. 创建索引
1 | 127.0.0.1:6379> FT.CREATE myIDs SCHEMA title TEXT WEIGHT 5.0 body TEXT url TEXT |
2. 增加文档到该索引
1 | 127.0.0.1:6379> FT.ADD myIDs doc1 1.0 FIELDS title "hello world" body "lorem ipsum" url "http://redis.io" |
3. 在该索引中搜索
1 | 127.0.0.1:6379> ft.search myIDs "hello world" limit 0 10 |
4. 删除索引
1 | 127.0.0.1:6379> ft.drop myIDs |
5. 添加并获取自动完成建议
1 | 127.0.0.1:6379> ft.sugadd autocomplete "hello truman" 100 |
在Redis 集群运维过程中,经常需要做一些重复性工作,因为Redis 无中心设计,这就需要在每个节点中执行相同命令,对于这些重复性劳动工作完全可以通过shell处理,降低运维难度,减少工作量,以下是我在工作冲总结的脚本,仅供大家参考。
新建脚本redis_tool.sh,然后执行
1 | sh redis_tool.sh clusterStatus 127.0.0.1 7000 |
新建脚本redis_tool.sh,然后执行
1 | sh redis_tool.sh forget 127.0.0.1 7000 |
1 | #!/bin/sh |
2017-07-14 redis 4.0 Stable version release,新增了许多新功能,此次专门抽出时间,探索一些功能,把握Redis未来的发展方向,同时积累经验,为未来升级Redis打下坚实基础。学习新的东西,如果不将它记录下来,过上两周,基本上就忘记做过什么了,对知识的掌握不利,以后尽量所有的学习都能产生文字记录,便于自己总结学习各种技术,也能给新人带去一点便利。
安装方式,较之前没有多大变化,还是写一下,便于新手学习。
1 | $ wget http://download.redis.io/releases/redis-4.0.0.tar.gz |
1 | $ cd redis-4.0.0 |
如果需要将redis-cli,redis-server等相关命令安装到/bin目录下,全局使用的话,可以使用如下命令:
1 | $ make install |
或者利用软连接实现:
1 | $ make |
在编译中可能会遇到如下问题:
1 | zmalloc.h:50:31: 错误:jemalloc/jemalloc.h:没有那个文件或目录 |
出现这个问题是libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc,关于更详细信息可以查看redis中REAME,md,其中有详细介绍,此处不再细说。
解决办法:
1 | make MALLOC=libc |
按照官方指导,搭建3m+3s集群,端口号7000-7005
以下为创建脚本:
1 | #!/bin/bash |
执行
1 | sh createCluster.sh create |
一路回车即可,注意构建集群需要使用redis-trib.rb,需要额外执行
1 | gem install redis |
结果如下:
1 | [bigdata@trumanlab1 redis-4.0.0]$ redis-cli -c -h 127.0.0.1 -p 7000 |
IMPORTANT: Redis Cluster users, please note that, as specified in the list
of incompatibilities, Redis 4.0 cluster bus protocol is not compatible with
Redis 3.2, so in order to upgrade, a mass reboot of the instances is needed
and rolling upgrades are not possible. This change was needed in order to
add compatibility for Containers/NAT, where the bus port at a fixed offset
was not an acceptable design, so we had to change many things, resulting
in the incompatible protocol.
4.0版本与3.2版本传输协议不兼容,更改该协议的目的是为了实现Containers/NAT
为了升级,需要重启大量节点,无法做到滚动升级。
- Different replication fixes to PSYNC2, the new 4.0 replication engine.
- Modules thread safe contexts were introduced. They are an >experimental API right now, but the API is considered to be stable and usable when needed.
- SLOWLOG now logs the offending client name and address. Note that this is a backward compatibility breakage in case old code assumes that the slowlog entry is composed of exactly three entries.
- The modules native data types RDB format changed.
- The AOF check utility is now able to deal with RDB preambles.
- GEORADIUS_RO and GEORADIUSBYMEMBER_RO variants, not supporting the STORE option, were added in order to allow read-only scaling of such queries.
- HSET is now variadic, and HMSET is considered deprecated (but will be supported for years to come). Please use HSET in new code.
- GEORADIUS huge radius (>= ~6000 km) corner cases fixed, certain elements near the edges were not returned.
- DEBUG DIGEST modules API added.
- HyperLogLog commands no longer crash on certain input (non HLL) strings.
- Fixed SLAVEOF inside MULTI/EXEC blocks.
- Many other minor bug fixes and improvements.
Redis 4.0 发生的最大变化就是加入了模块系统, 这个系统可以让用户通过自己编写的代码来扩展和实现 Redis 本身并不具备的功能, 具体使用方法可以参考 antirez 的博文《Redis Loadable Module System》: http://antirez.com/news/106
因为模块系统是通过高层次 API 实现的, 它与 Redis 内核本身完全分离、互不干扰, 所以用户可以在有需要的情况下才启用这个功能, 以下是 redis.conf 中记载的模块载入方法:
1 | ################################## MODULES ##################################### |
目前已经有人使用这个功能开发了各种各样的模块, 比如 Redis Labs 开发的一些模块就可以在 http://redismodules.com 看到, 此外 antirez 自己也使用这个功能开发了一个神经网络模块: https://github.com/antirez/neural-redis
模块功能使得用户可以将 Redis 用作基础设施, 并在上面构建更多功能, 这给 Redis 带来了无数新的可能性。
新版本的 PSYNC 命令解决了旧版本的 Redis 在复制时的一些不够优化的地方:
新添加了 Last Frequently Used 缓存驱逐策略, 具体信息见 antirez 的博文《Random notes on improving the Redis LRU algorithm》: http://antirez.com/news/109
另外 Redis 4.0 还对已有的缓存驱逐策略进行了优化, 使得它们能够更健壮、高效、快速和精确。
在 Redis 4.0 之前, 用户在使用 DEL 命令删除体积较大的键, 又或者在使用 FLUSHDB 和 FLUSHALL 删除包含大量键的数据库时, 都可能会造成服务器阻塞。
为了解决以上问题, Redis 4.0 新添加了 UNLINK 命令, 这个命令是 DEL 命令的异步版本, 它可以将删除指定键的操作放在后台线程里面执行, 从而尽可能地避免服务器阻塞:
1 |
|
因为一些历史原因, 执行同步删除操作的 DEL 命令将会继续保留。
此外, Redis 4.0 中的 FLUSHDB 和 FLUSHALL 这两个命令都新添加了 ASYNC 选项, 带有这个选项的数据库删除操作将在后台线程进行:
1 | redis> FLUSHDB ASYNC |
Redis 4.0 对数据库命令的另外一个修改是新增了 SWAPDB 命令, 这个命令可以对指定的两个数据库进行互换: 比如说, 通过执行命令 SWAPDB 0 1 , 我们可以将原来的数据库 0 变成数据库 1 , 而原来的数据库 1 则变成数据库 0 。这种场景是在非集群模式下使用的,在集群模式是不支持切换数据库的。默认所有的节点使用index 0。
以下是一个使用 SWAPDB 的例子:
1 | redis> SET your_name "aibibang" -- 在数据库 0 中设置一个键 |
Redis 4.0 新增了 RDB-AOF 混合持久化格式, 这是一个可选的功能, 在开启了这个功能之后, AOF 重写产生的文件将同时包含 RDB 格式的内容和 AOF 格式的内容, 其中 RDB 格式的内容用于记录已有的数据, 而 AOF 格式的内存则用于记录最近发生了变化的数据, 这样 Redis 就可以同时兼有 RDB 持久化和 AOF 持久化的优点 —— 既能够快速地生成重写文件, 也能够在出现问题时, 快速地载入数据。
这个功能可以通过 aof-use-rdb-preamble 选项进行开启, redis.conf 文件中记录了这个选项的使用方法:
1 | When rewriting the AOF file, Redis is able to use an RDB preamble in the |
新添加了一个 MEMORY 命令, 这个命令可以用于视察内存使用情况, 并进行相应的内存管理操作:
1 | 127.0.0.1:7002> memory help |
其中, 使用 MEMORY USAGE 子命令可以估算储存给定键所需的内存:
1 |
|
使用 MEMORY STATS 子命令可以查看 Redis 当前的内存使用情况:
1 | 127.0.0.1:7000> memory stats |
使用 MEMORY PURGE 子命令可以要求分配器释放更多内存:
1 | redis> MEMORY PURGE |
使用 MEMORY MALLOC-STATS 子命令可以展示分配器内部状态:
1 | redis> MEMORY MALLOC-STATS |
Redis 4.0 将兼容 NAT 和 Docker , 具体的使用方法在 redis.conf 中有记载:
1 | ########################## CLUSTER DOCKER/NAT support ######################## |