redis 集群分为3种:主从复制、哨兵模式、cluster集群
本文使用的是cluster集群模式,优缺点可以自行查阅。
3台机器 每台机器上一个master(7001)一个slave(7002) ,一共3个master 3个slave
axe1(192.168.86.101) 7001(master) 7002(slave)
axe2(192.168.86.102) 7001(master) 7002(slave)
axe3(192.168.86.103) 7001(master) 7002(slave)
redis版本:最新的redis-5.0.5
在每个机器上都执行以下步骤
下载到/home/files目录下,安装到/usr/下
cd /home/files
wget http://download.redis.io/releases/redis-5.0.5.tar.gz
cp /home/files/redis-5.0.5.tar.gz /usr/
cd /usr
tar -zxvf redis-5.0.5.tar.gz
cd redis-5.0.5
make
如果没有gcc会报错,那么此时安装gcc
yum -y install gcc gcc-c++ kernel-devel
然后重新执行 make,完毕之后
[root@axe1 redis-5.0.5]# mkdir 17001
[root@axe1 redis-5.0.5]# mkdir 17002
#创建文件夹和配置文件
[root@axe1 redis-5.0.5]# cd 17001/
[root@axe1 17001]# cp ../redis.conf ../17001/17001redis.conf
[root@axe1 17001]# mkdir logs
[root@axe1 redis-5.0.5]# cd 17002/
[root@axe1 17002]# cp ../redis.conf ../17002/17002redis.conf
[root@axe1 17002]# mkdir logs
修改配置文件17001redis.conf和17002redis.conf配置文件,稍后在文末给出。
启动各个redis服务
开启端口,如果没有设置firewall,可以不进行开启端口的操作
#systemctl status firewalld
firewall-cmd --zone=public --add-port=17001/tcp --permanent
firewall-cmd --zone=public --add-port=17002/tcp --permanent
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --reload
注意,此处使用的端口是7001和7002
那么按照官网解释,在开启7001和7002的同时,redis同时会开启17001和17002端口供集群选举通信使用(CLUSTER MEET),即使用端口的大小加上10000(端口是XXXX,那么通信窗口是1XXXX)
#循环每个节点先启动17001
/usr/redis-5.0.5/src/redis-server /usr/redis-5.0.5/17001/17001redis.conf &
#17001启动完毕后,循环每个节点再启动17002
/usr/redis-5.0.5/src/redis-server /usr/redis-5.0.5/17002/17002redis.conf &
查看运行状态
[root@axe1 ~]# ps -ef|grep redis
root 19979 1 0 19:01 ? 00:00:00 /usr/redis-5.0.5/src/redis-server 0.0.0.0:17001 [cluster]
root 19993 1 0 19:02 ? 00:00:00 /usr/redis-5.0.5/src/redis-server 0.0.0.0:17002 [cluster]
root 19999 986 0 19:02 pts/0 00:00:00 grep --color=auto redis
所有节点的master和slave启动完毕后,直接创建集群:
在5.0之前的版本,使用的是ruby的redis-trib.rb进行创建启动集群,在5.0之后就不用了,直接使用redis-cli
#有密码
/usr/redis-5.0.5/src/redis-cli -a pwd@redis --cluster create 192.168.86.101:7001 192.168.86.102:7001 192.168.86.103:7001 192.168.86.101:7002 192.168.86.102:7002 192.168.86.103:7002 --cluster-replicas 1
#无密码
/usr/redis-5.0.5/src/redis-cli --cluster create 192.168.86.101:7001 192.168.86.102:7001 192.168.86.103:7001 192.168.86.101:7002 192.168.86.102:7002 192.168.86.103:7002 --cluster-replicas 1
#如果需要指定端口号 需要加上 -p xxxx
注意,不可以使用hostname进行启动,只能使用ip地址,如果使用hostname会报一下错误,redis会识别不出来
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli --cluster create axe1:17001 axe2:17001 axe3:17001 axe1:17002 axe2:17002 axe3:17002 --cluster-replicas 1
[ERR] Node axe1:17001 is not configured as a cluster node.
启动成功
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli -a pwd@redis --cluster create 192.168.86.101:7001 192.168.86.102:7001 192.168.86.103:7001 192.168.86.101:7002 192.168.86.102:7002 192.168.86.103:7002 --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> 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.86.102:7002 to 192.168.86.101:7001
Adding replica 192.168.86.103:7002 to 192.168.86.102:7001
Adding replica 192.168.86.101:7002 to 192.168.86.103:7001
M: 0d340d927aec46a68965f530e02723283924f139 192.168.86.101:7001
slots:[0-5460] (5461 slots) master
M: e8128103254836740bf14e4de8bf2de996f89fea 192.168.86.102:7001
slots:[5461-10922] (5462 slots) master
M: 8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4 192.168.86.103:7001
slots:[10923-16383] (5461 slots) master
S: 780c11bdad77c5c27c0766b7d5c22ec501ae3eb2 192.168.86.101:7002
replicates 8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4
S: 4eaa35eb64843307c72ee0cb660a73cb60af0406 192.168.86.102:7002
replicates 0d340d927aec46a68965f530e02723283924f139
S: 09238ec70f91fe129a832c500f409b28c79b6bbf 192.168.86.103:7002
replicates e8128103254836740bf14e4de8bf2de996f89fea
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.86.101:7001)
M: 0d340d927aec46a68965f530e02723283924f139 192.168.86.101:7001
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 780c11bdad77c5c27c0766b7d5c22ec501ae3eb2 192.168.86.101:7002
slots: (0 slots) slave
replicates 8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4
S: 09238ec70f91fe129a832c500f409b28c79b6bbf 192.168.86.103:7002
slots: (0 slots) slave
replicates e8128103254836740bf14e4de8bf2de996f89fea
M: 8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4 192.168.86.103:7001
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 4eaa35eb64843307c72ee0cb660a73cb60af0406 192.168.86.102:7002
slots: (0 slots) slave
replicates 0d340d927aec46a68965f530e02723283924f139
M: e8128103254836740bf14e4de8bf2de996f89fea 192.168.86.102:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
因为本文配置的bing的ip地址没有127.0.0.1,因此如果本机登录redis-cli客户端的话,会报错连接拒绝Connection refused
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli -p 7001
Could not connect to Redis at 127.0.0.1:7001: Connection refused
not connected>
所以怎么登录呢,可以使用axe1登录axe2,使用axe3登录axe1,换个机器就可以了
登录并新增数据
如果有密码,需要指定密码,否则会报错
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli -h axe2 -p 7001
axe2:7001> set 'testkey' 'testvalue'
(error) NOAUTH Authentication required.
此处使用密码登录axe2
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli -h axe2 -p 7001 -a pwd@redis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
axe2:7001> set 'testkey' 'testvalue'
(error) MOVED 4757 192.168.86.101:7001
axe2:7001>
报错是因为,当前的槽位(slot)是在axe1上,所以需要在axe1进行set get,但是axe1不能登录本机(没bind127.0.0.1),所以在axe2机器上登录axe1
[root@axe2 ~]# /usr/redis-5.0.5/src/redis-cli -h axe1 -p 7001 -a pwd@redis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
axe1:7001> set 'testkey' 'testvalue'
OK
axe1:7001> get 'testkey'
"testvalue"
同时可以在任意节点查看当前集群的信息和状态
axe1:7001> cluster nodes
780c11bdad77c5c27c0766b7d5c22ec501ae3eb2 192.168.86.101:7002@17002 slave 8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4 0 1561455953052 4 connected
09238ec70f91fe129a832c500f409b28c79b6bbf 192.168.86.103:7002@17002 slave e8128103254836740bf14e4de8bf2de996f89fea 0 1561455954062 6 connected
8c6bd94cc5766a6aa261c5d46e3d5fc60fe750a4 192.168.86.103:7001@17001 master - 0 1561455953000 3 connected 10923-16383
0d340d927aec46a68965f530e02723283924f139 192.168.86.101:7001@17001 myself,master - 0 1561455953000 1 connected 0-5460
4eaa35eb64843307c72ee0cb660a73cb60af0406 192.168.86.102:7002@17002 slave 0d340d927aec46a68965f530e02723283924f139 0 1561455953000 5 connected
e8128103254836740bf14e4de8bf2de996f89fea 192.168.86.102:7001@17001 master - 0 1561455955070 2 connected 5461-10922
axe1:7001> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1888
cluster_stats_messages_pong_sent:1920
cluster_stats_messages_sent:3808
cluster_stats_messages_ping_received:1915
cluster_stats_messages_pong_received:1888
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3808
axe1:7001>
此时,集群已经创建启动完毕。
接下来看配置文件,先看说明,文件在最后
那么在配置文件中,大部分几乎都可以使用默认配置,一下几点需要做修改
port 7002:每个节点绑定的端口号
bind:配置绑定本机的ip(axe1的是192.168.86.101,axe2的是192.168.86.102,axe3的是192.168.86.103)
protected-mode no:关闭保护模式
cluster-enabled yes:开启集群模式,如果是no,那么每个节点都是单独运行的,毫无关联关系
cluster-config-file /usr/redis-5.0.5/17002/nodes-17002.conf:这个是集群启动后记录的各个节点的信息,自动生成的,无需手动创建,只需要指定一个文件名就可以了,同时需要指定路径,每个节点的这个文件的路径都不能重复
cluster-node-timeout 5000:超时时间
pidfile /usr/redis-5.0.5/17001/redis_17001.pid :每个节点运行的进程id文件,需要指定唯一的路径和文件名,每个节点不能重复
logfile /usr/redis-5.0.5/17001/logs/redis.log :每个节点的日志文件,需要指定唯一的路径和文件名,每个节点不能重复
dir /usr/redis-5.0.5/17001:每个节点的rdb数据文件的存储目录,需要指定唯一的路径和文件名,每个节点不能重复
daemonize yes:后台模式启动
timeout:这个配置必须设置成0,否则会报错:Failed to send CLUSTER MEET command。这个问题我处理了一天,CLUSTER MEET的作用都查了个遍,最后出在timeout上。
[root@axe1 ~]# /usr/redis-5.0.5/src/redis-cli -a pwd@redis --cluster create 192.168.86.101:7001 192.168.86.102:7001 192.168.86.103:7001 192.168.86.101:7002 192.168.86.102:7002 192.168.86.103:7002 --cluster -replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> 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.86.102:7002 to 192.168.86.101:7001
Adding replica 192.168.86.103:7002 to 192.168.86.102:7001
Adding replica 192.168.86.101:7002 to 192.168.86.103:7001
M: d002a6da938782f9fd767df7d562fa03958bb738 192.168.86.101:7001
slots:[0-5460] (5461 slots) master
M: 0c83e15247182aae7a8ecc3fcdd1fad93ccf235d 192.168.86.102:7001
slots:[5461-10922] (5462 slots) master
M: cde83649adffc986916a8b6bf6d76c6b6c6a0fde 192.168.86.103:7001
slots:[10923-16383] (5461 slots) master
S: 3633747cb6613d50b6bb824664fb3d7f6fddd9cb 192.168.86.101:7002
replicates cde83649adffc986916a8b6bf6d76c6b6c6a0fde
S: a139d0669969ef70c9cdaac293ee510cc6abb66b 192.168.86.102:7002
replicates d002a6da938782f9fd767df7d562fa03958bb738
S: 29137268085bd0dd2c8de849f0649d69bb735f27 192.168.86.103:7002
replicates 0c83e15247182aae7a8ecc3fcdd1fad93ccf235d
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
Failed to send CLUSTER MEET command.
#每台机器需要bind当前机器的ip
bind 192.168.86.101
port 7001
tcp-backlog 511
daemonize yes
supervised no
pidfile /usr/redis-5.0.5/17001/redis_17001.pid
loglevel notice
logfile /usr/redis-5.0.5/17001/logs/redis.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/redis-5.0.5/17001
masterauth pwd@redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass pwd@redis
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file /usr/redis-5.0.5/17001/nodes-17001.conf
cluster-node-timeout 15000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
#每台机器需要bind当前机器的ip
bind 192.168.86.101
port 7002
tcp-backlog 511
daemonize yes
supervised no
pidfile /usr/redis-5.0.5/17002/redis_17002.pid
loglevel notice
logfile /usr/redis-5.0.5/17002/logs/redis.log
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/redis-5.0.5/17002
masterauth pwd@redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass pwd@redis
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file /usr/redis-5.0.5/17002/nodes-17002.conf
cluster-node-timeout 15000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
完毕,有帮助可以点赞,有疑问可以评论下