1. 简介
从3.0版本开始redis就提供了官方的cluster解决方案,该方案可以将redis中的数据自动分片,分布于不同的redis节点上(Master Role)。Cluster中至少需要有3个Master,每个Master至少要有1个Slave,这样才能保证Cluster的数据安全性。
Cluster中的每个redis节点必须打开两个TCP端口,一个用来为客户端提供服务,例如“6379”,另一个用于集群总线,即使用二进制协议的节点到节点的通信信道。命令端口和集群总线端口的偏移是固定的,始终为10000。即如果命令端口是6379,那么对应的集群总线端口就是16379。Cluster中的两两节点之间的两个端口必须是互通的。
Redis Cluster使用哈希槽的技术将数据散列与不同的redis节点。Redis Cluster有16384个散列槽,通过CRC16算法计算,然后对16384取模,即可得到数据存在于哪个redis节点。
2. redis安装
redis集群所需的命令行工具安装比较简单,和单机版并没有什么不同。
$ wget http://download.redis.io/releases/redis-4.0.12.tar.gz
$ tar xf redis-4.0.12.tar.gz
$ cd redis-4.0.12
$ make
按照上面的步骤make之后,我们可以在src的目录下找到很多redis开头的二进制文件,这些就是我们需要的。我们可以将这几个文件拷贝到我们自定义的路径下,或者系统的PATH路径下都行。
有一个比较重要的文件就是redis-trib.rb
,这是一个ruby编写的脚本,主要用来创建集群,所以我们要确保系统中有ruby命令。
$ sudo apt-get install ruby -y
$ sudo gem install redis
3. redis配置文件
配置部分除了常规的单机redis的配置外,我们需要看下集群的配置部分。
cluster-enabled <yes/no>
是否启用redis集群功能。cluster-config-file <filename>
集群配置文件,该配置文件由集群自行维护,我们无需修改。cluster-node-timeout <milliseconds>
集群中节点不可用的最大时长。如果主节点的不可访问时长超过这个限制,就会进行故障转移。cluster-slave-validity-factor <factor>
如果设置为0,则从服务器将始终尝试对主服务器进行故障转移,而不管主服务器和从服务器之间的连接断开的时间长短。如果值是正数,最大断开时间计算的节点超时值乘以这个系数,如果主链接断开连接超过前面计算的时间,那么slave不会进行故障转移。例如,如果节点超时设置为5秒,而有效性系数设置为10,则断开与主服务器连接超过50秒的从服务器将不会尝试对其主服务器进行故障转移。请注意,如果没有能够进行故障转移的从服务器,任何不同于0的值都可能导致Redis集群在主服务器故障后不可用。在这种情况下,只有当原来的主机重新加入集群,集群才可以重新使用。建议值为0。cluster-migration-barrier <count>
主服务器所对应的最小的从服务器的个数。最小值为1。cluster-require-full-coverage <yes/no>
如果这个值被设置为yes(默认情况下是这样),那么当某个键空间没有被任何节点覆盖时,集群将停止接受写操作。如果选项设置为no,那么即使只能处理关于键子集的请求,集群仍然会提供查询。建议设置为yes。
4. 创建集群
单机版最小集群需要6个redis节点。
主要配置如下:
daemonize yes
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
接下来我们创建配置相关的目录。我们在自定义目录中创建6个目录来存放每个redis节点的配置文件。将上面的配置文件放到这6个目录中,修改每个目录下的配置文件的端口号,和目录名对应皆可以,然后我们启动每个节点。
$ sudo mkdir -p /opt/redis-cluster/{7000,7001,7002,7003,7004,7005}
$ sudo redis-server /opt/redis-cluster/7000/redis.conf #其余的使用相同方式启动
$
节点运行起来之后,我们开始创建集群。redis5使用redis-cli命令创建,redis4、3使用redis-trib.rb来创建。。
- redis5
$ 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-relicas 1
- redis4/3
$ 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
--cluster-replicas 1 和--replicas 1都是相同的意思,就是每个主节点有一个从节点。
5. 验证
上面的操作已经将集群创建好了,接下来我们验证一下集群搭建是否存在问题。
$ 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"
如果和上面显示结果一样,那么我们的集群搭建的是没有问题的。