Reids 服务集群模式可分为主从、哨兵、Cluster 模式。本博客次要介绍主从和 Cluster 模式
三种集群模式简介
主从模式
:主从模式是三种模式中最简略的,个别有一个master
服务和多个 (至多一个)slave
服务组成。次要实现读写拆散,加重单 Redis 服务压力。master
负责写数据,而后将数据 copy 给 slave
,slave
服务负责读数据。
哨兵模式
:主从模式有个弊病,就是一旦master
服务挂掉,Redis 服务就无奈再写入数据,slave
并不会降级为 master
。于是须要另外一种类型的服务Sentinel
(哨兵)。Sentinel
次要负责 监控
、 告诉
、 主动故障转移
、 配置提供者
。简略来说就是,Sentinel
能够监督数据节点 (master
和slave
)衰弱状态,并告诉 DBA(数据库管理人员),如果 master
挂了,从泛滥 slave
中选举一个新的 master
,并且通知客户端(cli) 数据节点的信息。
Cluster
:哨兵模式尽管相较于主从模式来说,友善了很多,然而 master
不好做负载,并且贮存受单机限度,还引入了另外一种类型的服务,有些繁琐。于是乎,Cluster
就来了,通常具备 高可用、可扩展性、分布式、容错 等个性。当然,Cluster
和 哨兵模式
没有明确的谁好谁坏,还是要看本人的需要的。个别分布式,应用 Cluster
好一些。
主从模式
在搭建 主从模式
和Cluster
之前,我默认你会装置单机的 redis,并且你的环境是 Linux(CentOS7),你的 Redis 版本是 5.0.9。如果不会单机 redis 装置,请戳。
首先将原生的 redis.conf
复制两份到 /usr/local
门路下:
cp redis.conf /usr/local/redis_master.conf
cp redis.conf /usr/local/redis_replic.conf
而后利用 vim
批改两个配置文件,批改主要参数如下:
redis_master.conf
# 主机地址,默认是 127.0.0.1,批改成 0.0.0.0
bind 0.0.0.0
# 端口
port 16379
# 是否开启为守护线程,默认是 no,改成 yes
daemonize yes
# 指定 redis 过程的 PID 文件寄存地位 给文件重命名
pidfile /var/run/redis_16379.pid
# 日志寄存地位 给文件重命名
logfile /var/log/redis_16379.log
# rdb 模式长久化快照
dbfilename dump-16379.rdb
# 长久化文件寄存地位
dir ./redis-workir
# redis 连贯明码
requirepass 123456
# 连贯主服务器的明码,这里能够省略
masterauth 123456
redis_replic.conf
# 主机地址,默认是 127.0.0.1,批改成 0.0.0.0
bind 0.0.0.0
# 端口
port 26379
# 是否开启为守护线程,默认是 no,改成 yes
daemonize yes
# 指定 redis 过程的 PID 文件寄存地位 给文件重命名
pidfile /var/run/redis_26379.pid
# 日志寄存地位 给文件重命名
logfile /var/log/redis_26379.log
# rdb 模式长久化快照
dbfilename dump-26379.rdb
# 长久化文件寄存地位
dir ./redis-workir
# redis 连贯明码
requirepass 123456
# 连贯主服务器的明码
masterauth 123456
# 本复制节点的主节点地址
replicaof 你服务器外网 ip 16379
下面留神,在之前的版本 replicaof
叫做 slaveof
。这里,咱们模拟有两台主机,所以主机 ip 不写127.0.0.1
了,写你服务器外网的 ip,前面也不便说下网关的问题。而后开启两个服务。
redis-server /usr/local/redis_master.conf
redis-server /usr/local/redis_replic.conf
此时查看两个服务日志,都成长启动了。然而此时 master,写数据,slave
无奈复制数据,查看日志报错
Error condition on socket for SYNC: No route to host
这边须要关上服务器的防火墙,用到iptables
,装置请移步我上篇博客(请戳)。
iptables -I INPUT -p tcp -m tcp --dport 16379 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 26379 -j ACCEPT
service iptables save
# 查看一下
iptables -L -n -v
# 确实裸露进来这两个端口了
66 3528 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:26379
196K 17M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:16379
而后应用一下
[root@VM_0_10_centos ~]# redis-cli -h 127.0.0.1 -p 16379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:16379> set today 1106
OK
127.0.0.1:16379>
[root@VM_0_10_centos ~]# redis-cli -h 127.0.0.1 -p 26379 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:26379> get today
"1106"
Cluster 模式
首先咱们创立一个文件夹 /usr/local/redis-cluster
。并在它上面创立log
、data
、conf
,并在data
文件中创立不同服务的文件夹。根本就是 cd
到地位,而后应用mkdir
,比较简单,就看下目录构造吧
[root@VM_0_10_centos redis-cluster]# tree -d
.
|-- conf
|-- data
| |-- redis-6378
| |-- redis-6380
| |-- redis-6381
| |-- redis-6389
| |-- redis-6390
| |-- redis-6391
`-- log
而后在 conf
文件下创立这几个服务的配置文件,这几个文件,一摸一样 ,只须要要害地位替换端口号就好了,你懂的,上面以6378 为例。
cd /usr/local/redis-cluster/conf
# copy 一份原始文件过去
cp /usr/local/redis.conf /usr/local/redis-cluster/conf/redis-6378.conf
vim redis-6378.conf
批改要害配置如下,其余默认不变
redis-6378.conf
# 主机地址,默认是 127.0.0.1,批改成 0.0.0.0
bind 0.0.0.0
# 端口
port 6378
# 是否开启为守护线程,默认是 no,改成 yes
daemonize yes
# 指定 redis 过程的 PID 文件寄存地位 给文件重命名
pidfile /var/run/redis-cluster/redis-6378.pid
# 日志寄存地位 给文件重命名
logfile /usr/local/redis-cluster/log/redis-6378.log
# rdb 模式长久化快照
dbfilename dump-6378.rdb
# 长久化文件寄存地位
dir /usr/local/redis-cluster/data/redis-6378
# redis 连贯明码
requirepass 123456
# 连贯主服务器的明码
masterauth 123456
# 开启 AOF 长久化模式
appendonly yes
# 开启 cluster 集群模式
cluster-enabled yes
# 集群的配置,配置文件首次启动主动生成
cluster-config-file /usr/local/redis-cluster/conf/node-6378.conf
# 申请超时,默认的就好
cluster-node-timeout 15000
cluster-enabled
开启 cluster
集群模式,appendonly
开启 AOF 长久化模式,一种实时性比 RDB
模式更好的长久化模式。生成的 aof
格式文件也在 dir
门路下,并且被读进内存的优先级比 dump-6378.rdb
文件要高。cluster-config-file
是寄存集群配置文件的中央,主动生成。同样的配置,将端口号换成其余五个,生成redis-6380.conf
、redis-6381.conf
、redis-6389.conf
、redis-6390.conf
、redis-6391.conf
。而后开启这些服务。
redis-server redis-6378.conf
redis-server redis-6380.conf
redis-server redis-6381.conf
redis-server redis-6389.conf
redis-server redis-6390.conf
redis-server redis-6391.conf
# 查看下是否开启
ps -ef | grep redis
# 过程已存在
root 3009 1 0 Nov05 ? 00:01:49 redis-server 0.0.0.0:6378 [cluster]
root 3047 1 0 Nov05 ? 00:01:47 redis-server 0.0.0.0:6381 [cluster]
root 3056 1 0 Nov05 ? 00:01:50 redis-server 0.0.0.0:6389 [cluster]
root 3073 1 0 Nov05 ? 00:01:49 redis-server 0.0.0.0:6390 [cluster]
root 3083 1 0 Nov05 ? 00:01:50 redis-server 0.0.0.0:6391 [cluster]
root 26443 1 0 Nov05 ? 00:01:39 redis-server 0.0.0.0:6380 [cluster]
留神,它们前面都显示它们是以 cluster
集群模式开启的。上面开启集群,如果是 redis5.0 以前的版本,须要下载 ruby,通过 ruby 开启,redis5.0 当前可间接开启,命令如下:
# 开启集群
redis-cli -a 123456--cluster create 127.0.0.1:6378 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.0.0.1:6391 --cluster-replicas 1
# 会多一步询问,输出 yes 即可
Can I set the above configuration? (type 'yes' to accept): yes
#开启代理防火墙
iptables -I INPUT -p tcp -m tcp --dport 6378 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 6380 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 6381 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 6389 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 6390 -j ACCEPT
iptables -I INPUT -p tcp -m tcp --dport 6391 -j ACCEPT
service iptables save
开启集群的命令,会主动生成主从关系,调配solt
,终端会询问这种调配形式 ok 吗?如果操作者感觉能够的话,须要输出yes
。用 cli 形式轻易连贯一个 redis 服务。
redis-cli -c -h 127.0.0.1 -p 6378 -a 123456
127.0.0.1:6378> CLUSTER INFO
# 此处省略一些信息
127.0.0.1:6378> CLUSTER NODES
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604672507350 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604672504000 1 connected 0-5460
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604672505000 8 connected 5461-10922
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604672505347 8 connected
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604672506000 3 connected 10923-16383
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 slave 1efc0139a5422c68f1c43428d1d6f566ce361fed 0 1604672504344 6 connected
能够看出 6378
、6389
、6381
是master
节点,别离管理卡槽 0-5460
、5461-10922
、10923-16383
。并且能够依据 id 值,判断出三个slave
节点的主节点是谁,例如 6390
主节点 id 值是 ca998854f1d96e2b64b7304aea5e5b4c96a9d85a
,所以就是6381
了。
这里须要阐明一下,当咱们存值的时候,key 会依据 hash 函数计算出来,落在那个卡槽上。
127.0.0.1:6378> set haha 123
OK
127.0.0.1:6378> set name pjjlt
-> Redirected to slot [5798] located at 127.0.0.1:6389
OK
127.0.0.1:6389>
能够看进去,haha 通过 hash 运算,落在的卡槽在 0 -5460 范畴内,name 通过 hash 运算,落在的卡槽在 5461-10922 范畴内,所以服务终端也主动重定向到 6389 服务上。get 也会导致服务终端重定向。
127.0.0.1:6389> get name
"pjjlt"
127.0.0.1:6389> get haha
-> Redirected to slot [3662] located at 127.0.0.1:6378
"123"
127.0.0.1:6378>
减少和移除节点
cluster 集群能够敌对的程度拓展。上面减少两个节点,同下面一样,减少配置文件redis-6395.conf
、redis-6396.conf
,并开启这两个服务
redis-server redis-6395.conf
redis-server redis-6396.conf
退出集群
# 轻易连贯一个服务
redis-cli -c -h 127.0.0.1 -p 6378 -a 123456
# 退出集群
CLUSTER MEET 127.0.0.1 6395
CLUSTER MEET 127.0.0.1 6395
# 查看状态
CLUSTER NODES
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604673986000 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604673985000 1 connected 0-5460
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604673985000 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604673988720 8 connected 5461-10922
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604673987717 8 connected
f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 master - 0 1604673987517 7 connected
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604673986000 3 connected 10923-16383
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 slave 1efc0139a5422c68f1c43428d1d6f566ce361fed 0 1604673986716 6 connected
能够看出,此时退出的两个节点全都是 master
服务,当初将 6396 设置成 6395 的 slave 节点。
redis-cli -c -h 127.0.0.1 -p 6396 -a 123456 cluster replicate 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e
# 轻易连贯一个服务
redis-cli -c -h 127.0.0.1 -p 6378 -a 123456
CLUSTER NODES
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604673986000 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604673985000 1 connected 0-5460
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604673985000 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604673988720 8 connected 5461-10922
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604673987717 8 connected
f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604673987517 7 connected
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604673986000 3 connected 10923-16383
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 slave 1efc0139a5422c68f1c43428d1d6f566ce361fed 0 1604673986716 6 connected
能够看出,此时 6396 节点曾经变成了 6395 的 slave 节点了。
移除集群
规定: 不能移除登录节点,不能移除本人的 master 节点。能够删除其余的 master 或者 slave 节点
# 依据下面能够看出 1efc0139a5422c68f1c43428d1d6f566ce361fed 就是 6378 节点
127.0.0.1:6378> CLUSTER FORGET 1efc0139a5422c68f1c43428d1d6f566ce361fed
(error) ERR I tried hard but I can't forget myself...
# 登录 6378 的 slave 节点 6391,删除 6378,失败。[root@VM_0_10_centos conf]# redis-cli -c -h 127.0.0.1 -p 6391 -a pjjlt1126
127.0.0.1:6391> CLUSTER FORGET 1efc0139a5422c68f1c43428d1d6f566ce361fed
(error) ERR Can't forget my master!
# 将刚退出的节点 6396
127.0.0.1:6378> CLUSTER FORGET f8c884f07375cb524236341c4fcb963f58f82622
OK
127.0.0.1:6378> CLUSTER NODES
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675461284 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604675460000 1 connected 0-5460
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675460283 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675462284 8 connected 5461-10922
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675462000 8 connected
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675460000 3 connected 10923-16383
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 slave 1efc0139a5422c68f1c43428d1d6f566ce361fed 0 1604675463287 6 connected
发现移除了,因为 node.conf 文件还存在 (cluster-config-file
配置的那个文件),还能够复原移除
# 复原移除
127.0.0.1:6378> CLUSTER SAVECONFIG
OK
# 发现 6396 它又回来了
127.0.0.1:6378> CLUSTER NODES
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675573000 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604675569000 1 connected 0-5460
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675572000 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675572000 8 connected 5461-10922
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675571000 8 connected
f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675572509 7 connected
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675574514 3 connected 10923-16383
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 slave 1efc0139a5422c68f1c43428d1d6f566ce361fed 0 1604675573511 6 connected
模仿宕机
首先说 一个坑:在 cluster 集群模式下,不能间接 kill -9 某个节点,只能用 kill(当然模仿宕机咱们用的是 CLUSTER FORGET 命令)。kill -9,再重启集群的时候会报错,须要删除 pidfile、data、log 等等一些货色,能力重启集群胜利,所以尽量不要 kill -9。
间接 kill 6378 试试
[root@VM_0_10_centos conf]# redis-cli -c -h 127.0.0.1 -p 6391 -a 123456
127.0.0.1:6391> CLUSTER NODES
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 myself,master - 0 1604675774000 9 connected 0-5460
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675779737 3 connected 10923-16383
f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675778000 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675777000 8 connected 5461-10922
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675776000 7 connected
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675779000 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 master,fail - 1604675757260 1604675756000 1 disconnected
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675778000 8 connected
发现此时 6378 为master,fail
,而它原来的 slave 节点为master
。再重启 6378 节点看看。
[root@VM_0_10_centos conf]# redis-server redis-6378.conf
[root@VM_0_10_centos conf]# redis-cli -c -h 127.0.0.1 -p 6391 -a 123456
127.0.0.1:6391> CLUSTER NODES
0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 myself,master - 0 1604675996000 9 connected 0-5460
ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675993000 3 connected 10923-16383
f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675992368 7 connected
f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675997000 8 connected 5461-10922
2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675996376 7 connected
114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675997376 5 connected
1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 slave 0f75c7f994a43551671e955a9f72c28a9c6edb56 0 1604675995000 9 connected
e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675998378 8 connected
发现此时原来的 master
节点 6378 变成了 6391 的 slave
节点了。
然而,只有当 master 节点有 slot 卡槽的时候,才会呈现主从节点转化,当 master 节点没有卡槽时,不会进行转化。例如,删除 6395,再重启,发现 6395 还是master
,6396 还是slave
。
另外,下面提到的 node.conf,不仅能够帮忙移除复原(CLUSTER SAVECONFIG),还能够记录刚刚的CLUSTER
指令日志。
以上,就是 cluster 模式
的搭建介绍,谢谢观看。