1、基本介绍

redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;
redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
那么如何判断集群是否挂了呢? 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? ->
因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。

2、下载Redis
https://redis.io/download

在Linux系统上使用wget下载,并解压

[root@master ~]# wget http://download.redis.io/releases/redis-5.0.8.tar.gz
[root@master ~]# tar -zxf redis-5.0.8.tar.gz

3、编译并安装
这里说明下,编译的时候要正确执行;否则后面的redis-server跑不起来
1)先确定是否已经安装了gcc

[root@master ~]# yum -y install gcc-c++
 1096  make && make PREFIX=/usr/local/redis install
[root@master ~]# cd /usr/local/redis-5.0.8/

## 编译
[root@master ~]#make && make PREFIX=/usr/local/redis install
  • &&连接两个命令,前面命令的返回值决定是否执行后面的命令
  • PREFIX(注意:大写)指定安装目录,若目录不存在,则自动创建
    4、 将 redis-trib.rb 复制到 /usr/local/bin 目录下
[root@master src]# pwd
/usr/local/redis/src
[root@master src]# cp redis-trib.rb /usr/local/bin/

5、创建redis节点(在/usr/local/redis 下创建redis_cluster 目录)

[root@master local]# cd redis/ 
[root@master redis]# mkdir redis_cluster

6、创建节点目录并将redis.conf文件复制到节点目录下

[root@master redis]# cd redis_cluster/
## 创建节点目录
[root@master redis_cluster]# mkdir 7000 7001 7002

拷贝 redis.conf文件复制到节点目录

[root@master redis]# cp redis.conf redis_cluster/7000
[root@master redis]# 
[root@master redis]# cp redis.conf redis_cluster/7001
[root@master redis]# 
[root@master redis]# cp redis.conf redis_cluster/7002

7、修改配置文件

port  7000                                        //端口7000,7002,7003        
bind 本机ip                                       //改为其他节点机器可访问的ip 可以使用ifconfig查看一下
daemonize    yes                               //redis后台运行
appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志
pidfile  /var/run/redis_7000.pid          //pidfile文件对应7000,7001,7002
cluster-enabled  yes                           //开启集群  
cluster-config-file  nodes_7000.conf   //集群的配置  配置文件首次启动自动生成 7000,7001,7002
cluster-node-timeout  15000                //请求超时  默认15秒,可自行修改

操作之后在另外一台机器重复该操作。
8、启动各个节点
先进入redis目录下的src目录

[root@slave src]# pwd
/usr/local/redis/src

然后再启动各个节点

[root@slave src]# ./redis-server /usr/local/redis-cluster/7003/redis.conf 
[root@slave src]# ./redis-server /usr/local/redis-cluster/7004/redis.conf 
[root@slave src]# ./redis-server /usr/local/redis-cluster/7003/redis.conf 
[root@slave src]# ./redis-server /usr/local/redis-cluster/7005/redis.conf

9、检查启动情况

[root@master src]# ps -ef |grep redis
root      24368      1  0 10:14 ?        00:00:00 ./redis-server 192.168.12.131:7000 [cluster]
root      24499      1  0 10:16 ?        00:00:00 ./redis-server 192.168.12.131:7001 [cluster]
root      24508      1  0 10:16 ?        00:00:00 ./redis-server 192.168.12.131:7002 [cluster]
root      24800   9721  0 10:22 pts/1    00:00:00 grep --color=auto redis
[root@master src]# netstat -tnlp | grep redis
tcp        0      0 192.168.12.131:17000    0.0.0.0:*               LISTEN      24368/./redis-serve 
tcp        0      0 192.168.12.131:17001    0.0.0.0:*               LISTEN      24499/./redis-serve 
tcp        0      0 192.168.12.131:17002    0.0.0.0:*               LISTEN      24508/./redis-serve 
tcp        0      0 192.168.12.131:7000     0.0.0.0:*               LISTEN      24368/./redis-serve 
tcp        0      0 192.168.12.131:7001     0.0.0.0:*               LISTEN      24499/./redis-serve 
tcp        0      0 192.168.12.131:7002     0.0.0.0:*               LISTEN      24508/./redis-serve

redis pipe集群 redis集群是ap还是cp_redis pipe集群


注意红色部分是总线ip稍后会给我们埋坑

10、安装ruby、 ruby-devel、 rubygems、 rpm-build

[root@master src]# yum -y install ruby
[root@master src]# yum -y install ruby-devel.x86_64 
[root@master src]# yum -y install rubygems-devel.noarch 
[root@master src]# yum -y install rpm-build

11、创建集群之前准备
目前新版本中redis-trib.rb已经被替代了,使用 redis-cli

[root@master local]# redis-cli --cluster create 192.168.12.131:7000 192.168.12.131:7001 192.168.12.131:7002 192.168.12.132:7003 192.168.12.132:7004 192.168.12.132:7005 --cluster-replicas 1            
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.12.132:7005 to 192.168.12.131:7000
Adding replica 192.168.12.131:7002 to 192.168.12.132:7003
Adding replica 192.168.12.132:7004 to 192.168.12.131:7001
M: 41e506dc1a6b601cd12066ebafaeda2c42c080b2 192.168.12.131:7000
   slots:[0-5460] (5461 slots) master
M: 7d2ec33244657dac342c491e1f9ef5386be6cd06 192.168.12.131:7001
   slots:[10923-16383] (5461 slots) master
S: c1afd0c5cb31a04daa52b2292910ee6317b8e01e 192.168.12.131:7002
   replicates 06710f5c0860d37f626bd62c078dcf5590788baa
M: 06710f5c0860d37f626bd62c078dcf5590788baa 192.168.12.132:7003
   slots:[5461-10922] (5462 slots) master
S: 3e8d6299910b61ce3fec770217aab859ce1b11fd 192.168.12.132:7004
   replicates 7d2ec33244657dac342c491e1f9ef5386be6cd06
S: a27d9b32bce57f4ad6db4583d0e2a2f408ab424e 192.168.12.132:7005
   replicates 41e506dc1a6b601cd12066ebafaeda2c42c080b2
Can I set the above configuration? (type 'yes' to accept): yes
>>> 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
...
>>> Performing Cluster Check (using node 192.168.12.131:7000)
M: 41e506dc1a6b601cd12066ebafaeda2c42c080b2 192.168.12.131:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 3e8d6299910b61ce3fec770217aab859ce1b11fd 192.168.12.132:7004
   slots: (0 slots) slave
   replicates 7d2ec33244657dac342c491e1f9ef5386be6cd06
M: 7d2ec33244657dac342c491e1f9ef5386be6cd06 192.168.12.131:7001
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: a27d9b32bce57f4ad6db4583d0e2a2f408ab424e 192.168.12.132:7005
   slots: (0 slots) slave
   replicates 41e506dc1a6b601cd12066ebafaeda2c42c080b2
M: 06710f5c0860d37f626bd62c078dcf5590788baa 192.168.12.132:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: c1afd0c5cb31a04daa52b2292910ee6317b8e01e 192.168.12.131:7002
   slots: (0 slots) slave
   replicates 06710f5c0860d37f626bd62c078dcf5590788baa
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@master local]#

此时集群已经创建成功!!!
测试链接

[root@master redis]# redis-cli -h 192.168.12.131 -c -p 7002 
192.168.12.131:7002> set redis cluster
-> Redirected to slot [1151] located at 192.168.12.131:7000
OK
192.168.12.131:7000> 
192.168.12.131:7000> get redis