麦子学院 2017-03-29 15:34
Redis的的集群如何搭建?
回复:0 查看:2342
Redis
集群并不支持处理多个
keys
的命令
,
因为这需要在不同的节点间移动数据
,
从而达不到像
Redis
那样的性能
,
在高负载的情况下可能会导致不可预料的错误。
Redis
集群通过分区来提供
一定程度的可用性 ,
在实际环境中当某个节点宕机或者不可达的情况下继续处理命令
. Redis
集群的优势
:
·
自动分割数据到不同的节点上。
·
整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
Redis 集群的主从复制模型
为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,
每个节点都会有
N-1
个复制品
.
在我们例子中具有A
,
B
,
C
三个节点的集群
,
在没有复制模型的情况下
,
如果节点
B
失败了,那么整个集群就会以为缺少
5501-11000
这个范围的槽而不可用
.
然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1
,
B1
,
C1,
那么整个集群便有三个
master
节点和三个
slave
节点组成,这样在节点
B
失败后,集群便会选举
B1
为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了
不过当B
和
B1
都失败后,集群是不可用的
.
搭建并使用Redis集群
搭建集群的第一件事情我们需要一些运行在
集群模式的Redis
实例
.
这意味这集群并不是由一些普通的
Redis
实例组成的,集群模式需要通过配置启用,开启集群模式后的
Redis
实例便可以使用集群特有的命令和特性了
.
下面是一个最少选项的集群的配置文件:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
文件中的 cluster-enabled
选项用于开实例的集群模式, 而
cluster-conf-file
选项则设定了保存节点配置文件的路径, 默认值为
nodes.conf.
节点配置文件无须人为修改, 它由
Redis
集群在启动时创建, 并在有需要时自动进行更新。
要让集群正常运作至少需要三个主节点,不过在刚开始试用集群功能时,
强烈建议使用六个节点:
其中三个为主节点,
而其余三个则是各个主节点的从节点。
首先,
让我们进入一个新目录,
并创建六个以端口号为名字的子目录,
稍后我们在将每个目录中运行一个 Redis
实例: 命令如下
:
mkdir cluster-test
cd cluster-testmkdir 7000 7001 7002 7003 7004 7005
在文件夹 7000
至
7005
中, 各创建一个
redis.conf
文件, 文件的内容可以使用上面的示例配置文件, 但记得将配置中的端口号从
7000
改为与文件夹名字相同的号码。
从 Redis Github
页面 的
unstable
分支中取出最新的
Redis
源码, 编译出可执行文件
redis-server
, 并将文件复制到
cluster-test
文件夹, 然后使用类似以下命令, 在每个标签页中打开一个实例:
cd 7000
../redis-server ./redis.
conf
实例打印的日志显示,
因为 nodes.conf
文件不存在, 所以每个节点都为它自身指定了一个新的
ID
:
[
82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
实例会一直使用同一个 ID
, 从而在集群中保持一个独一无二(
unique
)的名字。
搭建集群
现在我们已经有了六个正在运行中的 Redis
实例, 接下来我们需要使用这些实例来创建集群, 并为每个节点编写配置文件。
通过使用 Redis
集群命令行工具
redis-trib
, 编写节点配置文件的工作可以非常容易地完成:
redis-trib
位于
Redis
源码的
src
文件夹中, 它是一个
Ruby
程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片(
reshared
)等工作。
./
redis-trib.rb
create
--replicas
1
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
这个命令在这里用于创建一个新的集群,
选项
–replicas 1
表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是这个集群实例的地址列表,3
个
master3
个
slave redis-trib
会打印出一份预想中的配置给你看, 如果你觉得没问题的话, 就可以输入
yes
,
redis-trib
就会将这份配置应用到集群当中
,
让各个节点开始互相通讯
,
最后可以得到如下信息:
[OK]
All
16384
slots
covered
这表示集群中的 16384
个槽都有至少一个主节点在处理, 集群运作正常。
集群
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
应该被放置在哪个槽上。
cluster countkeysinslot
:返回槽
slot
目前包含的键值对数量。
cluster getkeysinslot
:返回
count
个
slot
槽中的键
使用集群
测试 Redis
集群比较简单的办法就是使用
redis-rb-cluster
或者
redis-cli
, 接下来我们将使用
redis-cli
为例来进行演示:
$ redis-cli -c -p 7000
redis 127.0.0.1:7000>
set foo bar
-> Redirected
to slot [12182] located at 127.0.0.1:7002
OK
redis 127.0.0.1:7002>
set hello world
-> Redirected
to slot [866] located at 127.0.0.1:7000
OK
redis 127.0.0.1:7000>
get foo
-> Redirected
to slot [12182] located at 127.0.0.1:7002"bar"
redis 127.0.0.1:7000>
get hello
-> Redirected
to slot [866] located at 127.0.0.1:7000"world"
添加一个从节点
有两种方法添加从节点,可以像添加主节点一样使用redis-trib
命令,也可以像下面的例子一样使用
–slave
选项
:
./
redis-trib.rb
add-node
--slave
127.0.0.1:7006
127.0.0.1:7000
此处的命令和添加一个主节点命令类似,此处并没有指定添加的这个从节点的主节点,这种情况下系统会在其他的复制集中的主节点中随机选取一个作为这个从节点的主节点。
你可以通过下面的命令指定主节点:
./
redis-trib.rb
add-node
--slave
--master-id
3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
127.0.0.1:7006
127.0.0.1:7000
也可以使用CLUSTER REPLICATE
命令添加
.
这个命令也可以改变一个从节点的主节点。
例如,要给主节点 127.0.0.1:7005
添加一个从节点,该节点哈希槽的范围
1423-16383,
节点
ID 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e,
我们需要链接新的节点(已经是空的主节点)并执行命令
:
redis 127.0.0.1:7006>
cluster
replicate 3
c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
我们新的从节点有了一些哈希槽,其他的节点也知道(过几秒后会更新他们自己的配置),可以使用如下命令确认:
$ redis-cli -p 7000 cluster nodes | grep slave | grep 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e
f093c80dde814da99c5cf72a7dd01590792b783b 127.0.0.1:7006 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617702 3 connected2938205e12de373867bf38f1ca29d31d0ddb3e46 127.0.0.1:7002 slave 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 0 1385543617198 3 connected
节点 3c3a0c…
有两个从节点,
7002 (
已经存在的
)
和
7006 (
新添加的
).
移除一个节点
只要使用
del-node
命令即可:
./redis-trib del-node 127.0.0.1:7000 ``
第一个参数是任意一个节点的地址,
第二个节点是你想要移除的节点地址。
使用同样的方法移除主节点,
不过在移除主节点前,需要
确保这个主节点是空的 .
如果不是空的
,
需要将这个节点的数据重新分片到其他主节点上
.
替代移除主节点的方法是手动执行故障恢复,被移除的主节点会作为一个从节点存在,不过这种情况下不会减少集群节点的数量,也需要重新分片数据。
来源: Linux
公社