redis 集群搭建

5.7 集群搭建

5.7.1 准备工作

redis5.0版本之后可以直接使用redis-cli命令创建集群,不使用redis-trib.rb命令了。

5.7.2 集群规划

(1)Redis集群最少需要6个节点,3主3从,可以分布在一台或者多台主机上。

真集群:6台主机,每台主机的redis服务使用的IP不同,端口号随意,一样不一样都可以

假集群,一台主机,redis服务使用的IP相同,端口号不同

本例子是在一台主机上创建假集群,不同的端口表示不同的redis节点,如下:

主节点: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 127.0.0.1:7006

后期新加的主节点:127.0.0.1:7007

后期新家的从节点:127.0.0.1:7008

(2)在/usr/local/src/redis-5.0.4/下创建cluster目录,其下创建7001、7002…7006目录,如下:

(3)将redis解压路径下的配置文件redis.conf,依次拷贝到每个700X目录内,并修改每个700X目录下的redis.conf配置文件:

# cd /usr/local/src/redis-5.0.4/cluster
# mkdir {7001,7002,7003,7004,7005,7006}
# mkdir -p /var/log/redis/{7001,7002,7003,7004,7005,7006}

# redis.conf文件示例
bind 127.0.0.1
port 7001
daemonize yes
pidfile /var/run/redis_7001.pid
dir "./" # node.conf文件保存路径
logfile "/var/log/redis/7001/redis.log"
appendonly yes
appendfsync always
cluster-enabled yes
cluster-config-file nodes-7001.conf # 该文件中包含集群信息

# 其他配置文件类似,把端口号修改一下就行了

5.7.3 启动每个节点redis服务

批量启动脚本:

# vim s/usr/local/src/redis-5.0.4/cluster/ctart_cluster.sh
#!/bin/bash

cd ./7001 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ../7002 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ../7003 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ../7004 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ../7005 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ../7006 && /usr/local/src/redis-5.0.4/src/redis-server ./redis.conf
cd ..

# chmod +x start_cluster.sh

注意:一定要进入700X目录中启动,因为它会自动在当前目录中创建cluster-config,即nodes.conf。因为你在哪个目录下执行这个命令,则node.conf文件就会在该目录下创建。

但是若是在配置文件中配置dir为其他目录,则该文件会创建在dir指定目录下

或者把redis-server程序文件依次拷贝到每个700x目录下,然后使用不同目录的redis-server程序文件启动

关闭脚本:

# vim /usr/local/src/redis-5.0.4/cluster/shutdown_cluster.sh
#!/bin/bash

pgrep redis-server | xargs -exec kill -9

# chmod +x shutdown_cluster.sh

执行启动脚本批量启动:

# ./start_cluster.sh

5.7.4 执行创建集群命令

进入到redis源码存放目录/usr/local/src/redis-5.0.4/src下,把redis-cli文件拷贝到/usr/local/bin/目录下

cd  /usr/local/src/redis-5.0.4/cluster
/usr/local/src/redis-5.0.4/src/redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1 

# --cluster-replicas 1  表示主从配置比,1表示的是1:1,前三个是主,后三个是从
# 若配置文件中设置的密码,则还需要加上-a passwod

......
Can I set the above configuration? (type 'yes' to accept): yes
......
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

5.7.5 查询集群信息

注意:查询集群信息需要加上-c参数

或者直接执行命令查询,如下面所示;或者登陆到其中一个集群节点,使用命令cluster nodes进行查询

# /usr/local/src/redis-5.0.4/src/redis-cli -c -h 127.0.0.1 -p 7001 cluster nodes
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564918712465 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564918714483 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564918713000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564918713474 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564918713000 1 connected 0-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564918712000 2 connected 5461-10922

参数说明:

  • -c:表示以集群方式连接惹redis
  • -h:指定IP地址
  • -p:指定端口
  • cluster nodes:查询集群节点信息
  • cluster info:查询集群状态信息

其他查询方法:

# /usr/local/src/redis-5.0.4/src/redis-cli --cluster check 127.0.0.1:7001
127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:7001)
M: 4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 59b6597448b668a355d85dcc7a0623bc36263e5f
M: bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005
   slots: (0 slots) slave
   replicates bbe8b7035bfd31c47bec7d612acc112cd2869368
S: 5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006
   slots: (0 slots) slave
   replicates 4dad696ede24995a57c5fd790faa95c72c187a22
M: 59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1: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.

# /usr/local/src/redis-5.0.4/src/redis-cli --cluster info 127.0.0.1:7001 
127.0.0.1:7001 (4dad696e...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7003 (bbe8b703...) -> 0 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (59b65974...) -> 0 keys | 5462 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

5.7.6 redis cluster集群重新启动

因为集群已经创建过了,若是关机等原因关闭了redis服务,则只需要执行批量启动脚本即可,就会自动开启集群,因为有node.conf文件的存在

5.7.7 redis-cli集群命令帮助

# /usr/local/src/redis-5.0.4/src/redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

5.8 集群管理

5.8.1 添加新主节点

redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id

5.8.2 hash槽重新分配

添加完新节点后,需要对新添加的主节点进行hash槽重新分配,这样该主节点才能存储数据,redis共有16384个槽。

redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes

5.8.2 添加新从节点

redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id

5.8.3 删除节点

redis-cli --cluster  del-node host:port node_id

5.8.4 集群常用命令

# 创建集群
redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas <arg>
# 例子
redis-cli --cluster create 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 127.0.0.1:7006 --cluster-replicas 1
# 例子说明
host1:port1 ... hostN:portN表示的是要添加的集群的节点IP和端口,
--cluster-replicas <arg>表示的是主从节点比例,参数1表示前三个是主节点,后三个是从节点
也就是说7001,7002,7003端口对应的节点是主节点,7004,7005,7006对应的节点是从节点

# 查询集群节点信息
redis-cli -c -p 7001 cluster nodes        
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922

# 说明:以下的操作均是以上面这个为参数示例

# 给集群添加一个新主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7003 --cluster-master-id bbe8b7035bfd31c47bec7d612acc112cd2869368
# 例子说明
new_host:new_port为要新添加的主节点IP和端口,此处是127.0.0.1:7007
existing_host:existing_port表示的是已存在的最后一个主节点的IP和端口,这个可以从上述的节点信息中查看到,根据slots槽数,7003端口对应的节点槽数是10923-16383,16383表示的是最后的槽数
--cluster-master-id表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面

# 再次查看集群信息
redis-cli -c -p 7001 cluster nodes        
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564923261350 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564923263366 3 connected 10923-16383
7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564923260344 0 connected
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564923262000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564923260000 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564923263000 1 connected 0-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564923262358 2 connected 5461-10922
# 会发现7007端口对应的节点已经加入到集群中,是主节点,但是没有从节点,也没有分配槽数

# 给新添加的主节点分配slots槽数
redis-cli --cluster reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots 500 --cluster-yes
# 例子
redis-cli --cluster reshard 127.0.0.1:7007 --cluster-from 4dad696ede24995a57c5fd790faa95c72c187a22 --cluster-to 7020c8df9423686727783c60bd2f0e367634ba84 --cluster-slots 500 
# 例子说明
host:port表示的是新添加的那个主节点IP和端口,此处表示的是127.0.0.1:7007
--cluster-from node_id表示的是集群第一个主节点的节点id,这个可以现有集群的slots槽数分配看出,此处表示的是7001端口对应的节点
--cluster-to node_id表示的是集群最后一个主节点的节点id,也就是新添加的那个主节点id,此处表示的是7007端口对应的节点
--cluster-slots 500表示的是给新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
--cluster-yes表示的是自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配

# 再次查看集群信息
/redis-cli -c -p 7001 cluster nodes                                         7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924042000 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924042157 3 connected 10923-16383
7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924040140 7 connected 0-499
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924040000 5 connected
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924041149 6 connected
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924040000 1 connected 500-5460
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924043166 2 connected 5461-10922
# 会发现7007端口对应的主节点已经有slots槽数了,并且是从0开始的

# 给集群中某个主节点再添加一个从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id
# 例子
redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7008 --cluster-slave --cluster-master-id 7020c8df9423686727783c60bd2f0e367634ba84
# 例子说明
new_host:new_port表示的是要添加的那个从节点的IP和端口,此处表示的是127.0.0.1:7008
existing_host:existing_port表示的是要给哪个主节点添加从节点,此处表示的是127.0.0.1:7007
--cluster-slave表示的是要添加从节点,否则则是添加主节点了
--cluster-master-id node_id表示要给哪个主节点添加从节点的该主节点节点id

# 再次查看集群信息
redis-cli -c -p 7001 cluster nodes                                         7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564924845000 7 connected 0-499
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564924843000 1 connected 500-5460
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564924845214 6 connected
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564924843195 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564924844205 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564924845000 5 connected
415db07121ba946b202bca98e15cbdffc60bc18a 127.0.0.1:7008@17008 slave 7020c8df9423686727783c60bd2f0e367634ba84 0 1564924846224 7 connected
c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564924844000 2 connected 5461-10922
# 会发现7008端口对应的节点已经是7007端口对应的从节点

# 从集群中删除一个从节点
redis-cli --cluster  del-node host:port node_id
# 例子
redis-cli --cluster del-node 127.0.0.1:7008 415db07121ba946b202bca98e15cbdffc60bc18a
# 例子说明
host:port表示的是要删除的那个节点的IP和端口,此处是127.0.0.1:7008
node_id表示的是删除的那个节点的节点id

# 其他命令有待补充

5.9 注意事项

5.9.1 防火墙端口放行

若是允许Redis集群被外网用户访问,除了需要修改配置文件外,还需要修改防火墙,开放集群中reids节点的端口。

说明:如果要开放一个范围的端口,可以使用冒号来分割,即: 7001:7004,表示开放7001-7004之间所有的端口

5.9.2 登录节点问题

若是登录的是集群中的节点,需要加上-c参数;否则不用加该参数

# 登录集群节点的命令
redis-cli -c -h ip -p port -a password

# 登录一般节点或者从节点的命令
redis-cli -h ip -p port -a password

5.9.3 如何删除集群中无效的节点

redis-cli -c -p 7001 cluster nodes                                        
7020c8df9423686727783c60bd2f0e367634ba84 127.0.0.1:7007@17007 master - 0 1564925352648 7 connected 0-499
4dad696ede24995a57c5fd790faa95c72c187a22 127.0.0.1:7001@17001 myself,master - 0 1564925349000 1 connected 500-5460
5612ffbb0407dbda50828b505a16b39ede51168b 127.0.0.1:7006@17006 slave 4dad696ede24995a57c5fd790faa95c72c187a22 0 1564925351000 6 connected
7d388cc31df969d3e1715ce9644318bfd48317b1 127.0.0.1:7004@17004 slave 59b6597448b668a355d85dcc7a0623bc36263e5f 0 1564925354665 4 connected
bbe8b7035bfd31c47bec7d612acc112cd2869368 127.0.0.1:7003@17003 master - 0 1564925353657 3 connected 10923-16383
456921ae96af71d8183101f798cf5ceda4b0381e 127.0.0.1:7005@17005 slave bbe8b7035bfd31c47bec7d612acc112cd2869368 0 1564925349000 5 connected
c3e04f0e8710c25d59703374a224ee8bec776e43 :0@0 master,fail,noaddr - 1564924804548 1564924802833 0 disconnected
59b6597448b668a355d85dcc7a0623bc36263e5f 127.0.0.1:7002@17002 master - 0 1564925352000 2 connected 5461-10922

# 如上集群中有一个无效的节点信息,要如何删除,这个还不知道咋操作。
posted @ 2019-08-29 09:03  哈喽哈喽111111  阅读(638)  评论(0编辑  收藏  举报