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.confcp redis.conf /usr/local/redis_replic.conf

而后利用vim批改两个配置文件,批改主要参数如下:
redis_master.conf

# 主机地址,默认是127.0.0.1,批改成0.0.0.0bind 0.0.0.0# 端口port 16379# 是否开启为守护线程,默认是no,改成yesdaemonize 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.0bind 0.0.0.0# 端口port 26379# 是否开启为守护线程,默认是no,改成yesdaemonize 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.confredis-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 ACCEPTiptables -I INPUT -p tcp -m tcp --dport 26379 -j ACCEPTservice 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 123456Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:16379> set today 1106OK127.0.0.1:16379> [root@VM_0_10_centos ~]# redis-cli -h 127.0.0.1 -p 26379 -a 123456Warning: 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.confvim redis-6378.conf

批改要害配置如下,其余默认不变
redis-6378.conf

# 主机地址,默认是127.0.0.1,批改成0.0.0.0bind 0.0.0.0# 端口port 6378# 是否开启为守护线程,默认是no,改成yesdaemonize 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 ACCEPTiptables -I INPUT -p tcp -m tcp --dport 6380 -j ACCEPTiptables -I INPUT -p tcp -m tcp --dport 6381 -j ACCEPTiptables -I INPUT -p tcp -m tcp --dport 6389 -j ACCEPTiptables -I INPUT -p tcp -m tcp --dport 6390 -j ACCEPTiptables -I INPUT -p tcp -m tcp --dport 6391 -j ACCEPTservice iptables save

开启集群的命令,会主动生成主从关系,调配solt,终端会询问这种调配形式ok吗?如果操作者感觉能够的话,须要输出yes。用cli形式轻易连贯一个redis服务。

redis-cli -c -h 127.0.0.1 -p 6378 -a 123456127.0.0.1:6378> CLUSTER INFO# 此处省略一些信息127.0.0.1:6378> CLUSTER NODES114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604672507350 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604672504000 1 connected 0-5460f10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604672505000 8 connected 5461-10922e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604672505347 8 connectedca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604672506000 3 connected 10923-163830f75c7f994a43551671e955a9f72c28a9c6edb56 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 123OK127.0.0.1:6378> set name pjjlt-> Redirected to slot [5798] located at 127.0.0.1:6389OK127.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 6395CLUSTER MEET 127.0.0.1 6395# 查看状态CLUSTER NODES114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604673986000 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604673985000 1 connected 0-54602eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604673985000 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604673988720 8 connected 5461-10922e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604673987717 8 connectedf8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 master - 0 1604673987517 7 connectedca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604673986000 3 connected 10923-163830f75c7f994a43551671e955a9f72c28a9c6edb56 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 123456CLUSTER NODES114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604673986000 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604673985000 1 connected 0-54602eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604673985000 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604673988720 8 connected 5461-10922e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604673987717 8 connectedf8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604673987517 7 connectedca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604673986000 3 connected 10923-163830f75c7f994a43551671e955a9f72c28a9c6edb56 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 pjjlt1126127.0.0.1:6391> CLUSTER FORGET 1efc0139a5422c68f1c43428d1d6f566ce361fed(error) ERR Can't forget my master!# 将刚退出的节点 6396127.0.0.1:6378> CLUSTER FORGET f8c884f07375cb524236341c4fcb963f58f82622OK127.0.0.1:6378> CLUSTER NODES114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675461284 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604675460000 1 connected 0-54602eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675460283 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675462284 8 connected 5461-10922e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675462000 8 connectedca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675460000 3 connected 10923-163830f75c7f994a43551671e955a9f72c28a9c6edb56 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 NODES114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675573000 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 myself,master - 0 1604675569000 1 connected 0-54602eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675572000 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675572000 8 connected 5461-10922e1eb98ead97d9b22fe4538601cbcd193e998baad 127.0.0.1:6380@16380 slave f10fc263b1b887fe175307b2fb7600370d39c0e1 0 1604675571000 8 connectedf8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675572509 7 connectedca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675574514 3 connected 10923-163830f75c7f994a43551671e955a9f72c28a9c6edb56 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 123456127.0.0.1:6391> CLUSTER NODES0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 myself,master - 0 1604675774000 9 connected 0-5460ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675779737 3 connected 10923-16383f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675778000 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675777000 8 connected 5461-109222eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675776000 7 connected114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675779000 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 master,fail - 1604675757260 1604675756000 1 disconnectede1eb98ead97d9b22fe4538601cbcd193e998baad 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 123456127.0.0.1:6391> CLUSTER NODES0f75c7f994a43551671e955a9f72c28a9c6edb56 127.0.0.1:6391@16391 myself,master - 0 1604675996000 9 connected 0-5460ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 127.0.0.1:6381@16381 master - 0 1604675993000 3 connected 10923-16383f8c884f07375cb524236341c4fcb963f58f82622 127.0.0.1:6396@16396 slave 2eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 0 1604675992368 7 connectedf10fc263b1b887fe175307b2fb7600370d39c0e1 127.0.0.1:6389@16389 master - 0 1604675997000 8 connected 5461-109222eefbdc56047282fc80baf3cc7bc08ff86dbdf9e 127.0.0.1:6395@16395 master - 0 1604675996376 7 connected114d082bb43c67042c806e0060f5fb8157736b98 127.0.0.1:6390@16390 slave ca998854f1d96e2b64b7304aea5e5b4c96a9d85a 0 1604675997376 5 connected1efc0139a5422c68f1c43428d1d6f566ce361fed 127.0.0.1:6378@16378 slave 0f75c7f994a43551671e955a9f72c28a9c6edb56 0 1604675995000 9 connectede1eb98ead97d9b22fe4538601cbcd193e998baad 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模式的搭建介绍,谢谢观看。