一. Redis基础知识
1.Redis与Memcached对比:
Memcached: 不支持持久化,纯set或get性能高过redis,简单易用,支持类型单一,没有验证。
Redis: 支持持久化,易用,支持多种数据类型,支持集群,有基础验证。
SSDB: 兼容redis,支持存储分级。
HBase:
二. Redis的安装和调优
1.Redis的编译安装:
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
vim /etc/init.d/redis #修改启动脚本
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
$CLIEXEC -h 172.16.1.211 -p $REDISPORT -a wmj shutdown #停止脚本需要加IP和密码
2.修改配置文件:
vim /etc/redis/6379.conf
daemonize yes #开启后台启动
pidfile /var/run/redis_6379.pid
bind 172.16.1.211 #绑定IP地址
logfile "/var/log/redis_6379.log" #日志存放位置
dir /var/lib/redis_6379/ #持久化存放位置
requirepass wmj #设置密码
mkdir /var/lib/redis_6379
3.启动Redis:
/etc/init.d/redis start
4.修复启动时的告警信息:
less /var/log/redis_6379.log #查看告警
vim /etc/sysctl.conf #修改内存分配策略,可能导致主从同步出现问题。
vm.overcommit_memory = 1
内存分配策略
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
vim /etc/rc.local #禁用大页内存,可能导致redis延迟和内存使用问题。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
vim /etc/rc.local #修改系统的baklog大小。
echo 511 > /proc/sys/net/core/somaxconn
# baklog参数实际控制的是已经3次握手成功的还在accept queue的大小。
改完后重启redis生效,查看日志看是否还有警告。
三. Redis的使用和数据类型
参考资料:http://doc.redisfans.com/
1.登陆Redis:
redis-cli -h 172.16.1.211 -a wmj
2.Redis基础命令:
auth wmj #登录密码
set name linux #新建一个key值
get name #获取一个Key值
keys * #查看所有key值,生产不要用
EXISTS name #查看一个key值是否存在
del name #删除一个Key值
type name #查看Key的类型
3.字符串类型用法:
redis> SET page_view 20
OK
redis> INCR page_view #将 key 中储存的数字值增一
(integer) 21
redis> DECR page_view #将 key 中储存的数字值减一
(integer) 20
redis> DECRBY page_view 2 #将 key 中储存的数字值减一定数量
(integer) 18
4.哈希(hash)类型用法:
redis> HSET car price 20000
(integer) 1
redis> HSET car name BMW #将(域-值)对设置到哈希表 key 中。
(integer) 1
redis> HGETALL car #获取所有哈希表key域值对
1) "price"
2) "20000"
3) "name"
4) "BMW"
redis> HGET car price #获取指定哈希表的域值对
"20000"
redis> HDEL car name #删除哈希表的一个域值
redis> HKEYS car
1) "price"
2) "name"
redis> HLEN car #获取哈希值长度
(integer) 2
5.列表(list)类型用法:
llen number #查看列表长度
LPUSH number 1 #从列表左侧插入
RPUSH number 5 #从列表右侧插入
LRANGE number 0 -1 #获取所有列表值
LPOP number #从左侧开始弹出列表值
6.集合(Set)类型的用法:
sadd a 1 #创建集合
SMEMBERS a #获取集合
SISMEMBER a 1 #判断1是否在集合a中
SDIFF a b #判断a和b集合的差集
SINTER a b #判断a和b集合的交集
SUNION a b #判断a和b集合的并集
四. Redis的持久化
参考资料:http://doc.redisfans.com/topic/persistence.html
1.Redis的两种持久化介绍:
RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
生产 环境可以两种同时用,会优先使用AOF。
2.RDB和AOF应该用哪一个:
一般来说, 如果想达到足以媲美 PostgreSQL 的数据安全性, 你应该同时使用两种持久化功能。
如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失, 那么你可以只使用 RDB 持久化。
有很多用户都只使用 AOF 持久化, 但我们并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快, 除此之外, 使用 RDB 还可以避免之前提到的 AOF 程序的 bug 。
最好两个同时
3.如何开启RDB快照备份:
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 #对快照进行压缩
3.如何开启AOF快照备份:
如果同时开启了rdb和aof下,会采用aof方式。
vim /etc/redis/6379.conf
appendonly yes # 是否开启AOF,默认关闭(no)
appendfilename appendonly.aof # 指定 AOF 文件名
# Redis支持三种不同的刷写模式:
# appendfsync always #每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
# appendfsync no #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
#在日志重写时,不进行命令追加操作,而只是将其放在缓冲区里,避免与命令的追加造成DISK IO上的冲突。
#设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no
no-appendfsync-on-rewrite no
#当前AOF文件大小是上次日志重写得到AOF文件大小的二倍时,自动启动新的日志重写过程。
auto-aof-rewrite-percentage 100
#当前AOF文件启动新的日志重写过程的最小值,避免刚刚启动Reids时由于文件尺寸较小导致频繁的重写。
auto-aof-rewrite-min-size 64mb
五. Redis的复制
参考资料:http://doc.redisfans.com/topic/replication.html
1.Redis的复制介绍:
Redis 使用异步复制。 从服务器会以每秒一次的频率向主服务器报告复制流
一个主服务器可以有多个从服务器。
不仅主服务器可以有从服务器
复制功能不会阻塞主服务器
复制功能也不会阻塞从服务器
复制功能可以单纯地用于数据冗余(data redundancy)
可以通过复制功能来让主服务器免于执行持久化操作: 只要关闭主服务器的持久化功能, 然后由从服务器去执行持久化操作即可。
2.开启主从复制:
slaveof 192.168.1.1 6379
六. Redis的集群
1.redis的几种集群方案:
1.客户端分片
2.代理分片
3.Redis-Cluster: 案例少,专用客户端,故障多
4.Codis: 案例多,dashboard,有迁移工具,需要zookeeper或者etctd
2.安装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/
2.创建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
3.下载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
3.Zookeeper伪集群部署:
1.下载并解压zookeeper
# 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
2.Zookeeper配置文件修改
# cd /usr/local/zookeeper/conf
# grep '^[a-z]' zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/data/zk1
clientPort=2181
server.1=172.16.1.211:3181:4181
server.2=172.16.1.211:3182:4182
server.3=172.16.1.211:3183:4183
3.创建三个目录用来存放zookeeper数据
# mkdir -p /data/zk1 /data/zk2 /data/zk3
# echo "1" >/data/zk1/myid
# echo "2" >/data/zk2/myid
# echo "3" >/data/zk3/myid
4.生成三份zookeeper配置文件
[root@SH_T_ansiblecli_02 conf]# cp zoo.cfg zk1.cfg
[root@SH_T_ansiblecli_02 conf]# cp zoo.cfg zk2.cfg
[root@SH_T_ansiblecli_02 conf]# cp zoo.cfg zk3.cfg
5.修改zk2和zk3的配置,使用对应的数据目录和端口
[root@linux-node1 conf]# sed -i 's/zk1/zk2/g'zk2.cfg
[root@linux-node1 conf]# sed -i 's/2181/2182/g'zk2.cfg
[root@linux-node1 conf]# sed -i 's/zk1/zk3/g'zk3.cfg
[root@linux-node1 conf]# sed -i 's/2181/2183/g'zk3.cfg
6.启动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
7.连接上zookeeper
# /usr/local/zookeeper/bin/zkCli.sh -server 172.16.1.211:2181
4.修改Codis的配置文件:
# cd /usr/local/go/work/src/github.com/CodisLabs/codis/config/
# vim dashboard.toml
后面的暂时不写了,请参考:https://github.com/CodisLabs/codis