一、缓存的概念

1、Buffer,Cache的区别:

buffer: 一般用于写操作,写缓冲。
cache: 一般用于读操作,读缓存。
它们都是解决速度不一致的问题,都设计到IO操作。

2、Cache的重点关注点:

1.存放位置(多级cache):
客户端(浏览器缓存)
内存(本地或者远程服务器)
硬盘(本地或者远程服务器)
2.过期时间: TTL
3.强制失效
4.Cache的命中率(重点): 一个完全没有命中率的cache没有意义。

二、浏览器缓存

1、缓存协商的定义

浏览器和web服务器进行缓存的对话。

2、浏览器缓存的几种方式

Last-Modified: 文件最后修改时间
Etag: MD5
Expires: 过期时间 Nginx设置方法:
location ~ .*\.(js|css){
expires 1h; #1小时过期
}
(如果在过期前发现js错了,需要改名或者加时间123.js变成123.js?201610)
Cache-Control: 解决客户端时间不对的问题

3、浏览器几种刷新方式的区别:

在地址栏敲击Enter键: 只要没有过期的直接使用缓存,所有缓存机制都生效。
F5或者刷新按钮: Expires不受影响,其他缓存机制都失效。
Ctrl+F5: 强制刷新,所有缓存机制都失效,相当于第一次访问网页。

三、CDN相关

1、CDN主要解决以下问题:

不同运营商的互联问题,BGP又贵。
用户和服务器之间网络传输距离长的问题。
现有服务器带宽有限。
提高用户的响应速度和成功率。
百度CDN:https://cloud.baidu.com/product/cdn.html
阿里CDN:https://www.aliyun.com/product/cdn?spm=5176.8269123.416540.50.728y8n
腾讯CDN:https://www.qcloud.com/product/cdn

2、CDN的核心技术

1.内容调度 - 智能dns(根据你的localDNS的Ip来判断)
2.监测系统 - 监测各个节点的链路状态和健康状态
3.内容分发 - 预缓存
4.过期刷新 - 缓存刷新
5.数据存储 - 文件的存储
6.用户配置中心 - saltstack ansible
7.计费系统
8.数据可视化 - 日志分析,日志下载
9.防攻击 - WAF

四、Nginx反向代理缓存配置

1、配置nginx反向代理缓存

# vim /usr/local/nginx/conf/proxy.conf
#cdn
proxy_temp_path /data/cdn_cache/proxy_temp_dir; #缓存的临时目录
proxy_cache_path /data/cdn_cache/proxy_cache_dir levels=1:2 keys_zone=cache_one:50m inactive=1d max_size=1g;
#缓存的目录,缓存级别1:2,缓存名称cache_one,内存缓存大小50M,自动清除1天没访问的文件,硬盘缓存大小1G
proxy_connect_timeout 5;
proxy_send_timeout 60;
proxy_read_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_404;
#后端服务器出现500,502等异常后,可以分配到下一台服务器程序继续处理,提高平台访问成功率 # vim /usr/local/nginx/conf/vhost/bbs.conf
location ~ .*.(gif|jpg|png|bmp)$ {
  proxy_pass http://image;
#Use Proxy Cache
 proxy_cache cache_one; #匹配上面的缓存配置
 proxy_cache_key "$host$request_uri";
 add_header Cache "$upstream_cache_status"; #增加header头
 proxy_cache_valid 200 304 301 302 8h;
 proxy_cache_valid 404 1m;
 proxy_cache_valid any 2d;
   } # mkdir -p /data/cdn_cache/proxy_cache_dir/
# mkdir -p /data/cdn_cache/proxy_temp_dir

2、如何根据URL来删除缓存文件

先查看缓存文件的头部信息:
# head /data/cdn_cache/proxy_cache_dir/c/7c/9857f1ea1acafc1697b2121f36f7f7cc KEY: bbs.wmj.com/b.gif #这个是Key值,根据上面定义格式来生成的"$host$request_uri"
HTTP/1.1 200 OK
Date: Wed, 05 Jul 2017 07:59:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Wed, 05 Jul 2017 04:15:35 GMT
ETag: "2009e8-26ec-5538a40711f72"
Accept-Ranges: bytes
Content-Length: 9964
Connection: close 缓存文件名就是根据KEY值的MD5计算而来。
# echo -n "bbs.wmj.com/b.gif" |md5sum
9857f1ea1acafc1697b2121f36f7f7cc - 文件路径”c/7c”分别是md5的最后一位和倒数2-3位来生成。
通过这个来定义“levels=1:2”

3、删除nginx缓存文件的脚本

#!/bin/bash
#######################################################
#说明:
# 1.本脚本用于清除nginx缓存文件
# 2.查看你的nginx是根据什么作为key来hash的,我的设置是 proxy_cache_key $host$request_uri;
# 因此nginx会根据$host$request_uri作为key进行hash,因此可以模拟nginx对一个key进行再
# hash找到相应的文件路径,删除(具体可随意找个缓存文件 more 一下看看)
# 3.缓存设置 proxy_cache_path /data/cdn_cache/proxy_cache_dir/ levels=1:2 keys_zone=cache_one:6000m inactive=15d max_size=200g;
# 根据相应的配置,请做相应修改测试
# 4.uri格式请按照同级目录下rm_apk_list.txt中填写
##################################################### while read -r line
do
md5uri=`echo -n $line | md5sum | awk '{ print $1 }'`
filepath=`echo "$md5uri" | awk '{print "/data/cdn_cache/proxy_cache_dir/"substr($0,length($0),1)"/"substr($0,length($0)-2,2)"/"$0}'`
rm -rf $filepath
done /root/rm_apk.sh < rm_apk_list.txt #脚本执行命令

五、PHP的缓存机制

1、安装php的opcache

参考资料:http://php.net/manual/zh/book.opcache.php

安装的时候: –enable-opcache
php.ini
zend_extension=opache.so
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable_cli=1

2、PHP本地缓存

php-yac

六、其他缓存

1、RAID卡的基本命令

1、查看当前RAID卡缓存策略
MegaCli64 -LDinfo -Lall -aAll
Default Cache Policy: WriteThrough,ReadAheadNone,Direct,No Write Cache if Bad BBU
Current Cache Policy: WriteThrough,ReadAheadNone,Direct,No Write Cache if Bad BBU 2、缓存策略说明
1) 写策略
WriteBack: 写缓存策略,
WriteThrough: 直接写入磁盘,不使用RAID卡缓存
2) 预读策略
ReadAheadNone: 不开启预读
ReadAhead: 开启预读,在读时,预先把后面顺序的数据载入raid卡缓存,在顺序读,有良好的性能,在随机读,性能下降(适合文件系统,不适合数据库系统)
ReadAdaptive: 自适应预读,在缓存和I/O空闲时选择预读,默认策略
3) 读策略
Direct: 读操作,不缓存到RAID卡缓存
Cached: 读操作,缓存到RAID卡缓存
4) 电池策略
No Write Cache if Bad BBU: 如果BBU(电池)出问题,不使用写缓存(从WriteBack自动切换到WriteThrough,默认)
Write Cache OK if Bad BBU: 如果BBU(电池)出问题,使用写缓存(有UPS或者双电源的情况) 3、RAID卡策略更改
1) 修改WriteBack
MegaCli64 -LDSetProp -WB -Lall -aAll
2) 修改WriteThrough
MegaCli64 -LDSetProp -WT -Lall -aAll
3) 修改No Write Cache if Bad BBU
MegaCli64 -LDSetProp -NoCachedBadBBU -Lall -aAll
4) 修改Write Cache OK if Bad BBU:
MegaCli64 -LDSetProp -CachedBadBBU -Lall -aAll

2、其它相关命令

# dmidecode | grep"Product"                                                 #查看机器型号
# dmidecode| grep "Manufacturer" #查看厂商
# dmidecode | grep "Serial Number" #查看序列号
# dmidecode | grep "CPU" #查看CPU信息
# dmidecode | grep "Socket Designation: CPU" |wc –l #查看CPU个数
# dmidecode | grep"Date" #查看出厂日期
# MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Charger Status" #查看充电状态
# MegaCli64 -AdpBbuCmd-GetBbuStatus –aALL #显示BBU状态信息
# MegaCli64 -AdpBbuCmd-GetBbuCapacityInfo –aALL #显示BBU容量信息
# MegaCli64 -AdpBbuCmd-GetBbuDesignInfo –aALL #显示BBU设计参数
# MegaCli64 -AdpBbuCmd-GetBbuProperties –aALL #显示当前BBU属性
# MegaCli64 -AdpBbuCmd-GetBbuStatus -aALL |grep "Relative State of Charge" #查看充电进度百分比
# MegaCli64 -cfgdsply -aALL|grep "Number of DISK GROUPS:" #查询Raid阵列数
# MegaCli64-cfgdsply –aALL #显示Raid卡型号,Raid设置,Disk相关信息
# MegaCli64 -PDList-aALL #显示所有物理信息
# MegaCli64 -LDInfo -LALL–aAll #显示所有逻辑磁盘组信息
# MegaCli64 -PDRbld-ShowProg -PhysDrv [1:5] -a0 #查看物理磁盘重建进度(重要)
# MegaCli64 –adpCount #查看适配器个数
# MegaCli64 -AdpGetTime–aALL #查看适配器时间
# MegaCli64 -AdpAllInfo–aAll #显示所有适配器信息
# MegaCli64 -cfgdsply -aALL|grep Polic #查看Cache 策略设置

七、Redis

1、Redis与Memcached对比

Memcached: 不支持持久化,纯set或get性能高过redis,简单易用,支持类型单一,没有验证。
Redis: 支持持久化,易用,支持多种数据类型,支持集群,有基础验证。
SSDB: 兼容redis,支持存储分级

2、Redis的安装

1、编译安装
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
# tar zxvf redis-3.0.7.tar.gz
# cd redis-3.0.7
# make PREFIX=/usr/local/redis/ install
# cp utils/redis_init_script /etc/init.d/redis
# chmod +x /etc/init.d/redis
# mkdir /etc/redis
# cp redis.conf /etc/redis/6379.conf 2、修改启动脚本
# vim /etc/init.d/redis
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
$CLIEXEC -h 10.1.1.11 -p $REDISPORT -a 123456 shutdown #停止脚本要加IP和密码 3、修改配置文件
# vim /etc/redis/6379.conf
daemonize yes #开启后台启动
pidfile /var/run/redis_6379.pid
bind 172.16.1.211
logfile "/var/log/redis_6379.log" #日志目录
dir /var/lib/redis_6379/ #持久化目录
requirepass 123456 #设置密码
# mkdir /var/lib/redis_6379 4、启动Redis
/etc/init.d/redis start 5、修复启动时的告警信息
# less /var/log/redis_6379.log #查看告警
# vim /etc/sysctl.conf
vm.overcommit_memory = 1 #内存分配策略
# vim /etc/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled #禁用大页内存
echo 1024 > /proc/sys/net/core/somaxconn #系统的baklog大小 vm.overcommit_memory(内存分配策略)
0: 内核会检查是否有可用内存使用,若有,分配给应用,否则不分配,并返回错误给应用
1: 内核允许分配所有的物理内存,不管内存的状态
2: 内核允许分配超过所有物理内存和交换空间总和的内存

3、Redis的数据类型

参考资料:http://doc.redisfans.com
1、Redis基础命令
# redis-cli -h 172.16.1.211 -a 123456 #登陆Redis
6379> auth 123456 #登录密码
6379> set name linux #新建一个key值
6379> get name #获取一个Key值
6379> keys * #查看所有key值,生产不要用
6379> EXISTS name #查看一个key值是否存在
6379> del name #删除一个Key值
6379> type name #查看Key的类型 2、字符串
6379> SET page_view 20
6379> INCR page_view #将 key 的值自增1
6379> DECR page_view #将 key 的值自减1
6379> DECRBY page_view 2 #将 key 的值自减2 3、哈希(hash)
6379> HSET car price 20000
6379> HSET car name BMW #新建哈希表car并设置key和值
6379> HGETALL car #获取哈希表所有key和值
1) "price"
2) "20000"
3) "name"
4) "BMW"
6379> HGET car price #获取哈希表指定key的值
6379> HDEL car name #删除哈希表指定key
6379> HKEYS car
1) "price"
2) "name"
6379> HLEN car #获取哈希值长度 4、列表(list)
6379> llen number #查看列表长度
6379> LPUSH number 1 #从列表左侧插入
6379> RPUSH number 5 #从列表右侧插入
6379> LRANGE number 0 -1 #获取所有列表值
6379> LPOP number #从左侧删除列表值 5、集合(Set)
6379> sadd a 1 #创建集合
6379> SMEMBERS a #获取集合
6379> SISMEMBER a 1 #判断1是否在集合a中
6379> SDIFF a b #查看a和b集合的差集
6379> SINTER a b #查看a和b集合的交集
6379> SUNION a b #查看a和b集合的并集

4、Redis的持久化

1、Redis的持久化介绍
RDB: 在指定的时间间隔内,生成快照
AOF: 记录所有执行写操作命令,在服务器启动时,通过重新执行命令来还原数据,支持AOF文件的重写(rewrite)
##生产环境两种同时用
参考资料:http://doc.redisfans.com/topic/persistence.html 2、开启RDB快照
1) 修改配置文件
# vim /etc/redis/6379.conf
save 900 1 #900秒内有1个KEY改变,就保存一次
save 300 10 #300秒内有10个KEY改变,就保存一次
save 60 10000 #60秒内有10000个KEY改变,就保存一次
dbfilename dump_6379.rdb #快照名
dir /var/lib/redis_6379/ #快照目录
rdbcompression yes #开启快照压缩(消耗cpu) 3、开启AOF
1) 修改配置文件
# vim /etc/redis/6379.conf
appendonly yes #是否开启AOF,默认关闭(no)
appendfilename appendonly.aof #指定 AOF 文件名
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
如果同时开启rdb和aof,会采用aof方式 2) Redis刷写模式
appendfsync always #每次收到写命令立即写入磁盘,安全性高,速度慢
appendfsync everysec #每秒写入磁盘,在性能和安全做了折中(推荐)
appendfsync no #完全依赖OS的写入,性能好,安全性低,(linux默认是30秒一次,不推荐) 3) Redis的rewrite
no-appendfsync-on-rewrite yes #yes: 重写期间对新写操作不fsync,暂时存在内存中,等重写完再写入
auto-aof-rewrite-percentage 100 #当前aof文件大小是上次的2倍时,自动开启重写
auto-aof-rewrite-min-size 64mb #当aof文件达到64m,自动开启重写

5、Redis的主从复制

1、Redis的复制介绍
1) Redis 使用异步复制,从以每秒一次的频率,向主报告复制流
2) 一个主可有多个从,一个从也可有多个从,主从复制不会阻塞主和从
3) 关闭主的持久化,设置主从复制,开启从的持久化,主的性能会提升
参考资料:http://doc.redisfans.com/topic/replication.html 2、开启主从复制
6379> slaveof 192.168.1.1 6379

八、Redis的集群

1、redis的几种集群方案

1.客户端分片
2.代理分片
3.Redis-Cluster: 案例少,专用客户端,故障多
4.Codis: 案例多,dashboard,有迁移工具,需要zookeeper或者etctd

2、软件相关

java软件                jdk-8u151-linux-x64.tar.gz
zookeeper zookeeper-3.4.10.tar.gz
go软件 go1.8.linux-amd64.tar.gz
codis codis-3.2.11

3、端口相关

zookeeper               2181(客户端连接的端口)
2888(集群通讯端口)
3888(集群选举端口)
codis-dashboard 18080(dashboard接口端口)
codis-proxy 19000(proxy端口)
codis-fe 9090(集群管理面板FE)

4、安装部署Zookeeper集群

1、安装Java
旧版本Java: https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html
# cd /usr/local/src/
# wget https://download.oracle.com/otn/java/jdk/8u151-b12/f6dcbf/jre-8u151-linux-x64.tar.gz --no-check-certificate
# tar -zxvf jdk-8u151-linux-x64.tar.gz
# mv jdk1.8.0_151 /usr/local/
# cd /usr/local/
# ln -sv jdk1.8.0_151 jdk
# vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
# source /etc/profile
# java -version 2、安装Zookeeper
方法1
① 下载并解压
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.10/zookeeper-3.4.10.tar.gz
# tar -zxvf zookeeper-3.4.10.tar.gz
# mv zookeeper-3.4.10 /usr/local/
# ln -s /usr/local/zookeeper-3.4.10/ /usr/local/zookeeper ② 创建数据目录和id
# mkdir -p /data/zk1 /data/zk2 /data/zk3
# echo "1" >/data/zk1/myid #服务id,不能相同
# echo "2" >/data/zk2/myid
# echo "3" >/data/zk3/myid ③ 修改配置文件
# cd /usr/local/zookeeper/conf
# grep '^[a-z]' zoo.cfg
tickTime=2000 #心跳间隔,单位毫秒,2000毫秒=2秒
initLimit=10 #选举时间间隔,10*2000=20秒
syncLimit=5 #集群通讯时间间隔,5*2000=10秒
dataDir=/data/zk1 #数据目录
clientPort=2181 #客户端连接端口
server.1=172.16.1.211:3181:4181 #1=服务id,ip:集群通讯端口:集群选举端口
server.2=172.16.1.211:3182:4182
server.3=172.16.1.211:3183:4183
# cp zoo.cfg zk1.cfg
# cp zoo.cfg zk2.cfg
# cp zoo.cfg zk3.cfg
# sed -i 's/zk1/zk2/g' zk2.cfg
# sed -i 's/zk1/zk3/g' zk3.cfg #数据目录
# sed -i 's/2181/2182/g' zk2.cfg #端口
# sed -i 's/2181/2183/g' zk3.cfg ④ 启动3个Zookeeper
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk1.cfg
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk2.cfg
# /usr/local/zookeeper/bin/zkServer.sh start /usr/local/zookeeper/conf/zk3.cfg ⑤ 连接上zookeeper
# /usr/local/zookeeper/bin/zkCli.sh -server 172.16.1.211:2181

⑥ 查看集群节点状态
# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk1.cfg
Mode: follower #备用节点
# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
Mode: leader                                          #主节点
# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zk3.cfg
Mode: follower                                        #备用节点

方法2
① 下载并解压
# cd /usr/local/src/
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/stable/zookeeper-3.4.10.tar.gz
# tar -zxvf zookeeper-3.4.10.tar.gz
# mv zookeeper-3.4.10 /usr/local/
# cd /usr/local/
# ln -sv zookeeper-3.4.10 zookeeper ② 创建数据目录和id
# mkdir /data/zookeeper/data -p ③ 修改配置文件(所有节点)
# cd /usr/local/zookeeper/conf/
# cp zoo_sample.cfg zoo.cfg
# vim zoo.cfg
dataDir=/data/zookeeper/data
dataLogDir=/data/zookeeper/log
clientPort=2181
server.1=192.168.10.5:2888:3888
server.2=192.268.10.6:2888:3888
server.3=192.268.10.7:2888:3888
# vim /etc/profile
export PATH=$PATH:/usr/local/zookeeper/bin
# source /etc/profile ④ 创建服务ID(node01)
# echo "1" > /data/zookeeper/data/myid ⑤ 创建服务ID(node02)
# echo "2" > /data/zookeeper/data/myid ⑥ 创建服务ID(node03)
# echo "3" > /data/zookeeper/data/myid ⑦ zookeeper的启动、停止
# /usr/local/zookeeper/bin/zkServer.sh start #启动
# /usr/local/zookeeper/bin/zkServer.sh stop #停止
# /usr/local/zookeeper/bin/zkServer.sh status #状态 ⑧ zookeeper查看状态
# /usr/local/zookeeper/bin/zkServer.sh status /usr/local/zookeeper/conf/zoo.cfg ⑨ zk管理
# /usr/local/zookeeper/bin/zkCli.sh -server 192.168.10.5:2181
help
ls /
ls /zookeeper
rmr /zk/codis/db_xiao/dasbboarsh #删除(慎用)

5、安装Codis

方法1
① 安装依赖包和GO环境
# yum install gcc glibc gcc-c++ make git
# wget https://storage.googleapis.com/golang/go1.6.1.linux-amd64.tar.gz --no-check-certificate
# tar -zxvf go1.6.1.linux-amd64.tar.gz
# mv go /usr/local/ ② 创建GOPATH:
# mkdir /usr/local/go/work
# vim /etc/profile>>
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go/work
export PATH=$JAVA_HOME/bin:$PATH:$GOROOT/bin:$GOPATH/bin
# source /etc/profile
# go version ③ 下载Codis源码并编译
# go get -u -d github.com/CodisLabs/codis #下载codis
# go get github.com/tools/godep #下载godep工具
# cd $GOPATH/src/github.com/tools/godep
# go install ./ #安装godep
# cd $GOPATH/src/github.com/CodisLabs/codis
# make && make gotest #安装codis 方法2
① 安装go环境
# cd /usr/local/src
# wget https://redirector.gvt1.com/edgedl/go/go1.8.5.linux-amd64.tar.gz --no-check-certificate
# tar -zxvf go1.8.5.linux-amd64.tar.gz
# mv go /usr/local ② 创建GOPATH
# mkdir /usr/local/go/work
# vim /etc/profile
export GOARCH=amd64
export GOOS=linux
export GOROOT=/usr/local/go
export GOPATH=/usr/local/go/work
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# source /etc/profile
# go version ③ 下载Codis源码并编译
# yum install gcc glibc gcc-c++ make git autoconf -y
# mkdir $GOPATH/src/github.com/CodisLabs -p
# cd $GOPATH/src/github.com/CodisLabs
# git clone https://github.com/CodisLabs/codis.git -b release3.2
# cd codis
# make ④ 创建codis数据和日志目录
# mkdir /usr/local/codis/{data,log} -p
# cp -ar /usr/local/go/work/src/github.com/CodisLabs/codis/bin /usr/local/codis/
# cp -ar /usr/local/go/work/src/github.com/CodisLabs/codis/config /usr/local/codis/
# cp -ar /usr/local/go/work/src/github.com/CodisLabs/codis/admin /usr/local/codis/ ⑤ 修改环境变量
# vim /etc/profile
export PATH=$PATH:/usr/local/codis/bin
# source /etc/profile

6、codis-dashboard 部署

1、修改配置文件
# cd /usr/local/codis/config/
# grep -Ev '^#|^$' dashboard.toml
coordinator_name = "zookeeper" #外部存储类型
coordinator_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181" #外部存储地址
product_name = "codis-ph" #集群名
product_auth = "" #集群密码,默认是空
admin_addr = "0.0.0.0:18080" #api端口
migration_method = "semi-async"
migration_parallel_slots = 100
migration_async_maxbulks = 200
migration_async_maxbytes = "32mb"
migration_async_numkeys = 500
migration_timeout = "30s"
sentinel_quorum = 2
sentinel_parallel_syncs = 1
sentinel_down_after = "30s"
sentinel_failover_timeout = "5m"
sentinel_notification_script = ""
sentinel_client_reconfig_script = "" 2、启动、停止codis-dashboard服务
方法1
# /usr/local/codis/admin/codis-dashboard-admin.sh start #启动
# /usr/local/codis/admin/codis-dashboard-admin.sh stop #停止
方法2
# nohup /usr/local/codis/bin/codis-dashboard --ncpu=2 -c /usr/local/codis/config/dashboard.toml \
--log=/usr/local/codis/log/dashboard.log --log-level=WARN & #启动
--ncpu                  最大CPU 个数
-c,--config             指定配置文件
-l,--log                设置日志文件
--log-level             设置日志级别(INFO,WARN,DEBUG,ERROR,默认INFO,推荐WARN)
# /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --shutdown #停止

 7、codis-porxy 部署(本机启动了dashboard时)

1、修改配置文件
# cd /usr/local/codis/config/
# grep -Ev '^#|^$' proxy.toml
product_name = "codis-ph" #集群名
product_auth = "" #集群密码
session_auth = ""
admin_addr = "0.0.0.0:11080" #api地址
proto_type = "tcp4" #redis端口类型(tcp/tcp4/tcp6/unix/unixpacket)
proxy_addr = "0.0.0.0:19000" #Redis端口地址
jodis_name = "zookeeper" #注册zookeeper地址
jodis_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181"
jodis_timeout = "20s" #注册session timeout时间,单位秒
jodis_compatible = false #注册zookeeper的路径
proxy_datacenter = ""
proxy_max_clients = 1000
proxy_max_offheap_size = "1024mb"
proxy_heap_placeholder = "256mb"
backend_ping_period = "5s" #与codis-server的ping间隔,单位是秒,0:禁止
backend_recv_bufsize = "128kb"
backend_recv_timeout = "30s"
backend_send_bufsize = "128kb"
backend_send_timeout = "30s"
backend_max_pipeline = 1024
backend_primary_only = false
backend_primary_parallel = 1
backend_replica_parallel = 1
backend_keepalive_period = "75s"
backend_number_databases = 16
session_recv_bufsize = "128kb"
session_recv_timeout = "30m"
session_send_bufsize = "64kb"
session_send_timeout = "30s"
session_max_timeout #与client连接超时时间,单位是秒,0:禁止
session_max_bufsize #与client连接缓冲区大小,单位:byte(字节)
session_max_pipeline = 10000 #与client连接最大的pipeline大小
session_keepalive_period = "75s" #与client的tcp keepalive周期,仅tcp有效,0:禁止
session_break_on_failure = false
metrics_report_server = ""
metrics_report_period = "1s"
metrics_report_influxdb_server = ""
metrics_report_influxdb_period = "1s"
metrics_report_influxdb_username = ""
metrics_report_influxdb_password = ""
metrics_report_influxdb_database = ""
metrics_report_statsd_server = ""
metrics_report_statsd_period = "1s"
metrics_report_statsd_prefix = "" 2、启动codis-proxy服务,关闭
方法1
# /usr/local/codis/admin/codis-proxy-admin.sh start #启动
# /usr/local/codis/admin/codis-proxy-admin.sh stop #停止
方法2
# nohup /usr/local/codis/bin/codis-proxy --ncpu=2 --config=/usr/local/codis/config/proxy.toml \
--log=/usr/local/codis/log/proxy.log --log-level=WARN & #启动
# /usr/local/codis/bin/codis-admin --proxy=192.168.10.5:11080 --shutdown #停止
# /usr/local/codis/bin/codis-admin --proxy=192.168.10.5:11080 --auth="xxx" --shutdown #有密码关闭

3、添加到集群
1) 命令添加
# /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --create-proxy -x 192.168.10.5:11080
                                     dashboard地址                  proxy的admin_addr地址
2) web界面添加
通过codis-fe添加,点击Add Proxy按钮,填写IP地址和端口(192.168.10.5:11080),加入到集群中

8、codis-porxy 部署(本机没有启动了dashboard时)

1、修改配置文件
# cd /usr/local/codis/config/
# grep -Ev '^#|^$' proxy.toml
product_name = "codis-ph"
product_auth = ""
session_auth = ""
admin_addr = "0.0.0.0:11080"
proto_type = "tcp4"
proxy_addr = "0.0.0.0:19000"
jodis_name = "zookeeper"
jodis_addr = "192.168.10.5:2181,192.168.10.6:2181,192.168.10.7:2181"
jodis_timeout = "20s"
jodis_compatible = false
proxy_datacenter = ""
proxy_max_clients = 1000
proxy_max_offheap_size = "1024mb"
proxy_heap_placeholder = "256mb"
backend_ping_period = "5s"
backend_recv_bufsize = "128kb"
backend_recv_timeout = "30s"
backend_send_bufsize = "128kb"
backend_send_timeout = "30s"
backend_max_pipeline = 1024
backend_primary_only = false
backend_primary_parallel = 1
backend_replica_parallel = 1
backend_keepalive_period = "75s"
backend_number_databases = 16
session_recv_bufsize = "128kb"
session_recv_timeout = "30m"
session_send_bufsize = "64kb"
session_send_timeout = "30s"
session_max_pipeline = 10000
session_keepalive_period = "75s"
session_break_on_failure = false
metrics_report_server = ""
metrics_report_period = "1s"
metrics_report_influxdb_server = ""
metrics_report_influxdb_period = "1s"
metrics_report_influxdb_username = ""
metrics_report_influxdb_password = ""
metrics_report_influxdb_database = ""
metrics_report_statsd_server = ""
metrics_report_statsd_period = "1s"
metrics_report_statsd_prefix = ""

2、修改管理脚本
# vim /usr/local/codis/admin/codis-proxy-admin.sh
CODIS_DASHBOARD_ADDR="172.16.1.10:18080" #指向dashborad服务器 3、启动codis-proxy服务,关闭
方法1
/usr/local/codis/admin/codis-proxy-admin.sh start #启动
/usr/local/codis/admin/codis-proxy-admin.sh stop #关闭
方法2
# nohup /usr/local/codis/bin/codis-proxy --ncpu=2 --config=/usr/local/codis/config/proxy.toml \
--log=/usr/local/codis/log/proxy.log --log-level=WARN & #启动
# /usr/local/codis/bin/codis-admin --proxy=192.168.10.6:11080 --shutdown #关闭
# /usr/local/codis/bin/codis-admin --proxy=192.168.10.6:11080 --auth="xxx" --shutdown #有密码关闭

4、添加到集群
1) 命令添加
# /usr/local/codis/bin/codis-admin --dashboard=192.168.10.5:18080 --create-proxy -x 192.168.10.6:11080
                                     dashboard地址                   proxy的admin_addr地址
2) web界面添加
通过codis-fe添加,点击Add Proxy按钮,填写IP地址和端口(192.168.10.6:11080),加入到集群中

9、codis-fe 部署

1、修改配置文件
# cd /usr/local/codis/config
# vim codis-fe.json
[
{
"name": "codis-pinhui",
"dashboard": "192.169.10.5:18080"
}
]
配置文件codis-fe.json可手动编辑,也可用codis-admin从外部存储中拉取
# /usr/local/codis/bin/codis-admin --dashboard-list --zookeeper=127.0.0.1:2181 | tee codis.json
  [
      {
          "name": "codis-demo",
          "dashboard": "127.0.0.1:18080"
      },
      {
          "name": "codis-demo2",
          "dashboard": "127.0.0.1:28080"
      }
  ]

2、修改启动脚本
# vim /usr/local/codis/admin/codis-fe-admin.sh
nohup "$CODIS_FE_BIN" "--dashboard-list=/usr/local/codis/config/codis-fe.json" \ 3、启动codis-fe服务,停止
# /usr/local/codis/admin/codis-fe-admin.sh start
# /usr/local/codis/admin/codis-fe-admin.sh stop 4、启动codis-fe服务
# nohup /usr/local/codis/bin/codis-fe --ncpu=2 --log=/codis/log/codis-fe.log --log-level=WARN \
--dashboard-list=/codis/config/codis-fe.json --listen=0.0.0.0:9090 &
-d,--dashboard-list                     配置文件,能够自动刷新
--listen                                HTTP 服务端口
# 关闭服务: kill 进程 5、访问codis-fe
http://192.168.10.5:9090/#codis-pinhui

10、codis-server 部署

1、配置codis-server文件
# cd /usr/local/codis/config/
# grep -Ev "^$|^#" redis.conf
bind 127.0.0.1 192.168.10.5
protected-mode yes
port 6379
maxmemory 1g #设置最大内存,否则codis无法使用
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /usr/local/codis/log/redis_6379.pid
loglevel notice
logfile "/usr/local/codis/log/redis_6379.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/codis/data/
appendonly no
appendfilename "appendonly.aof" 2、配置codis-server启动脚本
# vim /usr/local/codis/admin/codis-server-admin.sh
CODIS_SERVER_BIN=$CODIS_BIN_DIR/codis-server
CODIS_SERVER_PID_FILE=/usr/local/codis/log/redis_6379.pid
CODIS_SERVER_LOG_FILE=/usr/local/codis/log/redis_6379.log
CODIS_SERVER_DAEMON_FILE=$CODIS_LOG_DIR/codis-server.out 3、启动codis-server
# /usr/local/codis/admin/codis-server-admin.sh start
# /usr/local/codis/admin/codis-server-admin.sh stop 4、配置多实例codis-server
1) 修改配置文件
# cp redis.conf redis_6381.conf
# cp redis_6381.conf redis_6382.conf
# cp redis_6381.conf redis_6383.conf
# cp redis_6381.conf redis_6384.conf
# sed -i 's/6381/6382/g' redis_6382.conf
# sed -i 's/6381/6383/g' redis_6383.conf
# sed -i 's/6381/6384/g' redis_6384.conf
2) 启动
# ./bin/codis-server ./redis_6381.conf
# ./bin/codis-server ./redis_6382.conf
# ./bin/codis-server ./redis_6383.conf
# ./bin/codis-server ./redis_6384.conf

11、codis-server sentinel 部署

1、修改sentinel配置文件
# cd /usr/local/codis/config/
# vim sentinel.conf
bind 127.0.0.1 192.168.10.5
port 26379
daemonize yes
logfile "/usr/local/codis/log/sentinel.log"
pidfile "/usr/local/codis/log/sentinel.pid" 2、启动sentinel服务
# /usr/local/codis/bin/redis-sentinel /usr/local/codis/config/sentinel.conf

12、codis-admin命令工具

1、codis-dashboard 异常退出的修复
codis-dashboard 启动时,数据在外部存储上,安全退出,会自动删除数据,异常退出,lock未删除,重启会失败
1) 确认codis-dashboard进程已经退出(很重要)
# ps -ef | grep codis-dashboard
2) 运行codis-admin删除 LOCK
# ./bin/codis-admin --remove-lock --product=codis-demo --zookeeper=127.0.0.1:2181 2、codis-proxy异常退出的修复
codis-proxy的移除: codis-dashboard向codis-proxy发送offline指令,成功后将proxy信息从外部存储中移除
1) 确认 codis-proxy 进程已经退出(很重要)
# ps -ef | grep codis-proxy
2) 运行 codis-admin 删除 proxy
# ./bin/codis-admin --dashboard=127.0.0.1:18080 --remove-proxy --addr=127.0.0.1:11080 --force

13、codis集群管理界面

① 通过fe添加group

访问192.168.10.5:9090,点击 NEW GROUP,输入1(组ID),再点击 NEW GROUP,添加完成

② 添加实例(后端的codis-server)

在新组id是1,点击Add Server,输入codis-server地址,后再点击 Add Server,添加完成

③ 对slots进行分片

如图所示,输入分组的slots的起和止的范围,然后输入组ID,点击后面按钮即可

④ 添加管理proxy

在proxy管理界面,输入proxy的ip和端口,点击Add proxy即可

⑤ 通过codis-proxy连接codis-server进行测试

# redis-cli -h 192.168.10.6 -p 11080 set name tom
# redis-cli -h 192.168.10.6 -p 11080 set name jack
# redis-cli -h 192.168.10.6 -p 11080 set age 11
web界面验证key是否添加完成

⑥ 在zookeeper查看codis相关信息(group,slots,proxy)

# /usr/local/zookeeper/bin/zkCli.sh  -server

cache + redis(一)的更多相关文章

  1. 关于 Senparc.Weixin.Cache.Redis 引用的 StackExchange.Redis 版本不匹配的反馈测试

    推测原因是老系统中有地方引用了旧版本的 StackExchange.Redis,原因是 StackExchange.Redis 1.2.6 版本未提供针对 .net 4.6 以上的支持,导致库引用会失 ...

  2. Spring Boot Cache Redis缓存

    1.集成MyBatis 1.1.引入maven依赖 1.2.生成Mapper 具体可以看MyBatis Generator官网 http://www.mybatis.org/generator/run ...

  3. spring cache redis

    一.使用开源包(spring-data-redis) 1.引入jar包 <dependency>      <groupId>org.springframework.data& ...

  4. spring Cache /Redis 缓存 + Spring 的集成示例

    spring Cache https://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ spring+redis 缓存 ht ...

  5. Spring Cache Redis结合遇到的坑

    业务上需要把一些数据放到redis里面,但是系统逻辑代码差不多编写完成了,怎么整?用Spring Cache啊,对既有业务逻辑侵袭极小. 于是尝试调查了一下,遇到一些问题分享一下(本文使用Spring ...

  6. 【快学SpringBoot】Spring Cache+Redis实现高可用缓存解决方案

    前言 之前已经写过一篇文章介绍SpringBoot整合Spring Cache,SpringBoot默认使用的是ConcurrentMapCacheManager,在实际项目中,我们需要一个高可用的. ...

  7. spring Cache + Redis 开发数据字典以及自定义标签

    一.数据库表结构 1.  分类表:dict_type 2.  子项表:dict_entry 二.页面维护功能示意图: 1.  分类管理 点击子项管理进入子项管理页面 2.子项管理 三.数据字典添加到缓 ...

  8. 使用Spring Cache + Redis + Jackson Serializer缓存数据库查询结果中序列化问题的解决

    应用场景 我们希望通过缓存来减少对关系型数据库的查询次数,减轻数据库压力.在执行DAO类的select***(), query***()方法时,先从Redis中查询有没有缓存数据,如果有则直接从Red ...

  9. Yii2 redis与cache

    原文地址:http://www.myexception.cn/php/1974979.html composer require yiisoft/yii2-redis 安装后使用超简单,打开 comm ...

随机推荐

  1. BI系统:发挥大数据的价值

    ​大数据是指大数据集,这些数据集经过计算分析以揭示与数据的某个方面相关的模式和趋势.首先,还是要重新审视大数据的定义.行业里对大数据的定义有很多,有广义的定义,也有狭义的定义. 大数据的分析与挖掘,把 ...

  2. 【c# 操作符】- nameof用法

    最重要的是nameof不会影响性能! nameof有什么用?主要用解决 类成员名做参数替代成员们的字符串做参数,如下: using System; namespace csharp6 { intern ...

  3. 利用POST请求模拟登录豆瓣

    需要用requests库 豆瓣上次更新后,就不能通过直接的requests.post()方式直接传递参数登录了.必须新建session,先GET请求,然后POST才能成功.原因未知 data参数中的四 ...

  4. c语言——uthash使用

    参考:https://troydhanson.github.io/uthash/userguide.html https://blog.csdn.net/lovemust/article/detail ...

  5. C# Stopwatch计时统计

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  6. ibv_get_device_list()函数

    struct ibv_device** ibv_get_device_list(int *num_devices); 描述 函数用来返回一个当前可用的RDMA设备数组. 注意 数组以NULL结尾: R ...

  7. .NET 6: New DateOnly and TimeOnly strcuts

    Background and Motivation .NET 目前有用于处理日期和时间的DateTime和DateTimeOffset.但在许多情况下,用户需要处理日期而根本不关心时间部分,也存在需要 ...

  8. (数据科学学习手札134)pyjanitor:为pandas补充更多功能

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 pandas发展了如此多年,所包含的功能已 ...

  9. think php 软删除

    <a href="/admin/exam/delete/id/{$v.id}" onclick="if(confirm('确认删除?')) location.hre ...

  10. php 23种设计模型 - 桥接模式

    桥接模式(Bridge) 桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化.这种类型的设计模式属于结构型模式,它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦. 这种模式涉 ...