以前讲过通过Redis Sentinel做高可用,在Redis3.0之后,Redis增加了Redis Cluster高可用方案,该方案采用虚拟槽进行数据分区存储。由于本文的目标是记录其高可用配置方法,所以对于原理不会做过多阐述。
准备节点
Redis Cluster一般由多个节点组成,它的高可用方案需要至少6个节点,这和Kubernetes高可用方案的节点要求相同。为了方便,我们直接在一台机器上通过修改端口,开6个Redis实例来配置Redis Cluster。
首先在Redis目录中新建一个conf
目录,然后在该目录新建名为redis-6379.conf
的文件,输入下面内容
port 6379 # 节点端口
cluster-enabled yes # 开启集群模式
cluster-node-timeout 15000 # 节点超时时间
cluster-config-file "node-6379.conf" #Redis 实例启动后自己创建的集群配置文件
redis-6379.conf
其它配置和Redis默认配置一样,可以根据需要修改。为了方便观察节点细节,我这里并没设置daemonize: yes
。
我们再将该文件复制5份,重命名为redis-{port}.conf
,这里port我分别取[6380, 6384]
。
然后通过redis-server conf/redis-{port}.conf
命令把这6个实例都启动。
然后通过客户端查看集群状态,这里我查看连接端口为6380的节点
redis-cli -h 127.0.0.1 -p 6380
cluster nodes
返回的信息如下
127.0.0.1:6380> cluster nodes
11ac34be26cbaca9924610f05a15d6a844769a15 :6380 myself,master - 0 0 0 connected
从上述信息可以看出目前Redis每个节点只能识别出自己的信息,6个节点都不知道对方的存在
节点握手
节点握手是集群通信的第一步,Redis节点采用Gossip
协议进行通信。 我们还是先连接到任意一个节点,我这里还是以6380为例,然后让其和另外五个节点建立连接
cluster meet 127.0.0.1 6379 # 其他端口就省略不写了
现在我们再连接任意客户端,通过cluster nodes
查看集群节点,可以看到6个节点的信息了。
这个时候集群还处于下线状态,还不能对外提供服务
set test hello
(error) CLUSTERDOWN Hash slot not served
这时候通过cluster info
可以看到集群状态为fail
,并且cluster_slots_assigned
也为0,即表示被分配的槽是0。
分配槽
Redis集群把所有数据映射到2^14个槽中,每个key会映射到一个固定的槽,只有节点分配了槽,才能响应和槽关联的命令(主要是数据读写)。手动为节点分配槽的方式如下
redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0..5461}
上述语句为端口为6379
的节点设置范围为[0, 5461]
的槽,注意这里是两个.
我们再对6380
和6381
执行相同操作。将剩下的三个节点用于前三个节点的从节点,通过cluster replicate nodeID
命令完成。
首先我们使用客户端连接6382
,然后输入cluster nodes
查看当前Cluster信息,可以看到各个节点的node_id,我想把6382
作为6379
的从节点,6379
的node_id为4949c5731b0ba9050279b4d84359b4b0acafaeab
,那么执行下面命令
cluster replicate 4949c5731b0ba9050279b4d84359b4b0acafaeab
剩下两个执行一样的命令,便可以完成槽的分配了。注意,一定要把0~16383
这个范围的槽分满,否则集群会一直处于fail
状态
此时,集群便可以对外提供服务了。
使用redis-trib.rb自动创建集群
如果节点太多,手动配置集群的工作量就会非常大,Redis官方提供了基于Ruby的自动化集群配置工具。
- 安装Ruby
- tar vxf ruby-2.3.1.tar.gz
- cd ruby-2.3.1
- ./configure -prefix=/usr/local/ruby
- make
- make install
- cd /usr/local/ruby
- sudo cp bin/ruby /usr/local/bin
- sudo cp bin/gem /usr/local/bin
- 安装rubygem redis依赖
- wget http://rubygems.org/downloads/redis-3.3.0.gem
- gem install -l redis-3.3.0.gem
- 将redis server目录中的
redis-trib.rb
文件拷贝到/usr/local/bin
目录下,或者给将redis server path
添加到环境变量中 - 准备节点,我们直接复用上文提到的节点。需要先把它们都停掉,然后删除集群配置文件:
rm -rf nodes*
,然后再重新启动 - 创建集群
-
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6381
: 这里--replicas
表示每个主节点slave的个数。在执行该命令的时候,命令终端会询问你是否同意继续,输入yes
继续
-
-
redis-trib.rb check 127.0.0.1 6379
: 检查集群是否创建成功。该命令也可以用于检测手动创建的集群 - 注意,redis节点地址必须是不包含任何槽或者数据的节点,否则集群创建会失败
参考
网友评论