redis集群体验-安装与测试

18 篇文章 0 订阅
14 篇文章 1 订阅

最近在看《Redis设计与实现》,体验了一下集群。推荐一下这本书。


Redis版本

Redis server v=3.2.3

php扩展

Redis Version 2.2.8-rc1


以下是全部内容

修改配置

port 9000  #端口
pidfile /var/run/redis_9000.pid
dbfilename dump_9000.rdb
daemonize yes  #守护进程
cluster-enabled yes  #启用集群
cluster-config-file nodes-9000.conf # 每个redis节点生成一个自己的集群配置文件
cluster-node-timeout 5000 # 当前节点在与其他节点保活探测时,多久没有响应时认为其他节点处于fail状态,上面是5秒。
appendonly yes # Redis持久化第二种方式,AOF,默认每秒执行一次持久化保存

/usr/local/redis/src/redis-server /usr/local/redis/redis9001.conf > /usr/local/redis/logs/redis9001.log 2>&1 &
/usr/local/redis/src/redis-server /usr/local/redis/redis9002.conf > /usr/local/redis/logs/redis9002.log 2>&1 &
/usr/local/redis/src/redis-server /usr/local/redis/redis9003.conf > /usr/local/redis/logs/redis9003.log 2>&1 &
/usr/local/redis/src/redis-server /usr/local/redis/redis9004.conf > /usr/local/redis/logs/redis9004.log 2>&1 &
/usr/local/redis/src/redis-server /usr/local/redis/redis9005.conf > /usr/local/redis/logs/redis9005.log 2>&1 &
/usr/local/redis/src/redis-server /usr/local/redis/redis9006.conf > /usr/local/redis/logs/redis9006.log 2>&1 &


查看是否在监听
netstat -tpnl |grep redis

创建集群
命令中的replicas=0表示全是master,没有slave从节点,如果其中master 一台挂了,整个集群就不能用了。

replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点。
节点角色由顺序决定,先master之后是slave

如果有slave从节点,那么master挂了的话,slave自动转为master,数据不损失。但是如果slave和master 同时挂了,那这个集群也一样不能用了。

比如,下面的第二条命令,执行命令,会自动分配三个主从:9001主9004从、9002主9005从、9003主9006从,当9001挂了,9004自动转为主;

如果9001和9004同时挂了,分配的槽就会不完整,整个集群就不能用了。
replicas=1, 集群至少要有3个master节点,每一个节点对应slave从节点,所以至少要有6个node节点

/usr/local/redis/src/redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003

/usr/local/redis/src/redis-trib.rb create --replicas 1 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006


查看集群情况
redis-trib.rb check 127.0.0.1:9002


使用redis-cli命令进入集群环境 , -c开启reidis cluster模式,连接redis cluster节点时候使用。
redis-cli -c -p 9001

测试redis集群
127.0.0.1:9001> set testkey001 111
-> Redirected to slot [12786] located at 127.0.0.1:9003
OK
127.0.0.1:9003> set aa 123
-> Redirected to slot [1180] located at 127.0.0.1:9001
OK
127.0.0.1:9001> get aa
"123"
127.0.0.1:9001> get testkey001
-> Redirected to slot [12786] located at 127.0.0.1:9003
"111"
127.0.0.1:9003> get aa
-> Redirected to slot [1180] located at 127.0.0.1:9001
"123"

设置testkey001值时,自动转向127.0.0.1:9003设置,设置aa时,自动转向127.0.0.1:9001
获取testkey001值时,自动转向127.0.0.1:9003获取



php代码示例


	* timeout表示连接redis的最长时间,这里设为1.5秒,表示超过1.5秒要是还没连接成功就返回false 。

	* 
read_timeout表示连接redis成功后,读取一个key的超时时间,有时候读取一个key 可能value比较大,读取需要很长时间,这里设置1.5秒,表示要是过了1.5秒还没读取到数据就返回false。


$oRedis = new RedisCluster(NULL, ['127.0.0.1:9001',1.5,1.5]);
只填其中一个ip也行,自动连其他节点

<?php
$oRedis = new RedisCluster(NULL, ['127.0.0.1:9001', '127.0.0.1:9002', '127.0.0.1:9003',1.5,1.5]);
var_dump($oRedis);

$flag = $oRedis->set("test", "tttttttttttt");
$result = $oRedis->get( "test" );
var_dump($flag);
var_dump($result);

$flag = $oRedis->set("aa", "11111");
$result = $oRedis->get( "aa" );
var_dump($flag);
var_dump($result);


=============报错收集===========
报错
/usr/bin/env: ruby: 没有那个文件或目录


执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:/usr/bin/env: ruby: No such file or directory
所以需要安装ruby的环境,这里推荐使用yum install ruby安装
yum install ruby
再次报错
/usr/local/redis/src/redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
    from /usr/local/redis/src/redis-trib.rb:24

执行
yum -y install rubygems-devel

gem install redis



=========其它,来自网上资料===========

架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
2) redis-cluster选举:容错
 
(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误
    a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态.
    b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.

原理:
集群技术是构建高性能网站架构的重要手段,试想在网站承受高并发访问压力的同时,还需要从海量数据中查询出满足条件的数据,并快速响应,我们必然想到的是将数据进行切片,把数据根据某种规则放入多个不同的服务器节点,来降低单节点服务器的压力。
上一篇我们讲到了 Redis 的主从复制技术,当实现了多节点的 master-slave 后,我们也可以把它叫做集群,但我们今天要讲的集群主要是利用切片技术来组建的集群。
集群要实现的目的是要将不同的 key 分散放置到不同的 redis 节点,这里我们需要一个规则或者算法,通常的做法是获取 key 的哈希值,然后根据节点数来求模,但这种做法有其明显的弊端,当我们需要增加或减少一个节点时,会造成大量的 key 无法命中,这种比例是相当高的,所以就有人提出了一致性哈希的概念。
一致性哈希有四个重要特征:
均衡性:也有人把它定义为平衡性,是指哈希的结果能够尽可能分布到所有的节点中去,这样可以有效的利用每个节点上的资源。
单调性:对于单调性有很多翻译让我非常的不解,而我想要的是当节点数量变化时哈希的结果应尽可能的保护已分配的内容不会被重新分派到新的节点。
分散性和负载:这两个其实是差不多的意思,就是要求一致性哈希算法对 key 哈希应尽可能的避免重复。
但一致性哈希不是我们今天要介绍的重点,因为 Redis 引入另一种哈希槽(hash slot)的概念。
Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。
使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;

当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_simon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值