一、Redis集群
redis3.0之前提出的集群方案就是主从复制+哨兵机制。
redis3.0以后推出的redis cluster 集群方案,redis cluster集群保证了高可用、高性能、高可扩展性
二、Redis的集群策略
推特:twemproxy
豌豆荚:codis
官方:redis cluster--无中心化(在redis集群中没有主节点的概念,每个节点都存储了集群中所有节点的信息)
三、Redis-cluster架构图
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value
Redis 集群中内置了 16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使
用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间
的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点
(1)节点失效判断:集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过
(cluster-node-timeout),认为该master节点挂掉.
(2)集群失效判断:什么时候整个集群不可用(cluster_state:fail)
如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-
16383]slot映射不完全时进入fail状态。
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。
四、安装RedisCluster
规划 三台主服务器,三台从服务器
端口号分别为:7001~7006
第一步 创建7001实例
下载并解压
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxf redis-5.0.4.tar.gz
编译Redis源码
cd redis-5.0.4
make
安装Redis,需要通过PREFIX指定安装路径
make install PREFIX=/root/redis/server
复制redis.conf文件到安装redis安装bin目录下
cp /root/redis/redis-5.0.4/redis.conf /root/redis/server/bin/
说明:
/root/redis/redis-5.0.4/redis.conf 是redis下载解压目录
/root/redis/server/是redis安装目录
创建7001实例
cd /root/redis/server
cp /root/redis/server/bin/ 7001 -r
修改redis.conf配置文件
修改端口
# 将'daemonize'由'no'改为'yes'
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
# 是否开启保护模式,由yes该为no
protected-mode no
打开Cluster-enable yes
第二步 复制7001,创建7002~7006实例,注意端口修改
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7002 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7003 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7004 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7005 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7006 -r
[root@iz2zebb7s8ui8b5mmag51xz 7001]# vim redis.conf
其它依次修改
第三步:启动所有的实例
[root@iz2zebb7s8ui8b5mmag51xz 7006]# ./redis-server redis.conf
29407:C 14 May 2019 19:29:47.607 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29407:C 14 May 2019 19:29:47.607 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29407, just started
29407:C 14 May 2019 19:29:47.607 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7006]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7005
[root@iz2zebb7s8ui8b5mmag51xz 7005]# ./redis-server redis.conf
29412:C 14 May 2019 19:29:54.446 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29412:C 14 May 2019 19:29:54.446 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29412, just started
29412:C 14 May 2019 19:29:54.446 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7005]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7004
[root@iz2zebb7s8ui8b5mmag51xz 7004]# ./redis-server redis.conf
29417:C 14 May 2019 19:29:59.897 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29417:C 14 May 2019 19:29:59.897 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29417, just started
29417:C 14 May 2019 19:29:59.897 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7004]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7003
[root@iz2zebb7s8ui8b5mmag51xz 7003]# ./redis-server redis.conf
29427:C 14 May 2019 19:30:06.009 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29427:C 14 May 2019 19:30:06.009 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29427, just started
29427:C 14 May 2019 19:30:06.009 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7003]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7002
[root@iz2zebb7s8ui8b5mmag51xz 7002]# ./redis-server redis.conf
29432:C 14 May 2019 19:30:12.514 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29432:C 14 May 2019 19:30:12.514 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29432, just started
29432:C 14 May 2019 19:30:12.514 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7002]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7001
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-server redis.conf
29437:C 14 May 2019 19:30:18.562 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29437:C 14 May 2019 19:30:18.562 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29437, just started
29437:C 14 May 2019 19:30:18.562 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ps -ef |grep redis
root 29408 1 0 19:29 ? 00:00:00 ./redis-server *:7006 [cluster]
root 29413 1 0 19:29 ? 00:00:00 ./redis-server *:7005 [cluster]
root 29418 1 0 19:29 ? 00:00:00 ./redis-server *:7004 [cluster]
root 29428 1 0 19:30 ? 00:00:00 ./redis-server *:7003 [cluster]
root 29433 1 0 19:30 ? 00:00:00 ./redis-server *:7002 [cluster]
root 29438 1 0 19:30 ? 00:00:00 ./redis-server *:7001 [cluster]
root 29443 29320 0 19:30 pts/1 00:00:00 grep --color=auto redis
[root@iz2zebb7s8ui8b5mmag51xz 7001]#
第四步:创建Redis集群
./redis-cli --cluster create 39.97.176.160:7001 39.97.176.160:7002 39.97.176.160:7003 39.97.176.160:7004 39.97.176.160:7005 39.97.176.160:7006 --cluster-replicas 1
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-cli --cluster create 39.97.176.160:7001 39.97.176.160:7002 39.97.176.160:7003 39.97.176.160:7004 39.97.176.160:7005 39.97.176.160:7006 --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 39.97.176.160:7005 to 39.97.176.160:7001
Adding replica 39.97.176.160:7006 to 39.97.176.160:7002
Adding replica 39.97.176.160:7004 to 39.97.176.160:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e20b682825823693c10fa2e1c87b85b92f560de6 39.97.176.160:7001
slots:[0-5460] (5461 slots) master
M: 87f8def93d6538fca2997d65d07d1c4b50d95097 39.97.176.160:7002
slots:[5461-10922] (5462 slots) master
M: c45a571e45ab4df36afb3a0af065d9314515d790 39.97.176.160:7003
slots:[10923-16383] (5461 slots) master
S: 761d2853987f173b86a9d0520c6e71602fd96431 39.97.176.160:7004
replicates 87f8def93d6538fca2997d65d07d1c4b50d95097
S: 3453b40499555406ac2790360116e250e2c61256 39.97.176.160:7005
replicates c45a571e45ab4df36afb3a0af065d9314515d790
S: dcf036c9b1588ed708d87caec905a5e090376154 39.97.176.160:7006
replicates e20b682825823693c10fa2e1c87b85b92f560de6
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 39.97.176.160:7001)
M: e20b682825823693c10fa2e1c87b85b92f560de6 39.97.176.160:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
M: 87f8def93d6538fca2997d65d07d1c4b50d95097 39.97.176.160:7002
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 3453b40499555406ac2790360116e250e2c61256 39.97.176.160:7005
slots: (0 slots) slave
replicates c45a571e45ab4df36afb3a0af065d9314515d790
S: 761d2853987f173b86a9d0520c6e71602fd96431 39.97.176.160:7004
slots: (0 slots) slave
replicates 87f8def93d6538fca2997d65d07d1c4b50d95097
M: c45a571e45ab4df36afb3a0af065d9314515d790 39.97.176.160:7003
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: dcf036c9b1588ed708d87caec905a5e090376154 39.97.176.160:7006
slots: (0 slots) slave
replicates e20b682825823693c10fa2e1c87b85b92f560de6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@iz2zebb7s8ui8b5mmag51xz 7001]#
五、客户端连接集群
./redis-cli -p 7001 -c
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-cli -p 7001 -c
127.0.0.1:7001> set s1 111
-> Redirected to slot [15224] located at 39.97.176.160:7003
OK
39.97.176.160:7003> set s2 222
-> Redirected to slot [2843] located at 39.97.176.160:7001
OK
39.97.176.160:7001>
六.安装出现的问题
redis集群创建的时候,一直卡在Waiting for the cluster to join ....上、一直没有反应。
问题:
机器没有开放redis集群总线端口。
解决方法:
开放redis集群总线端口。
集群总线端口是redis客户端连接的端口+10000。
如:redis客户端端口是7001。
则:集群总线端口就是17001。
注意、所以redis集群机器都要放开对应的redis客户端端口和集群总线端口