redis集群配置----

redis 采用 redis-3.2.4 版本。因为redis .3.0.0版本之后才有集群,之前配置文件中没有

两台虚拟机都是 CentOS ,一台 CentOS6.5 (IP:192.168.31.245),一台 CentOS7(IP:192.168.31.210) 。

安装过程

1. 下载并解压

 
cd  /root/software
wget http: //download .redis.io /releases/redis-3 .2.4. tar .gz
tar -zxvf redis-3.2.4.tar.gz 

2. 编译安装

cd redis-3.2.4
make && make install

3. 将 redis-trib.rb 复制到 /usr/local/bin 目录下

cd src
cp redis-trib.rb /usr/local/bin/  

4. 创建 Redis 节点

首先在 192.168.31.245 机器上 /root/software/redis-3.2.4 目录下创建 redis_cluster 目录;

mkdir redis_cluster  

在 redis_cluster 目录下,创建名为7000、7001、7002的目录,并将 redis.conf 拷贝到这三个目录中

mkdir 7000 7001 7002<br>cp redis.conf redis_cluster/7000
cp redis.conf redis_cluster/7001
cp redis.conf redis_cluster/7002  

分别修改这三个配置文件,修改如下内容

复制代码
port  7000                                        //端口7000,7002,7003        
bind 本机ip                                       //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize    yes                               //redis后台运行
pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002
cluster-enabled  yes                           //开启集群  把注释#去掉
cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志 
复制代码
  • 接着在另外一台机器上(192.168.31.210),的操作重复以上三步,只是把目录改为7003、7004、7005,对应的配置文件也按照这个规则修改即可

5. 启动各个节点

复制代码
第一台机器上执行
redis-server redis_cluster/7000/redis.conf
redis-server redis_cluster/7001/redis.conf
redis-server redis_cluster/7002/redis.conf
 
另外一台机器上执行
redis-server redis_cluster/7003/redis.conf
redis-server redis_cluster/7004/redis.conf
redis-server redis_cluster/7005/redis.conf 
复制代码

6. 检查 redis 启动情况

复制代码
##一台机器<br>ps -ef | grep redis
root      61020      1  0 02:14 ?        00:00:01 redis-server 127.0.0.1:7000 [cluster]    
root      61024      1  0 02:14 ?        00:00:01 redis-server 127.0.0.1:7001 [cluster]    
root      61029      1  0 02:14 ?        00:00:01 redis-server 127.0.0.1:7002 [cluster]    
 
netstat -tnlp | grep redis
tcp        0      0 127.0.0.1:17000             0.0.0.0:*                   LISTEN      61020/redis-server 
tcp        0      0 127.0.0.1:17001             0.0.0.0:*                   LISTEN      61024/redis-server 
tcp        0      0 127.0.0.1:17002             0.0.0.0:*                   LISTEN      61029/redis-server 
tcp        0      0 127.0.0.1:7000              0.0.0.0:*                   LISTEN      61020/redis-server 
tcp        0      0 127.0.0.1:7001              0.0.0.0:*                   LISTEN      61024/redis-server 
tcp        0      0 127.0.0.1:7002              0.0.0.0:*                   LISTEN      61029/redis-server
1
2
3
4
5
6
7
8
9
10
11
12
13
    
##另外一台机器
ps -ef | grep redis
root       9957      1  0 02:32 ?        00:00:01 redis-server 127.0.0.1:7003 [cluster]
root       9964      1  0 02:32 ?        00:00:01 redis-server 127.0.0.1:7004 [cluster]
root       9971      1  0 02:32 ?        00:00:01 redis-server 127.0.0.1:7005 [cluster]
root      10065   4744  0 02:38 pts/0    00:00:00 grep --color=auto redis
netstat -tlnp | grep redis
tcp        0      0 127.0.0.1:17003         0.0.0.0:*               LISTEN      9957/redis-server 1
tcp        0      0 127.0.0.1:17004         0.0.0.0:*               LISTEN      9964/redis-server 1
tcp        0      0 127.0.0.1:17005         0.0.0.0:*               LISTEN      9971/redis-server 1
tcp        0      0 127.0.0.1:7003          0.0.0.0:*               LISTEN      9957/redis-server 1
tcp        0      0 127.0.0.1:7004          0.0.0.0:*               LISTEN      9964/redis-server 1
tcp        0      0 127.0.0.1:7005          0.0.0.0:*               LISTEN      9971/redis-server 1 
复制代码

7.创建集群

Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中,第三步中已将它复制到 /usr/local/bin 目录中,可以直接在命令行中使用了。使用下面这个命令即可完成安装。

redis-trib.rb  create  --replicas  1  192.168.31.245:7000 192.168.31.245:7001  192.168.31.245:7002 192.168.31.210:7003  192.168.31.210:7004  192.168.31.210:7005

其中,前三个 ip:port 为第一台机器的节点,剩下三个为第二台机器。

等等,出错了。这个工具是用 ruby 实现的,所以需要安装 ruby。安装命令如下:

yum -y  install  ruby ruby-devel rubygems rpm-build
 
然后执行命令: gem  install  redis
 
这里可能无法安装,因为无法连接gem服务器:
[@zw_22_90 src]# gem install redis --version 3.0.0
ERROR: Could not find a valid gem 'redis' (= 3.0.0) in any repository
ERROR: While executing gem ... (Gem::RemoteFetcher::FetchError)


需要手工下载并安装:
wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
gem install -l ./redis-3.2.1.gem


6.4 再次执行第步的命令,正常执行
 
redis-trib.rb  create  --replicas  1  192.168.31.245:7000 192.168.31.245:7001  192.168.31.245:7002 192.168.31.210:7003  192.168.31.210:7004  192.168.31.210:7005

8. 集群验证

在第一台机器上连接集群的7002端口的节点,在另外一台连接7005节点,连接方式为 redis-cli -h 192.168.31.245 -c -p 7002  ,加参数 -C 可连接到集群,因为上面 redis.conf 将 bind 改为了ip地址,所以 -h 参数不可以省略。

在7005节点执行命令  set hello world ,执行结果如下:

然后在另外一台7002端口,查看 key 为 hello 的内容, get hello  ,执行结果如下:

说明集群运作正常。

简单说一下原理

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

 

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上(哈希槽),cluster 负责维护

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

 

Redis 集群的键空间被分割为16383个槽,集群的最大节点数也是16484个。本篇文章主要来看一下redis集群选取情况。

 

一、节点信息了解

 

为了下面看节点主从选择的信息,我们先来了解一下每个节点常用信息。

从上面列出的三行信息中,从左到右的各个域分别是:节点ID,Ip地址和端口号,标志(是从节点还是主节点),最后发送PING的时间,最后接收PONG的时间,连接状态(connected还是unConnected),节点负责处理的槽。

 

二.集群的主从选择

 

目前集群中搭建了6个节点,三主三从,主节点为6379、6380、6381,从节点是6381、6382、6384.

 

(1)启动集群,查看6个节点的服务状态,全部为启动。

 

(2)查看集群各个节点的主从状态

三主三从,现在6379是其中一个主节点,其从节点是6382,以这两个端口为例,演示一下主从选举过程。

 

(3)现在在6379中添加三个值,分别为“school” "grage" "age"

 

(4)现在模拟将6379节点挂掉,按照redis集群原理,会将6379节点的从节点选举为6382为主节点。


 

(5)现在查看集群运行状况

可以看到6379节点挂掉之后,6379节点连接不上,现在6382节点变成了主节点。

 

(6) 并且可以从6382节点中得到和6379节点相同的数据内容。

 

(7)现在我们将6379节点重启,查看6379是否会自动加入集群,此时在集群中充当的是M节点还是S节点。

查看进程,6379端口启动成功。

 

(8)6379节点变为了6382节点的从节点

如果redis集群中,一主一从都宕机,则redis-cluster不可用,fail状态

1、集群是如何判断是否有某个节点挂掉

  首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。

 

2、集群进入fail状态的必要条件

A、某个主节点和所有从节点全部挂掉,我们集群就进入faill状态。

B、如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态.

 C、如果集群任意master挂掉,且当前master没有slave.集群进入fail状态

4、集群中的主从复制
      集群中的每个节点都有1个至N个复制品,其中一个为主节点,其余的为从节点,如果主节点下线了,集群就会把这个主节点的一个从节点设置为新的主节点继续工作,这样集群就不会因为一个主节点的下线而无法正常工作。
注意:
1、如果某一个主节点和他所有的从节点都下线的话,redis集群就会停止工作了。redis集群不保证数据的强一致性,在特定的情况下,redis集群会丢失已经被执行过的写命令。
2、使用异步复制(asynchronous replication)是redis 集群可能会丢失写命令的其中一个原因,有时候由于网络原因,如果网络断开时间太长,redis集群就会启用新的主节点,之前发给主节点的数据就会丢失。

 

 

Redis集群数据分片的形式

 

Redis集群不适用一致性hash,而是使用hash slot的方式将key分开来。这里有16384个hash桶在redis集群中,我们简单的使用key的CRC16值模上16384,每一个redis实例都负责redis集群中一些桶。 
比如说你有三个实例节点:

  • A包含0-5500的hash桶
  • B包含5501-11000的hash桶
  • C包含11001-16384的桶

这使得添加和新增节点更加容易,如果我想要增加实例节点D,我需要把实例节点A,B,C的一些数据移动到D,如果我想要移除节点A,我只需要把节点A的数据迁移到B跟C,当A当中数据为0的时候我就可以移除节点A。 
从一个几点移动hash桶到另外一个节点无需stop的操作,所以在移除新增节点,改变各个节点的百分比的时候故障时间。 
Redis集群支持多key操作,即多个key在一个执行链中执行(一个事务或者一个lua脚本中),用户使用命令hash tags可以强制多key处以同一个hash桶中。Hash tags的要旨是如果在keys中有子串用大括号{},那么CRC16只会hash被大括号括住的子串。

 

Redis集群中的主从模式

在我们的例子中,A、B、C节点中B节点宕机,我们将会丧失5501-11000节点的数据。 
假设我们给A、B、C节点加上从节点A1、B1、C1,当B节点宕机时候集群仍旧可以正常使用。B1复制B的数据,当B节点宕机时候,节点B1将会提升为主节点。更进一步,如果B1和B实例节点同时宕机,那么整个集群将无法继续操作。

 

cluster命令

复制代码
 
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键  
//新增 CLUSTER SLAVES node-id 返回一个master节点的slaves 列表
 

 

添加集群节点

redis-trib.rb add-node 127.0.0.1:7007127.0.0.1:7001

PS:这个IP:PORT可以是集群里边儿任意一个主节点的IP和端口,下同

 

接下来还要把7008做为7007的从节点也加入到集群里边儿来,这里的话我们首先要记住7007这个主节点的节点id.从节点加入到集群的时候要用到.

 redis-trib.rb add-node --slave --master-id 36d53c7f1896838249c0b4afdcf680bac2f4ec2e 127.0.0.1:7008 127.0.0.1:7001

注意:使用命令add-node添加的时候,本人测试基本都是作为slave从节点存在,所以使用另外一个命令

我们可以通过CLUSTER MEET命令将6385节点加入到集群中(例如:CLUSTER MEET 127.0.0.16385)则加入的是master节点。

 

cluster saveconfig

 

将节点的配置文件保存到硬盘里面.

试一下:

127.0.0.1:7009> cluster saveconfig
OK

ok说明成功了,它会覆盖配置文件夹里的nodes.conf文件。这样做是为了某种情况下nodes文件丢失,这样就会生成一个最新的节点配置文件。

cluster delslots

移除当前节点的一个或多个槽点。只能删除自己的节点,删除别人的没用。

因为master才会有槽点,所以,也是只能在master 节点上操作,在slave 操作也没用。

用法是:

cluster delslots slots1 slotes2 slots3

我们看一下槽点的分配情况:

 
复制代码
[root@web3 7009]# redis-cli -p 7009 -c cluster nodes| grep master
3d2b7dccfc45ae2eb7aeb9e0bf001b0ac8f7b3da 192.168.33.13:7000 master - 0 1448529511113 1 connected 0-4095
404cf1ecf54d4df46d5faaec4103cfdf67888ad2 192.168.33.13:7001 master - 0 1448529511113 2 connected 4096-8191
6f5cd78ee644c1df9756fc11b3595403f51216cc 192.168.33.13:7002 master - 0 1448529509101 3 connected 8192-12287
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 master - 0 1448529510609 4 connected 12288-16383
复制代码

4台master,那就把16381 16382 16383 3个槽点给删掉。

开始:

 
[root@web3 7009]# redis-cli -p 7003
127.0.0.1:7003> cluster delslots 16381 16382 16383
OK
127.0.0.1:7003> cluster nodes
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16380

看,7003的缺失少了3个节点。我们在看下cluster info

127.0.0.1:7003> cluster info
cluster_state:fail
cluster_slots_assigned:16381
cluster_slots_ok:16381
 
只有16381个,确实少了4个。但是,注意: cluster_state:fail,集群失败了!!!

为什么呢?为什么删除了3个槽点就失败了呢。因为集群就是要满足所有的16364个槽点全部分配才会成功。所以。就失败了。

数据读取自然也会失败:

 
127.0.0.1:7003> get name
(error) CLUSTERDOWN The cluster is down

我们用redis-trib检查一下,就知道了:

复制代码
[root@web3 7009]# redis-trib.rb check 192.168.33.13:7000
...
...
[ERR] Nodes don't agree about configuration!
>>> Check for open slots...
>>> Check slots coverage...
[ERR] Not all 16384 slots are covered by nodes.
复制代码

那如何挽救呢?那就顺便看下下面的这个命令吧。

cluster addslots

将一个或多个槽(slot)指派(assign)给当前节点

用法是:

cluster addslots slots1 slotes2 slots3
那,我就用这个命令将上面删掉的3个槽点再加到7003上看看:
127.0.0.1:7003> cluster addslots 16381 16382 16383
OK
127.0.0.1:7003>

OK了,看下是不是真的成功了: 

127.0.0.1:7003> cluster nodes
35bdcb51ceeff00f9cc608fa1b4364943c7c07ce 192.168.33.13:7003 myself,master - 0 0 4 connected 12288-16383

确实回来了,再看下集群状态,启动了没?

127.0.0.1:7003> cluster info
cluster_state:ok

数据读取也正常了:

 
127.0.0.1:7003> get name
-> Redirected to slot [5798] located at 192.168.33.13:7001
"123"
192.168.33.13:7001>

我们已经获取了要迁移的槽,是6918。因此,流程如下:

  • 目标6385节点中,将槽6918设置为导入状态
127.0.0.1:6385> CLUSTER SETSLOT 6918 importing 8f285670923d4f1c599ecc93367c95a30fb8bf34
OK
// 8f285670923d4f1c599ecc93367c95a30fb8bf34 是 6380 节点的名字

目标6385节点中,查看槽6918导入状态

127.0.0.1:6385> CLUSTER NODES
cb987394a3acc7a5e606c72e61174b48e437cedb 127.0.0.1:6385 myself,master - 0 0 8 connected [6918-<-8f285670923d4f1c599ecc93367c95a30fb8bf34]
  • 6380节点中,将槽6918设置为导出状态
127.0.0.1:6380> CLUSTER SETSLOT 6918 migrating cb987394a3acc7a5e606c72e61174b48e437cedb
OK
// cb987394a3acc7a5e606c72e61174b48e437cedb 是 6385 节点的名字

6380节点中,查看槽6918导出状态

127.0.0.1:6380> CLUSTER NODES
8f285670923d4f1c599ecc93367c95a30fb8bf34 127.0.0.1:6380 myself,master - 0 0 3 connected 5462-10922 [6918->-cb987394a3acc7a5e606c72e61174b48e437cedb]
  • 批量获取槽6918中的键
127.0.0.1:6380> CLUSTER GETKEYSINSLOT 6918 5
1) "key:{test}:555"
2) "key:{test}:666"
3) "key:{test}:777"

确认一下这三个键是否存在于源6380节点。

127.0.0.1:6380> MGET key:{test}:777 key:{test}:666 key:{test}:555
1) "value:test:777"
2) "value:test:666"
3) "value:test:555"
  • 执行migrate命令进行迁移
127.0.0.1:6380> MIGRATE 127.0.0.1 6385 "" 0 1000 keys key:{test}:777 key:{test}:666 key:{test}:555
OK

批量迁移版本的MIGRATE命令是在redis 3.0.6之后加入的,命令参数如下:

MIGRATE host port key dbid timeout [COPY | REPLACE]
MIGRATE host port "" dbid timeout [COPY | REPLACE] KEYS key1 key2 ... keyN
// host port 指定迁移的目的节点地址
// dbid 指定迁移的数据库id
// timeout 迁移的超时时间
// 如果指定了 COPY 选项,表示不删除源节点上的key
// 如果指定了 REPLACE 选项,替换目标节点上已存在的key(如果存在)

当迁移完成后,我们在源6380节点查询这三个键,发送回复了一个ASK错误

127.0.0.1:6380> MGET key:{test}:777 key:{test}:666 key:{test}:555
(error) ASK 6918 127.0.0.1:6385

最后,我们只需向任意节点发送CLUSTER SETSLOT <slot> NODE <target_name>命令,将槽指派的信息发送给节点,然后这个节点会将这个指派信息发送至整个集群。

CLUSTER SETSLOT 6918 node cb987394a3acc7a5e606c72e61174b48e437cedb
// cb987394a3acc7a5e606c72e61174b48e437cedb 是 6385 节点的名字

6381节点执行命令

127.0.0.1:6381> CLUSTER SETSLOT 6918 node cb987394a3acc7a5e606c72e61174b48e437cedb
OK

6379节点查看当前集群槽指派信息

127.0.0.1:6379> CLUSTER NODES
29978c0169ecc0a9054de7f4142155c1ab70258b 127.0.0.1:6379 myself,master - 0 0 7 connected 0-5461
66478bda726ae6ba4e8fb55034d8e5e5804223ff 127.0.0.1:6381 master - 0 1496736248776 2 connected 10923-16383
cb987394a3acc7a5e606c72e61174b48e437cedb 127.0.0.1:6385 master - 0 1496736244766 10 connected 6918
8f285670923d4f1c599ecc93367c95a30fb8bf34 127.0.0.1:6380 master - 0 1496736247773 3 connected 5462-6917 6919-10922
// 过滤掉从节点和未指派槽的主节点

可以看到6380节点负责的槽变为5462-6917 6919-10922,而6918已经被6385节点负责了。

如果出现以下情况(本人遇到的)

在7002节点登陆中执行命令clsuter delslot 135.删除槽135

然后在执行 redis-trib.rb fix 192.168.0.109:7007命令来修复槽,

输入yes即可,然后登陆查看cluster nodes信息,即可看到135槽平移到7002中,

7007中135被分割

 

edis集群 Waiting for the cluster to join 一直等待

原创  2016年09月13日 23:37:59
  • 7915

redis集群创建执行

 

./redis-trib.rb create --replicas 1 XXXX:PORT1 XXXX:PORT2 ....
的时候
一直等待 Waiting for the cluster to join 很久都没有反应
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口
集群总线端口为redis客户端连接的端口 + 10000
如redis端口为6379
则集群总线端口为16379
故,所有服务器的点需要开通redis的客户端连接端口和集群总线端口

注意:iptables 放开,如果有安全组,也要放开这两个端口

 

重新分片

 

所谓重新分片,就是重新分配各个节点拥有的slots,这里我们的主要目的是从老的节点中迁移一部分slots放到新节点中去,以便让新节点真正成为集群中的一员.

同样, 还是利用redis-trib.rb 工具.

[root@localhost redis-3.2.0]# /usr/local/redis/bin/redis-trib.rb reshard 127.0.0.1:7001

//PS: 这条命令是交互的,按照提示操作即可.

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

How many slots do you want to move (from 1 to 16384)?4096  //输入一个数,这个4096表示迁移多少个slots数

What is the receiving node ID? 36d53c7f1896838249c0b4afdcf680bac2f4ec2e //输入目标节点ID,表示迁移到哪个目标节点

Please enter all the source node IDs.

  Type 'all' to use all the nodes as source nodes for the hash slots.

  Type 'done' once you entered all the source nodes IDs.

Source node #1:all //输入all表示从老的所有节点进行重分配,凑够4096个slots给到新节点.

也可以输入源节点id, 可以输入多个源节点id,最后输入done.就开始从你输入的源节点id的节点进行迁移了.

删除节点

要删除集群中的某个节点(注:这里说的是集群中的主节点),首先必须确保这个节点没有拥有任何一个slots.我们现在来删除7001 这个节点.

首先,我们要把7001这个节点上的slots全部迁移出去.

我们直接执行命令删除看看.

[root@localhost redis-3.2.0]# /usr/local/redis/bin/redis-trib.rb del-node 127.0.0.1:7001 a2eee0ea546f2c3701b08981737c07938039857c

>>> Removing node a2eee0ea546f2c3701b08981737c07938039857c from cluster 127.0.0.1:7001

[ERR] Node 127.0.0.1:7001 is not empty! Reshard data away and try again.

[root@localhost redis-3.2.0]#

 由此可知,直接删会提示不为空,不能删除,分片后再删吧.把这个节点拥有的slots全部迁移出去即可.

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

How many slots do you want to move (from 1 to 16384)?16384 //输入一个大于或等于7001节点所拥有的slots数的数即可.

What is the receiving node ID? 8ab3d14eba181c06dc8826bea0db1becdead2533 //接收这些slots的目标节点,这里是7002节点

Please enter all the source node IDs.

  Type 'all' to use all the nodes as source nodes for the hash slots.

  Type 'done' once you entered all the source nodes IDs.

Source node #1:a2eee0ea546f2c3701b08981737c07938039857c //因为我们要删除7001这个节点,所以源节点的id就是7001的节点ID

Source node #2:done //输入done,回车,就会开始从7001 这个节点迁移16384个slot(没有这么多就迁移拥有的全部)到7002节点中去.

7001 已经没有分配slots了,可以从集群中删除了.

 [root@localhost redis-3.2.0]# redis-trib.rb del-node 127.0.0.1:7002 a2eee0ea546f2c3701b08981737c07938039857c           另外经过观察,这个主节点被删除之后,它之前拥有的从节点会自动成为其他主节点的从节点.                                  

以上就是利用官方提供的redis-trib.rb 工具来完成上述的各项工作,事实上这个工具也是利用cluster的内部命令进行的整合以方便我们使用和管理.如果想了解更多的细节,需要查看官方的文档,可以完全脱离redis-trib.rb的便利性纯手工使用cluster内部命令来完成集群的搭建以及分配slots,添加节点,删除节点等等.

 

redis缓存会出现什么问题?

redis缓存数据库的数据,有一点就显得特别重要,那就是数据一致性的问题。

单个数据库在多线程操作的时候如果不是数据库锁的限制会出现很多数据不一致的问题,ACID这里我就不多说了。

redis缓存也会有这样的问题,就是数据库的数据更新到redis是会有时间差的,这样的时间差就会导致数据不一致。

比如一件商品价格在数据库里面是500,然后redis也是500,但是突然数据库修改成了600,如果所有用户都是读入数据库的话,数据库会加锁,然后避免用户读出之前那个500,但是redis的更新怎么说都是有时间差的,所以用户就有可能读取到500这个数据。

这就是数据不一致的问题。

 

 

redis适合缓存怎么样的数据?

这里的数据分为两块,第一是数据库的数据,第二是页面的一些静态数据。

这里说的是数据库的数据。

页面的一些静态数据不适合存放在缓存中。

然后对于上面提出的数据不一致的问题,所以缓存的数据也有要求。

 

不要缓存那些对于数据一致性要求很高的数据。

如果这个数据存在被修改的可能性,那么最好不要存缓存,要么,就不要放数据库,只放缓存。

那些对于数据一致性不高的数据,都是可以放的。

强调一点是,如果这个数据放了,但是对于这个数据的操作不是修改,而是只有删除的话,也是可以存放缓存的,因为在实际操作中,如果一个删除操作被执行的时候,缓存可以先进行删除,这样就能确保没有用户能够读取到删除之后的数据,然后再对数据库进行删除。

本人在集群操作中出现以下错误:
1、[ERR] Node 192.168.161.131:7000 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0. 
解决:1)将每个节点下aof、rdb、nodes.conf本地备份文件删除; 
   2)172.168.63.201:7001> flushdb #清空当前数据库(可省略) 
   3)之后再执行脚本,成功执行;
2、执行分片命令./redis-trib.rb reshard 192.168.0.109:7001 出现
>>> Check for open slots...
[WARNING] Node 192.168.0.109:7001 has slots in importing state (8230).
[WARNING] The following slots are open: 8230
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** Please fix your cluster problems before resharding
解决:1)执行命令redis-trib.rb fix 192.168.0.109:7001
   2)如果无法修复,只要把redis.conf中定义的cluster-config-file所在的文件删除,重新启动redis-server及运行redis-trib即可
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值