分布式缓存Redis+codis集群 - 学习笔记

一. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值