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
注意红色部分是总线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