Redis集群搭建全记录
redis集群是一个提供在多个redis节点间共享数据的程序集。
redis集群中不支持处理多个keys的命令。
redis集群通过分区来提供一定程度的可用性。在某个节点宕机或者不可用的时候可以继续处理命令。
redis集群数据分片
在redis集群中,使用数据分片(sharding)而不是一致性hash(consistency hashing)来实现,一个redis集群包含16384个哈希槽(hash slot),数据库中的每个键都存在这些哈希槽中的某一个,通过crc16校验后对16384取模来决定。
加入说现在集群中有三个节点,那么
①节点a包含0到5500号哈希槽。
②节点b包含5501到11000号哈希槽。
③节点c包含11001到16384号哈希槽。
然后如果我们要增加一个节点的时候,会从abc三个节点分别得到一部分槽到d上。如果我们移除一个节点的时候,就会把移除的节点的分隔槽移到剩下的槽上面。
redis主从复制模型
为了实现redis的集群的高可用性。redis提供了一个主从复制模型。每个节点都会有n-1个复制品。
如果在创建集群的时候,我们为每个节点添加了一个从节点,这时候,如果其中的某个主节点挂掉了,便会把它的从节点做为新的主节点,继续提供服务。但是如果主节点和从节点都挂掉了,那就不可以继续使用了。
redis集群搭建
redis集群由多个云新在集群模式下的redis实例组成。实例的集群模式需要通过配置来开启。
下面是一个包含了最少选项的集群配置文件实例:
port指定了节点的端口号
cluster-enabled yes选项用于开启实例的集群模式
cluster-config-file nodes.conf设置了保存节点的配置文件路径,这个文件无须认为修改,是在集群启动的时候创建。
cluster-node-timeout 5000:设置了方式失败的等待时间。即5秒还访问不了就认为这个节点不可用。
appendonly yes:用于开启aof持久化
pidfile /var/run/redis_xxxx.pid设置pid文件的位置,其中xxxx为端口号
dir /usr/local/redis-cluster/xxxx设置工作目录,其中xxxx为端口号。
此时目录中的文件是这样的
下面启动这六个节点
查看启动后的进程:
再次查看文件目录:
可以看到生成了aof和nodes文件,保存的时候还会有dump文件生成。
在看看pid
接下来,我们就需要使用redis-trib工具和这六个节点来创建集群了。
redis-trib位于redis源码的src目录下。
我们复制一份到redis-cluster目录下。
开始启动集群:
下面是本人失败的安装版本,后面也有成功的版本。
因为是ruby的程序,所以我们需要安装ruby,
yum -y install ruby
继续启动集群:
还是报错了,说需要rubygems,我们继续安装:
yum -y install rubygems
继续启动集群:
依然还是报错了...,我们需要安装更高版本的ruby。
所以,我决定,先卸载掉1.8的ruby。
yum -y remove ruby
然后重新安装
然后查看ruby的版本:
最后,为了运行redis-trib我们需要安装redis gem。
如果出现下面的错误
我们继续开启集群:依然还是报错,几经折腾,还是没解决掉
最好,找到了下面这种方法。
成功版本
通过rvm这个ruby的管理工具来安装ruby。
首先安装rvm,如果下面的命令提示找不到curl,可以通过yum install -y crul来安装crul。
发现失败了,我们按照提示进行操作。
发现rvm已经安装成功了,为了让配置立即生效,我们需要用source命令导入rvm的配置文件。
先查看下配置文件的路径,然后导入。
接下来就可以安装高版本的ruby了,建议安装2.2.3版本,不然的话,等下gen install redis的时候,可能会报下面的错误:
废话少说,接下来安装2.2.3版本的ruby
可以看到,不进ruby安装好了2.3.3版本,还把rubygems也安装好了。
如果要删除掉某个版本的ruby可以用这个命令:rvm remove 1.9.3
。
我们继续安装:
看到这里,折腾了两个晚上终于弄好了。接下来就是使用我们的redis-trib开启集群了。
为了方便,我把redis-trib.rb这个文件复制了一份到/usr/local/bin这个目录下,因为这个目录在path下面,里面的命令可以直接执行。
再次确认下六个redis节点的运行是ok的。
在创建的过程中,redis会给出一份预想的配置给我们看,确定没问题就输入yes并回车。系统就给我们创建了三个主,三个从的集群结构。
可以看到all 16384 slots covered。
redis-cli
redis-cli默认情况下连接的是本地的6379端口的redis服务器。
现在有六个端口,所以需要指定参数。
redis-cli -h xxx -p xxx -a xxx
-h:指定服务器
-p:指定端口号
-a:指定密码
-c:开启集群模式
可以看到,已经可以共享数据了。
但是,如果我们把某一个主节点杀掉呢?
可以看到7005端口的节点已经变成主节点了。那如果继续把7005节点也宕掉呢?
可以看到集群已经出现问题了。
追记:
在搭建多机多点集群的时候,遇到以下问题:
1、一直在等待...
>>> nodes configuration updated
>>> assign a different config epoch to each node
>>> sending cluster meet messages to join the cluster
waiting for the cluster to join.......................
解决办法:确认端口是否开放。如果没有开发,可以修改/etc/sysconfig/iptables文件,开放端口(复制一行前面开放端口的来修改),然后service iptables restart重启防火墙。
极端的可以service iptables stop来关闭防火墙
2、槽被利用
解决办法:删除掉在redis.conf的dir目录下的几个文件redis.conf文件除外。
如果还是有相同的问题,可以考虑对所有节点执行下面两个命令。
redis-cli -p 端口号-h 主机物理地址 flushall
redis-cli -p 端口号-h 主机物理地址 cluster reset soft