分类目录归档:web

Redis培训之二管理、监控和原理篇

  • 管理
  • 启动:

Redis-server 或redis-server  /etc/redis/redis.conf

  • 关闭:

Redis-cli SHUTDOWN  或kill redis进程号

 

  • 安全设置:

Bind  127.0.0.1  #指定只允许本机连接

Requirepass    mypassword

>AUTH  mypassword

>SET foo

 

命令重命名:

FLUSHALL  #

Rename-command FLUSHALL  fuckmemcache

Rename-command FLUSHALL “”

 

  • 管理工具:

Redis-cli

>SLOWLOG GET

 

Slowlog-log-slower-than 单位是微妙默认是10000, 1000000微妙是1秒

Slowlog-max-len  //限制记录的条数

 

  • Phpredisadmin

 

  • 超级管理工具

搜狐出品的管理工具: CacheCloud

redis_sohu

  • 监控:

命令行:

1、Redis提供的INFO命令不仅能够查看实时的吞吐量(ops/sec),还能看到一些有用的运行时信息。下面用grep过滤出一些比较重要的实时信息,比如已连接的和在阻塞的客户端、已用内存、拒绝连接、实时的tps和数据流量等:

redis-cli -h 127.0.0.1 info | grep -e “connected_clients” -e “blocked_clients” -e “used_memory_human” -e “used_memory_peak_human” -e “rejected_connections” -e “evicted_keys” -e “instantaneous”

 

 

2、从客户端可以监控Redis的延迟,利用Redis提供的PING命令,不断PING服务端,记录服务端响应PONG的时间。下面开两个终端,一个监控延迟,一个监视服务端收到的命令:

redis-cli –latency -h 127.0.0.1

3、

>redis-cli -h 127.0.0.1

>monitor

 

4、unix 命令行

watch -n 1 -d “redis-cli -h 127.0.0.1 info | grep -e “connected_clients” -e “blocked_clients” -e “used_memory_human” -e “used_memory_peak_human” -e “rejected_connections” -e “evicted_keys” -e “instantaneous””

5、图形界面

redis-live

第三方:redis-stat 命令行

压力测试:

redis-benchmark -c 10 -n 100000 -q

原理:

  • 持久化

RDB方式:

通过快照完成

Save 900 1   //900秒内有1个键被更改写快照

Save 300 10   //300秒内至少有10个键被就写快照

Save 60 10000  //60秒内有10000键发生变化就写快照

 

Dump.rdb

配置文件:

Dir //指定快照目录

Dbfilename //指定快照文件名称

快照原理:

Redis进程 fok一个子进程,父进程继续接收处理客服发来的命令,子进程开始讲内存的数据写入硬盘中的临时文件中,写完后用临时文件替换旧的RDB文件。

注意:fork函数发送的一刻父子进程共享同一内存,这时如果父进程要更改其中某片数据,操作系统会将该片数据复制一份以保证子进程的数据不受影响,所以新的RDB文件存储的是执行FORK一刻的内存数据。

 

Redis重启后会读取rdb 文件,1g快照20~30秒, 如果redis异常退出,就会丢失最后一次快照以后更改的数据,这个要跟进应用场景来定,看可接受的损失范围,如果是做缓存,丢几十个键是没关系的,如果数据相对重要,希望降到最低,就要用AOF方式了。

 

AOF方式:

Append only file,  redis 每执行一条更改redis 数据的命令,就会将该命令写入磁盘中的AOF文件。

 

Auto-aof-rewrite-percentage 100  //当目前aof文件大小超过上一次重写时的AOF文件大小的百分之多少会再次重写。

Auto-aof-rewrite-min-size 64mb  //限制了允许重写的最小AOF文件大小。

 

操作系统缓存机制,数据先写入了硬盘缓存,默认30秒后再写入磁盘,如果发生故障,这30秒的数据将丢失,如果要开启实时同步需要配置:

Appendsync everysec /always/no no表示不主动同步。

 

  • 主备复制原理

Redis-server  //启动主数据库

Redis-server –port 6380 –slveof 127.0.0.1 6379 //启动从数据库

 

redis

如果断链,2.6版本的会全部再进行复制,2.8以后只会同步增量数据。

从数据库同步过程中,可以继续处理客户端发来的命令,默认从数据库会对同步前的命令做响应,可以配置salve-serve-stale-data  no //使从数据库在同步完成前对所有命令都回复错误:SYNC with master in progress.

只要执行复制就会生成快照,即使我们关闭了RDB的方式。

2.8.18之后可以支持无硬盘复制。

Repl-diskless-sync yes  //开启无硬盘复制选项

 

乐观复制:容忍在一定时间内主从数据不一致,但最终数据会同步。

redis1

当主数据库执行1条写命令后,主数据库发生变动,当主数据库将该命令传送给从数据库之前,网络断开了,二者数据就不一致了,从这个角度,主数据库是不知道某个命令同步给了多少从数据库,redis提供了2个配置选项来限制只有当数据至少同步给指定数量的从数据库时,主数据库才可写:

Min-slave-to-write 3  //表示只有当3个或以上从数据库连接到主数据库时,主数据库可写。

Min-slave-max-lag 10 //表示允许从数据库最长失去连接的时间。

 

  • 哨兵集群原理

2.8版本的功能,功能是监控主从数据库是否正常,主备自动切换

Redis-server  //启动主数据库6739端口

Redis-server –port 6380 –slveof 127.0.0.1 6379 //启动从数据库

Redis-server –port 6381 –slveof 127.0.0.1 6379 //启动从数据库

 

Sentinel.conf

Sentinel monitor mymaster  127.0.0.1 6379 1

其中mymaster是表示要监控的主数据库的名字,ip是主数据库的地址和端口号, 1表示最低通过票数。

Redis-sentinel  sentinel.conf

 

配置监控主数据库,哨兵会自动发现所有从数据库。

redis2

Sentinel down-after-milliseconds 60000  或600毫秒

哨兵每秒发送PING命令,如果没回复,哨兵认为主观下线,如果是主数据库,哨兵发送SENTINEL is-master-down-by-addr 命令询问其他哨兵节点以了解他们是否也认为该主数据库主观下线,如果达到指定数量,哨兵认为其客观下线。

 

故障恢复:

1、发现客观下线的哨兵A,先每个哨兵发送命令,要求对方选自己成为领导哨兵。

2、如果目标哨兵没有选择过其他人,就同意A

3、如果A发现有超过半数且超过quorum参数值的投票,A为领头哨兵。

4、如果多个哨兵参选,就随机再来一轮选举。

 

哨兵头领选中后,选择优先级最高的从数据库成为主数据库,slave-priority

 

  • 真正的集群部署,3.0版本以上,开启:

Cluster-enabled

 

 

Redis培训之一安装和配置文件

培训大纲

  • 简介

Redis全拼remote dictionary server (远程字典服务器),存储结构是键值对的形式,支持的数据类型有:

字符串类型

散列类型

列表类型

集合类型

有序集合类型

 

用途:

  • 做缓存
  • 使用列表键实现队列,还支持发布/订阅的消息模式。

 

Redis and memcache对比:

Redis 是单线程模型,memcached是多线程模型,多核机器上memcached性能高一些,2015.4.2号redis3.0发布,现在memcache所有功能都是redis的子集,已经完成可以memcached, 支持集群模式。

 

演示存储命令:

 

  • 安装

#http://download.redis.io/releases/redis-2.8.19.tar.gz

#tar zxvfredis-2.8.19.tar.gz

#cd /home/app/redis-2.8.19

#make

#make install

 

配置文件:redis.conf

 

  • 配置文件讲解

 

修改内容:

Daemonize  yes

Pidfile  /var/run/redis_6379.pid

Port

Dir /var/redis/6379 #持久化文件存放位置

 

 

CONFIG SET loglevel warning

 

微信小程序之运维小项目

自从微信推出小程序以来,现在业界炒的非常的火,具说叫微信小程序是因为某公司不让叫应用号,我在朋友圈也看过pony的和张小龙朋友圈关于名字的讨论截图,不知道是真是假,反正名字是定了,叫啥无所谓,还是知道它是干啥的比较重要, 像网上说什么新风口了,原生APP以后没活路了等相关文章喜欢的可以多看看, 我们今天不会在产品层面上去介绍小程序,因为我们是搞运维的,所以我还是在运维层面怎么使用小程序, 今天我们用实际例子来讲解和普及小小程序如何使用,来实现类似IP138的功能,输入IP可以查看IP的详细信息,包括归属,地点等,我们先看下完成后的效果:

ipgif

基本功能就是做一个IP查询的页面,输入ip,能够查询IP的详细信息,后台调用的淘宝的IP库,OK,界面和功能就是这样了,比较简单,接下来我们来介绍小程序的基本概念和使用。

第一步,先下载微信小程序开发者工具,这个是必须的,因为只能在这个工具里去调试你的代码,但写代码不一定要在这个工具里去写,在Sublime 里写也可以,但调试你必须在这工具里,关于怎么下怎么装这我就不多说了,如果这步都没搞定我觉得往下看也没啥意义了,当然是开个玩笑,如果有问题的,可以给我留言。

安装后,第一次运行需要用微信扫描,来识别开发者,然后添加项目,微信开发者工具可以帮你生成一个简单的demo项目,生成项目后如图:

pro

 

我们先看app.js、app.json、app.wxss 这三个,其中

app.js 是小程序的脚本代码,可以定义全局变量, 指定小程序的生命周期函数(onLaunch,onShow,onHide,其它),

app.json文件是配置文件,主要配置小程序的页面,所有的页面设置都要写在这个文件里

app.wxss 是公共样式表文件。

除了这些文件,我们还有两个目录,这2个目录展示的是index 页面和 logs 页面,每个目录下如果完整的情况下都会有4个文件:

如上图所示,现在每个目录下分别是index.js、index.wxml、index.wxss,其中.js 后缀的文件是脚本文件,.json 后缀的文件是配置文件(非必须),.wxss 后缀的是样式表文件(非必须),.wxml 后缀的文件是页面结构文件。

以上就是小程序的基本概念了,了解了这些,就可以开始我们的小项目开发了。

首先我们先写index.wxml。

代码如下:

indexhtml

 

因为界面我加了一部分样式,所以要写index.wxss样式文件,代码如下:

indexcss

 

有了这些只是个壳子,输入IP点击查询时没有效果的, 因为我们还需要从后台获取数据,现在开始写我们的index.js文件,因为js文件内容比较多,我们分开介绍,先说下下初始化部分,

js1

刚开始都是空,然后是我们的核心函数,先判断IP是否为空,如果是就提示IP不能为空,如果有IP,就调用wx.request发请求,将获得的数据然后通过setData来赋值,如网络有问题,就报网络请求失败,代码如下:

js2

最后,查询完后需要重新输入,当用户点重置时清空所有的内容,包括刚获取的值,代码如下:

js3

完成以上代码就可以在开发者工具里调试下了,如果都正常,这个小项目就算完成了,等微信开发公测的时候就可以传到微信小程序市场里,然后每个人就可以下载去使用了。

关于小程序的内容我就介绍到这里,我这里就算是抛砖引玉了,喜欢的小伙伴可以帮忙转发下,让更多的小伙伴可以学习到新的知识,另外因为小程序是非常新的东西,想更深入了解的可以去看小程序的官方文档。

nginx+ngx_lua_waf安装

最近上新项目,搭建nginx的时候为保证安全,决定安装下waf模块,以下是具体步骤,首先下载需要的安装包,进行每个安装:

wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz

tar -zxvf LuaJIT-2.0.3.tar.gz

cd LuaJIT-2.0.3

make

make install

然后下载nginx,

wget  http://nginx.org/download/nginx-1.7.6.tar.gz

tar -zxvf nginx-1.7.6.tar.gz

下载ngx_devel_kit,

wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.19.tar.gz –no-check-certificate

tar -zxvf v0.2.19.tar.gz

下载nginx_lua_module

wget https://github.com/openresty/lua-nginx-module/archive/v0.9.13rc1.tar.gz –no-check-certificate

tar -zxvf v0.9.13rc1.tar.gz

cd nginx-1.7.6

安装pcre,

tar -zxvf pcre-8.30.tar.gz

cd pcre-8.30

./configure

make

make install

安装openssl,

tar -zxvf openssl-1.0.0.tar.gz

安装ngx_cache_purge模块:

tar   -zxvf  ngx_cache_purge-1.3.tar.gz

安装zlib,    yum install zlib zlib-devel

设置环境变量,进行编译,

export LUAJIT_LIB=/usr/local/lib

export LUAJIT_INC=/usr/local/include/luajit-2.0

./configure –prefix=/usr/local/nginx –with-http_stub_status_module –with-http_ssl_module –add-module=/root/ngx_devel_kit-0.2.19 –add-module=/root/lua-nginx-
module-0.9.13rc1 –with-http_ssl_module –with-openssl=/root/openssl-1.0.0 –add-module=/root/ngx_cache_purge-1.3 –with-pcre=/root/pcre-8.30 –with-ld-opt=”-Wl,-rpat
h,$LUAJIT_LIB”

make  -j2

make install

建立目录存放攻击日志:

mkdir -p /data/logs/hack/

chown -R nobody:nobody /data/logs/hack/

chmod -R 755 /data/logs/hack/

下载waf,

wget https://github.com/loveshell/ngx_lua_waf/archive/master.zip –no-check-certificate

unzip master.zip

cd ngx_lua_waf-master/

mkdir /usr/local/nginx/conf/waf

mv * /usr/local/nginx/conf/waf/

cd /usr/local/nginx/conf/

vi nginx.conf

在http 段加入:

lua_package_path “/usr/local/nginx/conf/waf/?.lua”;
lua_shared_dict limit 10m;
init_by_lua_file  /usr/local/nginx/conf/waf/init.lua;
access_by_lua_file /usr/local/nginx/conf/waf/waf.lua;

 

启动前运行: ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2  否则会找不到这个模块报错。

过滤规则在wafconf下,可根据需求自行调整,每条规则需换行,或者用|分割
global是全局过滤文件,里面的规则对post和get都过滤
get是只在get请求过滤的规则
post是只在post请求过滤的规则
whitelist是白名单,里面的url匹配到不做过滤
user-agent是对user-agent的过滤规则

文章部分内容参来源网络。

redis主从集群搭建

业务迁移,需要搭建一个新的redis集群,就把相关的知识学习了下,先从操作开始,然后开始讲下理论知识,开始搭建:

下载包:

wget http://download.redis.io/releases/redis-2.8.19.tar.gz

tar -zxvf redis-2.8.19.tar.gz

cd redis-2.8.19/

make     #有的系统需要加make MALLOC=libc

make test

make install

安装完毕在主节点上配置文件redis.conf,内容如下:

配置哨兵,sentinel.conf

启动:

备机上安装跟主机一样,我们直接贴配置文件:

注意最后一句,slavef 指明从属与那个主机,以下是sentinel.conf配置:

然后启动,命令跟主一样。

查看信息,主机上运行:

redis-cli -p 6479

我这里有2台slave,如果输出这些就表示正常了,接下来我们说说 redis和哨兵的关系以及复制原理。