redis

为什么用redis

增加缓存,提高查询性能

计划

  • 使用redis做缓存工具
  • 实现系统高可用,redis需要做主备。使用redis做分片集群
  • 业务逻辑中添加缓存

使用redis做缓存

安装/配置redis

  1. 需要安装gcc:yum install gcc-c++
  2. 官网下载redis
$ wget http://download.redis.io/releases/redis-4.0.2.tar.gz
$ tar xzf redis-4.0.2.tar.gz
$ cd redis-4.0.2
$ make
//安装到指定目录,如 /usr/local/redis
$ cd /usr/local/redis-4.0.2 
$ make PREFIX=/usr/local/redis install
  1. 拷贝redis.conf
$ cp /usr/local/redis-4.0.2/redis.conf  /usr/local/redis/bin

redis启动

  • 前台启动
    bin/redis-server
  • 后台启动
    修改下redis.conf文件 daemonize yes
    ./bin/redis-server ./redis.conf

redis集群

集群原理

架构

redis-cluster架构图
  1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽
  2. 节点的fail是通过集群中超过半数的节点检测失效时才生效
  3. 客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  4. redis-cluster把所有的物理节点映射到[0-16383]slot上

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

redis-cluster投票:容错

redis-cluster投票:容错
  1. 领着投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
  2. 什么时候整个集群不可用(cluster_state:fail)?
    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成集群的slot映射[0-16383]不完成时进入fail状态. ps : redis-3.0.0.rc1加入cluster-require-full-coverage参数,默认关闭,打开集群兼容部分失败.
    b:如果集群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
    ps:当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误

ruby环境

  • 安装ruby
yum install ruby
yum install rubygems  //包管理工具

创建集群

  1. /usr/local下创建redis-cluster目录,其下创建7001、7002。。7006目录
  2. 将redis/bin下的文件拷贝到每个700*目录下
  3. 修改每个700*目录下的redis.conf配置文件
port 700*
cluster-enabled yes
  1. 脚本开启每个redis实例
    在redis-cluster/下创建一个startall.sh脚本,测试启动所有实例
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..

脚本启动redis实例.png
  1. 执行创建集群命令
[root@localhost redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.176.101:7001 192.168.176.101:7002 192.168.176.101:7003 192.168.176.101:7004 192.168.176.101:7005  192.168.176.101:7006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.176.101:7001
192.168.176.101:7002
192.168.176.101:7003
Adding replica 192.168.176.101:7004 to 192.168.176.101:7001
Adding replica 192.168.176.101:7005 to 192.168.176.101:7002
Adding replica 192.168.176.101:7006 to 192.168.176.101:7003
M: 5f51d88cef55e85d3c85b7a92a9fccb7d775c095 192.168.176.101:7001
   slots:0-5460 (5461 slots) master
M: e0d56c65a56d3456908f0eab6ddeec38dc1f3dd0 192.168.176.101:7002
   slots:5461-10922 (5462 slots) master
M: c3ae4999e6c3b7f6f984f4efea483fddb1ba7a36 192.168.176.101:7003
   slots:10923-16383 (5461 slots) master
S: 84250b962fa1174555a771d7349e98b607d65439 192.168.176.101:7004
   replicates 5f51d88cef55e85d3c85b7a92a9fccb7d775c095
S: 23302609be589bf1c89865599754e916246083e2 192.168.176.101:7005
   replicates e0d56c65a56d3456908f0eab6ddeec38dc1f3dd0
S: c049a2d2d70a39e24e3137e5eba30d8a9f17c5e7 192.168.176.101:7006
   replicates c3ae4999e6c3b7f6f984f4efea483fddb1ba7a36
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.176.101:7001)
M: 5f51d88cef55e85d3c85b7a92a9fccb7d775c095 192.168.176.101:7001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: c049a2d2d70a39e24e3137e5eba30d8a9f17c5e7 192.168.176.101:7006
   slots: (0 slots) slave
   replicates c3ae4999e6c3b7f6f984f4efea483fddb1ba7a36
S: 84250b962fa1174555a771d7349e98b607d65439 192.168.176.101:7004
   slots: (0 slots) slave
   replicates 5f51d88cef55e85d3c85b7a92a9fccb7d775c095
M: c3ae4999e6c3b7f6f984f4efea483fddb1ba7a36 192.168.176.101:7003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: 23302609be589bf1c89865599754e916246083e2 192.168.176.101:7005
   slots: (0 slots) slave
   replicates e0d56c65a56d3456908f0eab6ddeec38dc1f3dd0
M: e0d56c65a56d3456908f0eab6ddeec38dc1f3dd0 192.168.176.101:7002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

  1. 关闭集群
    shutdown.sh
redis-cli -p 7001 shutdown

集群测试

集群测试.png

参数要加上-c 集群间才能传递

[root@localhost redis-cluster]# redis01/redis-cli -h 192.168.176.101 -p 7003 -c

Redis客户端

集群配置中遇到的问题

  1. centos7 ruby2.0的版本
    yum源太老,后面安装redis4.2的库时,需要ruby>=2.2.2
    gem install redis
    ERROR:  Error installing redis:
            redis requires Ruby version >= 2.2.2.
  ---------------------------------------
解决方案:使用rvm管理工具
1. 安装RVM
    gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
    curl -L get.rvm.io | bash -s stable
    find / -name rvm -print
    source /usr/local/rvm/scripts/rvm
2. 查看rvm库中已知的ruby版本
    rvm list known
3. 安装一个ruby版本
    rvm install 2.4.1
4. 使用一个ruby
    rvm use 2.4.1
5. 设置默认版本
    rvm use 2.4.1 -default
  1. 在集群搭建的[ERR]
>>> Creating cluster
[ERR] Node 192.168.176.101:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.

原因:dump.rdb是由Redis服务器自动生成的 默认情况下 每隔一段时间redis服务器程序会自动对数据库做一次遍历,把内存快照写在一个叫做“dump.rdb”的文件里,这个持久化机制叫做SNAPSHOT。有了SNAPSHOT后,如果服务器宕机,重新启动redis服务器程序时redis会自动加载dump.rdb,将数据库状态恢复到上一次做SNAPSHOT时的状态。
解决方案:
1. 将每个节点下aof、rdb、nodes.conf本地备份文件删除;
2. 重新启动redis,执行脚本

  ./redis-trib.rb create --replicas 1 192.168.176.101:7001 192.168.176.101:7002 192.168.176.101:7003 192.168.176.101:7004 192.168.176.101:7005  192.168.176.101:7006
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 16,967评论 1 51
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,902评论 2 27
  • 1 Redis介绍1.1 什么是NoSql为了解决高并发、高可扩展、高可用、大数据存储问题而产生的数据库解决方...
    克鲁德李阅读 5,171评论 0 36
  • 本文档翻译自 http://redis.io/topics/cluster-tutorial 。 本文档是 Red...
    会跳舞的机器人阅读 66,855评论 2 21
  • Redis杂谈 Redis是近年来发展迅速的内存数据库,网上也已经有多Redis的文章。但不管是英文还是中文,多数...
    迷失于重逢阅读 1,484评论 0 14