介绍:
redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接,而且这些连接保持活跃,这样就保证了我们只需要连接集群中的任意一个节点,就可以获取到其他节点的数据。Redis 集群没有并使用传统的一致性哈希来分配数据,而是采用另外一种叫做哈希槽 (hash slot)的方式来分配的。redis cluster 默认分配了 16384 个slot,当我们set一个key 时,会用CRC16算法来取模得到所属的slot,然后将这个key 分到哈希槽区间的节点上,具体算法就是:CRC16(key) % 16384。
必须是3个主节点,否则会创建集群失败,假设三个节点分别**是:A, B, C 三个节点,它们可以是一台机器上的三个端口,也可以是三台不同的服务器。那么,采用哈希槽 (hash slot)的方式来分配16384个slot 的话,它们三个节点分别承担的slot 区间是:**
节点A覆盖0-5460;节点B覆盖5461-10922;节点C覆盖10923-16383.
redis-cluster主从模式:
redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。
上面那个例子里, 集群有ABC三个主节点, 如果这3个节点都没有加入从节点,如果B挂掉了,我们就无法访问整个集群了。A和C的slot也无法访问。
所以我们在集群建立的时候,一定要为每个主节点都添加了从节点, 比如像这样, 集群包含主节点A、B、C, 以及从节点A1、B1、C1, 那么即使B挂掉系统也可以继续正确工作。
B1节点替代了B节点,所以Redis集群将会选择B1节点作为新的主节点,集群将会继续正确地提供服务。 当B重新开启后,它就会变成B1的从节点。
不过需要注意,如果节点B和B1同时挂了,Redis集群就无法继续正确地提供服务了。
一、环境介绍:
1、系统:Centos7
2、redis版本:redis-3.2.8
3、ruby版本:2.5.1(Ruby版本必须在2.0.0之上)
4、此次测试实在一台物理机上开启6台redis节点,使用不同端口启动
二、部署redis
1、下载安装redis
wget http://download.redis.io/releases/redis-3.2.8.tar.gz (下载redis-3.2.8)
tar xzf redis-3.2.8.tar.gz && cd redis-3.2.8 && make && make install (编译安装)
cp src/redis-trib.rb /usr/local/bin
2、开始集群搭建,首先修改配置文件
vim redis.conf (修改如下内容)
port 7000 (如果在一台物理机开多台redis,注意每开一台端口要改变)
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
3、新建6个节点(注意:redis cluster要求至少6个节点,3主3备,否则勾践集群失败)
mkdir -pv /usr/local/redis-cluster{7000,7001,7002,7003,7004,7005}
cp redis.conf //usr/local/redis-cluster{7000,7001,7002,7003,7004,7005} (注意配置文件的端口)
redis-server redis.conf &
4、将6个节点加入集群使用create命令. –replicas 1 参数表示为每个主节点创建一个从节点. 其他参数是实例的地址集合。
(注意使用此命令需要ruby-2.2.2以上,Centos7的yum中ruby版本为ruby-2.0.0,所以要先升级ruby)
4.1、升级ruby为ruby-2.5.1
yum -y install ruby
gem sources -a http://mirrors.aliyun.com/rubygems/ (添加ruby仓库)
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB (安装RAM)
curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh (更新配置文件,使其立马生效)
rvm install 2.5 (安装ruby)
gem install redis (使ruby与redis做好连接)
4.2、将6个节点加入集群
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
5、检查节点状态
redis-trib.rb check 127.0.0.1:7000(显示如下内容则表创建成功)
Connecting to node 127.0.0.1:7000: OK
Connecting to node 127.0.0.1:7002: OK
Connecting to node 127.0.0.1:7004: OK
Connecting to node 127.0.0.1:7005: OK
Connecting to node 127.0.0.1:7001: OK
Connecting to node 127.0.0.1:7003: OK
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: be26c521481afcd6e739e2bfef69e9dcfb63d0a6 127.0.0.1:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 947cc4a9e890672cfad4806a5921e9f8bdf05c05 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 05ac96f9cdee679f98e8f7ce8e97cf1cbea608ca 127.0.0.1:7004
slots: (0 slots) slave
replicates ce06b13387702c3ee63e0118dd10c5f81a1285b5
S: b65f33d97416795226964aa22f3b4a8ac7366a99 127.0.0.1:7005
slots: (0 slots) slave
replicates 947cc4a9e890672cfad4806a5921e9f8bdf05c05
M: ce06b13387702c3ee63e0118dd10c5f81a1285b5 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 1da8a7f4c3cd5d7537e90e0ca5f4fb416f41a40c 127.0.0.1:7003
slots: (0 slots) slave
replicates be26c521481afcd6e739e2bfef69e9dcfb63d0a6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
6、测试
使用redis-cli工具,启动时加上“-c”参数
redis-cli -c -p 7003 (连接任意一个端口)
set my_name wind (设置一个值为“weind”)
这样随便,连接一个端口都可以get到my_name的值“wind”
