关于redis:那些年我们用过的RedisRedis集群搭建原来这么简单

24次阅读

共计 13327 个字符,预计需要花费 34 分钟才能阅读完成。

Reids 服务集群模式可分为主从、哨兵、Cluster 模式。本博客次要介绍主从和 Cluster 模式

三种集群模式简介

主从模式 :主从模式是三种模式中最简略的,个别有一个master 服务和多个 (至多一个)slave 服务组成。次要实现读写拆散,加重单 Redis 服务压力。master负责写数据,而后将数据 copy 给 slaveslave 服务负责读数据。

哨兵模式 :主从模式有个弊病,就是一旦master 服务挂掉,Redis 服务就无奈再写入数据,slave并不会降级为 master。于是须要另外一种类型的服务Sentinel(哨兵)。Sentinel 次要负责 监控 告诉 主动故障转移 配置提供者 。简略来说就是,Sentinel 能够监督数据节点 (masterslave)衰弱状态,并告诉 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。并在它上面创立logdataconf,并在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

能够看出 637863896381master节点,别离管理卡槽 0-54605461-1092210923-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.confredis-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 模式 的搭建介绍,谢谢观看。

正文完
 0