首先看之前笔记安装redis(可以不安装,去redis的github上copy源码编译)。
Redis群集配置参数我们即将创建一个示例集群部署。在继续之前,让我们介绍Redis Cluster在redis.conf
文件中引入的配置参数。有些人会很明显,有些人会在你继续阅读时更清楚。
-
cluster-enabled
<yes/no>
:如果是,则在特定Redis实例中启用Redis群集支持。否则,实例像往常一样作为独立实例启动。 -
cluster-config-file
<filename>
:请注意,尽管有此选项的名称,但这不是用户可编辑的配置文件,而是每次发生更改时Redis群集节点自动保持群集配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了集群中其他节点,状态,持久变量等内容。由于某些消息接收,通常会将此文件重写并刷新到磁盘上。 -
cluster-node-timeout
<milliseconds>
:Redis群集节点不可用的最长时间,不会被视为失败。如果主节点的可访问时间超过指定的时间,则其从属节点将进行故障转移。此参数控制Redis群集中的其他重要事项。值得注意的是,在指定时间内无法访问大多数主节点的每个节点都将停止接受查询。 -
cluster-slave-validity-factor
<factor>
:如果设置为零,则从站将始终尝试对主站进行故障切换,而不管主站和从站之间的链路是否保持断开连接的时间长短。如果该值为正,则计算最大断开时间作为节点超时值乘以此选项提供的因子,如果节点是从属节点,则如果主链接断开连接的时间超过指定的时间,则不会尝试启动故障转移。例如,如果节点超时设置为5秒,并且有效性因子设置为10,则从主设备断开超过50秒的从设备将不会尝试故障转移其主设备。请注意,如果没有从站能够对其进行故障转移,则任何不同于零的值都可能导致Redis群集在主站发生故障后不可用。在这种情况下,只有当原始主服务器重新加入群集时,群集才会返回。 -
cluster-migration-barrier
<count>
:主服务器将保持连接的最小从服务器数,以便另一个从服务器迁移到不再由任何从服务器覆盖的主服务器。有关详细信息,请参阅本教程中有关副本迁移的相应部分。 -
cluster-require-full-coverage
<yes/no>
:如果设置为yes,则默认情况下,如果任何节点未覆盖某个百分比的密钥空间,则集群将停止接受写入。如果该选项设置为no,即使只能处理有关键子集的请求,群集仍将提供查询。
以下是最小的Redis群集配置文件:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
正如您所看到的,启用集群模式的只是cluster-enabled
指令。每个实例还包含存储此节点配置的文件路径,默认情况下为nodes.conf
。这个文件永远不会被人类接触; 它只是在Redis Cluster实例启动时生成,并在每次需要时更新。
请注意,按预期工作的最小群集需要包含至少三个主节点。对于您的第一次测试,强烈建议启动具有三个主设备和三个从设备的六节点集群。
为此,请输入一个新目录,并创建以我们将在任何给定目录中运行的实例的端口号命名的以下目录。
就像是:
mkdir cluster
cd cluster
mkdir 7000 7001 7002 7003 7004 7005
redis.conf
在每个目录中创建一个文件,从7000到7005.作为配置文件的模板,只需使用上面的小例子,但请确保7000
根据目录名称用正确的端口号替换端口号。
然后cd到不同目录,启动不同的redis.conf
如:redis-server /etc/redis/cluster/7000/redis.conf
注意:在这里我遇到了在创建集群时报了一个错误
[ERR] Node 120.77.241.104:7003 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
这是因为我在创建集群时没有删除appendonly.aof,nodes.conf加上执行redis-server你在那个目录执行就在那个目录创建这几个文件,所以说导致7003这个目录下没有生成这几个文件而报错。
解决方法:
1)、将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;
3)、再次添加新节点如果还是报错,则登录新Node,./redis-cli–h x –p对数据库进行清除:
172.168.63.201:7001> flushdb #清空当前数据库
接着分别启动
redis-server /etc/redis/cluster/7000/redis.conf
redis-server /etc/redis/cluster/7001/redis.conf
redis-server /etc/redis/cluster/7002/redis.conf
redis-server /etc/redis/cluster/7003/redis.conf
redis-server /etc/redis/cluster/7004/redis.conf
redis-server /etc/redis/cluster/7005/redis.conf
从每个实例的日志中可以看出,由于不nodes.conf
存在任何文件,因此每个节点都会为自己分配一个新ID。
[82462] 26 Nov 11:56:55.329 * No cluster configuration found, I'm 97a3a64667477371c4479320d683e4c8db5858b1
此特定实例将永久使用此ID,以使实例在群集的上下文中具有唯一名称。每个节点都使用此ID记住每个其他节点,而不是通过IP或端口记住。IP地址和端口可能会发生变化,但唯一的节点标识符永远不会在节点的整个生命周期内发生变化。我们称这个标识符为Node ID。
创建集群
现在我们已经运行了许多实例,我们需要通过向节点编写一些有意义的配置来创建我们的集群。
如果您使用的是Redis 5,这很容易实现,因为我们在嵌入的Redis Cluster命令行实用程序的帮助下redis-cli
,可用于创建新集群,检查或重新硬化现有集群等等。
对于Redis版本3或4,有一个名为redis-trib.rb
非常相似的旧工具。您可以src
在Redis源代码分发的目录中找到它。你需要安装redis
gem才能运行redis-trib
。
这里我使用的是redis-5.0.5
Redis 5创建集群,redis-cli
只需键入:
redis-cli --cluster create 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 --cluster-replicas 1
这里使用的命令是create,因为我们想要创建一个新的集群。该选项--cluster-replicas 1
意味着我们希望每个创建的主服务器都有一个从服 其他参数是我要用于创建新集群的实例的地址列表。
显然,我们要求的唯一设置是创建一个包含3个主服务器和3个从服务器的集群。
Redis-cli将为您提供配置。键入yes接受建议的配置。将配置并加入群集,这意味着实例将被引导为彼此通信。最后,如果一切顺利,你会看到这样的消息:
[OK] All 16384 slots covered
接着集群创建成功
在使用代码连接redis集群时报:no reachable node in cluster
一直没有找到原因,后面偶然看到配置文件,发现这个地方以前我没注释redis.conf文件中的bind 127.0.0.1 然后做集群时使用的命令是redis-cli --cluster create 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 --cluster-replicas 1来创建的集群,
在nodes.conf里面的ip地址是127.0.0.1:7000
解决办法:
删除以上所有里面这个node.conf文件
然后:
重新做集群:
redis-cli --cluster create 120.77.241.104:7000 120.77.241.104:7001 120.77.241.104:7002 120.77.241.104:7003 120.77.241.104:7004 120.77.241.104:7005 --cluster-replicas 1
然后重新测试就解决了;
还要注意一下每个redis下面的redis.conf的配置(以下是我的):
port 7005
#bind
#redis后台运行
#daemonize yes
#开启集群
cluster-enabled yes
#集群的配置 配置文件首次启动自动生成 7000,7001,7002
cluster-config-file nodes.conf
#请求超时 默认15秒,可自行设置
cluster-node-timeout 5000
#aof日志开启 有需要就开启,它会每次写操作都记录一条日志
appendonly yes
#关闭保护模式
protected-mode no
(完)