概念

Redis集群提供一种方式自动将数据分布在多个Redis节点上。

每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如6379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,比如16379。第二个端口(本例中就是16379)用于集群总线,这是一个用二进制协议的点对点通信信道。这个集群总线(Cluster bus)用于节点的失败侦测、配置更新、故障转移授权,等等。客户端从来都不应该尝试和这些集群总线端口通信,它们只应该和正常的Redis命令端口进行通信。注意,确保在你的防火墙中开放着两个端口,否则,Redis集群节点之间将无法通信。

命令端口和集群总线端口的偏移量总是10000。

注意,如果想要集群按照你想的那样工作,那么集群中的每个节点应该:

  1. 正常的客户端通信端口(通常是6379)用于和所有可到达集群的所有客户端通信
  2. 集群总线端口(the client port + 10000)必须对所有的其它节点是可到达的

也就是,要想集群正常工作,集群中的每个节点需要做到以下两点:

  1. 正常的客户端通信端口(通常是6379)必须对所有的客户端都开放,换言之,所有的客户端都可以访问
  2. 集群总线端口(客户端通信端口 + 10000)必须对集群中的其它节点开放,换言之,其它任意节点都可以访问

如果你没有开放TCP端口,你的集群可能不会像你期望的那样工作。集群总线用一个不同的二进制协议通信,用于节点之间的数据交换

 

redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。

Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。所以我们在测试的时候看到set 和 get 的时候,直接跳转到了7000端口的节点。

Redis 集群会把数据存在一个 master 节点,然后在这个 master 和其对应的salve 之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的 master 节点获取数据。只有当一个master 挂掉之后,才会启动一个对应的 salve 节点,充当 master 。

需要注意的是:必须要3个或以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点数的一半时,整个集群就无法提供服务了。

 

安装步骤

最小的集群至少需要3个master节点

这里,我们为了测试,用三主三从。

1.首先需要安装好redis。

2.创建目录

在 redis 目录下 创建目录 redis_cluster 目录。

mkdir redis_cluster

在该目录下 创建目录 7000 7001 7002 7003 7004 7005 

将 redis.conf 分别拷贝到这些目录中。

3.编辑 redis.conf 文件

编辑这个文件

port  7000                                       //端口7000,7002,7003        
bind 127.0.0.1 192.168.31.100                    //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群
daemonize    yes                                       //redis后台运行
pidfile  /var/run/redis_7000.pid                          //pidfile文件对应7000,7001,7002,7003,7004,7005
cluster-enabled  yes                                   //开启集群  把注释#去掉
cluster-config-file  nodes_7000.conf                           //集群的配置  配置文件首次启动自动生成 7000,7001,7002,7003,7004,7005
cluster-node-timeout  15000                                //请求超时  默认15秒,可自行设置
appendonly  yes    

每个文件改对应的端口。

4.依次启动这些实例

./bin/redis-server redis_cluster/7000/redis.conf

./bin/redis-server redis_cluster/7001/redis.conf

./bin/redis-server redis_cluster/7002/redis.conf

./bin/redis-server redis_cluster/7003/redis.conf

./bin/redis-server redis_cluster/7004/redis.conf

./bin/redis-server redis_cluster/7005/redis.conf

检查启动情况

执行命令 

ps -ef | grep redis

netstat -tnlp | grep redis

 

5.创建集群

./bin/redis-cli --cluster create 192.168.31.100:7000 192.168.31.100:7001 192.168.31.100:7002 192.168.31.100:7003 192.168.31.100:7004 192.168.31.100:7005 --cluster-replicas 1

前三个为主实例,后三个为从实例

这里有个警告应为主从都在同一台机器。 

红框提示后,输入yes。

6.验证集群

执行命令

redis-cli  -c -p 7002 

连接到 7002 端口。

查看键,没有键值。

set sex man ,发现数据被设置到 7000。

重新登录7002 输入keys * ,这台机器仍然为空。

输入 get sex 

redis 自动路由到 7000端口。

7.集群信息查看

输入命令 cluster info

 查看节点信息

cluster nodes

 

出错处理

redis集群报错Node is not empty

出错的原因是服务器的IP变更了

需要删除

appendonly.aof

dump.rdb

nodes.conf

删除后重建集群就可以了。

 

在创建集群时,一直等待节点加入,而且并不报错。

修改 redis 配置文件 redis.conf

bind 127.0.0.1 本机IP

修改成 bind 本机IP去掉 127.0.0.1

 

posted on 2019-03-09 17:25  自由港  阅读(1972)  评论(0编辑  收藏  举报