分布式缓存Redis+codis集群

来源:互联网 发布:沪江网络课程 编辑:程序博客网 时间:2024/06/06 20:13

一. 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.gztar zxvf redis-3.0.7.tar.gzcd redis-3.0.7make PREFIX=/usr/local/redis/ installcp utils/redis_init_script /etc/init.d/redis   #拷贝启动脚本chmod +x /etc/init.d/redismkdir /etc/rediscp redis.conf /etc/redis/6379.conf

vim /etc/init.d/redis #修改启动脚本

EXEC=/usr/local/redis/bin/redis-serverCLIEXEC=/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.pidbind 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 20OKredis> INCR page_view   #将 key 中储存的数字值增一(integer) 21redis> DECR page_view   #将 key 中储存的数字值减一(integer) 20redis> DECRBY page_view 2  #将 key 中储存的数字值减一定数量(integer) 18

4.哈希(hash)类型用法:

redis> HSET car price 20000(integer) 1redis> HSET car name BMW      #将(域-值)对设置到哈希表 key 中。(integer) 1redis> HGETALL car         #获取所有哈希表key域值对1) "price"2) "20000"3) "name"4) "BMW"redis> HGET car price   #获取指定哈希表的域值对"20000"redis> HDEL car name    #删除哈希表的一个域值redis> HKEYS car1) "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/goexport GOPATH=/usr/local/go/workexport PATH=$JAVA_HOME/bin:$PATH:$GOROOT/bin:$GOPATH/bin<<# source /etc/profile# go version3.下载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/zookeeper2.Zookeeper配置文件修改# cd /usr/local/zookeeper/conf# grep '^[a-z]' zoo.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/data/zk1clientPort=2181server.1=172.16.1.211:3181:4181server.2=172.16.1.211:3182:4182server.3=172.16.1.211:3183:41833.创建三个目录用来存放zookeeper数据# mkdir -p /data/zk1 /data/zk2 /data/zk3# echo "1" >/data/zk1/myid# echo "2" >/data/zk2/myid# echo "3" >/data/zk3/myid4.生成三份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.cfg5.修改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.cfg6.启动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.cfg7.连接上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

原创粉丝点击