Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云防火墙,500元 1000GB
简介: Redis进阶-5.x 单节点 及Redis Cluster 3主3从集群部署


Redis 下载地址

下载地址: http://redis.io/download

历史版本: http://download.redis.io/releases/


之前装过4.0.11 ----> Redis-02Redis在linux下的安装及常见问题


Redis 5.x 单节点 编译安装

第一步 : 安装gcc 5.0.3 只需要依赖gcc即可。

# 安装gcc
yum install gcc

第二步 下载、解压、编译安装

[root@artisan ~]# wget http://download.redis.io/releases/redis-5.0.3.tar.gz
[root@artisan ~]# tar -xvzf redis-5.0.3.tar.gz 
[root@artisan ~]# cd redis-5.0.3
[root@artisan redis-5.0.3]# make 
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/home/redis/redis-5.0.3/src'

如果你要make test (可选),有报错的话 ,安装下tcl依赖包,执行如下命令

yum install tcl tcl-devel -y

再重新执行

[redis@artisan src]$ make test
....
....
....
 282 seconds - unit/obuf-limits
\o/ All tests passed without errors!

为了方便维护,建议启动脚本放到bin , 配置文件放到etc, 数据文件放到data,日志放到log目录… (可选)

[redis@artisan redis-5.0.3]$ 
[redis@artisan redis-5.0.3]$ mkdir etc
[redis@artisan redis-5.0.3]$ mkdir bin
[redis@artisan redis-5.0.3]$ mkdir data
[redis@artisan redis-5.0.3]$ mkdir log
[redis@artisan redis-5.0.3]$ mv redis.conf etc/      
[redis@artisan redis-5.0.3]$ mv sentinel.conf etc/
[redis@artisan redis-5.0.3]$ 
[redis@artisan redis-5.0.3]$ cd src/
[redis@artisan src]$ mv mkreleasehdr.sh  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server  redis-trib.rb ../bin

整理完成后 如下

这里我们把redis安装到redis用户下(建议)


Redis 启停

通过配置文件来启动(建议)

redis‐server redis.conf

停止Redis

pkill redis‐server
kill 进程号
redis‐cli shutdown (建议)

Redis Cluster 4.x VS Redis Cluster 5.x

Redis 5.0以前的版本 部署Redis Cluster 需要ruby脚本。 Redis 5.0以后的版本 直接使用 redis 官方提供的 redis cli即可完成集群的部署。

4.x版本的搭建请移步: Redis-21Redis集群模式-Centos6.5上3台主机3主3从的配置及通过代码访问集群

这里我们讨论5.x版本的集群部署


演进之路 ( Master/Slave— > Sentinel-----> Cluster )

主从 — > 哨兵 -----> Cluster

粗略的说下

2.8以前 ,Redis官方并没有高可用框架, 主从模式的弊端非常明显,从节点仅能作为数据备份,无法做到高可用,当主节点宕机以后,需要手动切换. 或者依赖第三方的框架,比如codis 等等

2.8 官方给出了 Sentinel模式,解决了主节点宕机,从节点自动提升并接管集群的功能

哨兵模式下,是中心化的,主节点的压力大时,节点无法扩容

3.0 官方提供了Cluster模式,这样数据就分片存储,节点可扩容,这行一个节点写的压力就小了很多~


Sentinel VS Cluster

这里我们重点比对 Sentinel VS Cluster

哨兵模式Sentinel

redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master.

  1. 在主从切换的瞬间存在访问瞬断的情况,
  2. 哨兵模式只有一个主节点对外提供服务,没法支持很高的并发
  3. 单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率

集群模式Cluster

redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性.

Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能 .

需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。

redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单.


Redis 5.x Cluster 搭建

PreView

redis集群需要至少要三个master节点.

我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,3主3从,共6个redis节点。

虚拟机紧张,这里用三台机器部署6个redis实例

ip ---------------------------- port

192.168.18.131 ---- 8001 | 8004

192.168.18.132 ---- 8002 | 8005

192.168.18.133 ---- 8003 | 8006


Step1 安装单节点的redis

首先131 132 133 上按照 上面 Redis 5.x 单节点 编译安装 部署好 。


Step2 编写redis cluster的配置文件

为了方便管理,我们 新建个目录 redis-cluster , 在该目录下 建立 之前规划好的几个端口

3台主机都要操作 ,如下

130主机的操作

把 redis-5.0.3 中 etc目录下的 redis.conf配置文件copy到8001 目录

[redis@artisan ~]$ ls
redis-5.0.3  redis-5.0.3.tar.gz  redis-cluster
[redis@artisan ~]$ cp redis-5.0.3/etc/redis.conf  ./redis-cluster/8001
[redis@artisan ~]$ cd ./redis-cluster/8001
[redis@artisan 8001]$ ls
redis.conf
[redis@artisan 8001]$ 

修改内容如下:

  1. daemonize yes
  2. port 8001(分别对每个机器的端口号进行设置)
  3. dir /usr/local/redis‐cluster/8001/(指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据)
  4. cluster‐enabled yes(启动集群模式)
  5. cluster‐config‐file nodes‐8001.conf(集群节点信息文件,这里800x最好和port对应上)
  6. cluster‐node‐timeout 5000
  7. # bind 127.0.0.1(去掉bind绑定访问ip信息)
  8. protected‐mode no (关闭保护模式)
  9. appendonly yes

如果要设置密码需要增加如下配置

  1. requirepass artisan(设置redis访问密码)
  2. masterauth artisan(设置集群节点间访问密码,跟上面一致)
    这俩参数都要配置。

把修改后的配置文件,copy到8004,修改第2、3、5项里的端口号,批量替换

sed -i s/8001/8004/g redis.conf 

Step3 其余两台重复第一台的操作

另外两台机器也需要做上面几步操作

第二台机器用8002和8005

第三台机器用8003和8006

[redis@artisan 8004]$ sed -i s/8001/8004/g redis.conf


Step4 启动6个实例

分别启动6个redis实例,然后检查是否启动成功


Step5 用redis‐cli创建整个redis集群

redis5以前的版本集群是依靠ruby脚本redis‐trib.rb实现 . 5.0以后的版本直接使用redi-cli即可。

redis-cli的帮助命令

[redis@artisan bin]$ ./redis-cli --help

集群的帮助命令

[redis@artisan bin]$ ./redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
[redis@artisan bin]$ 

下面命令里的 1 代表为每个创建的主服务器节点创建一个从服务器节点

执行这条命令需要确认三台机器之间的redis实例要能相互访问,可以先简单把所有机器防火墙关掉,如果不关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口

CENTOS7 关闭防火墙

systemctl stop firewalld # 临时关闭防火墙
systemctl disable firewalld # 禁止开机启动
[redis@artisan bin]$ ./redis-cli -a artisan --cluster create --cluster-replicas  1 192.168.18.131:8001 192.168.18.131:8004  192.168.18.132:8002 192.168.18.132:8005 192.168.18.133:8003 192.168.18.133:8006 
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.18.132:8005 to 192.168.18.131:8001
Adding replica 192.168.18.131:8004 to 192.168.18.132:8002
Adding replica 192.168.18.133:8006 to 192.168.18.133:8003
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
M: 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1 192.168.18.131:8001
   slots:[0-5460] (5461 slots) master
S: c4083f856388cc73feb3223433d10500b5556abe 192.168.18.131:8004
   replicates 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b
M: 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b 192.168.18.132:8002
   slots:[5461-10922] (5462 slots) master
S: 3410ea1dd49144f5d02b59036641bde566f03ee0 192.168.18.132:8005
   replicates 80618eaa0de9524cf439294b7cb6df1a34d3ad22
M: 80618eaa0de9524cf439294b7cb6df1a34d3ad22 192.168.18.133:8003
   slots:[10923-16383] (5461 slots) master
S: 3178d965b77e2967930d7ea6072cdb9d7e5ba8ef 192.168.18.133:8006
   replicates 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1
Can I set the above configuration? (type 'yes' to accept): 

输入 yes

>>> 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.18.132:8005 to 192.168.18.131:8001
Adding replica 192.168.18.131:8004 to 192.168.18.132:8002
Adding replica 192.168.18.133:8006 to 192.168.18.133:8003
>>> Trying to optimize slaves allocation for anti-affinity
[OK] Perfect anti-affinity obtained!
M: 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1 192.168.18.131:8001
   slots:[0-5460] (5461 slots) master
S: c4083f856388cc73feb3223433d10500b5556abe 192.168.18.131:8004
   replicates 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b
M: 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b 192.168.18.132:8002
   slots:[5461-10922] (5462 slots) master
S: 3410ea1dd49144f5d02b59036641bde566f03ee0 192.168.18.132:8005
   replicates 80618eaa0de9524cf439294b7cb6df1a34d3ad22
M: 80618eaa0de9524cf439294b7cb6df1a34d3ad22 192.168.18.133:8003
   slots:[10923-16383] (5461 slots) master
S: 3178d965b77e2967930d7ea6072cdb9d7e5ba8ef 192.168.18.133:8006
   replicates 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1
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.18.131:8001)
M: 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1 192.168.18.131:8001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 3410ea1dd49144f5d02b59036641bde566f03ee0 192.168.18.132:8005
   slots: (0 slots) slave
   replicates 80618eaa0de9524cf439294b7cb6df1a34d3ad22
M: 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b 192.168.18.132:8002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: c4083f856388cc73feb3223433d10500b5556abe 192.168.18.131:8004
   slots: (0 slots) slave
   replicates 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b
M: 80618eaa0de9524cf439294b7cb6df1a34d3ad22 192.168.18.133:8003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 3178d965b77e2967930d7ea6072cdb9d7e5ba8ef 192.168.18.133:8006
   slots: (0 slots) slave
   replicates 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[redis@artisan bin]$ 

Step6 验证集群

连接任意一个客户端即可:./redis‐cli ‐c ‐h ‐p (‐a访问服务端密码,‐c表示集群模式,-h 指定ip地址 -p 端口号)

进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)

[redis@artisan bin]$ ./redis-cli -a artisan -c -h 192.168.18.131 -p 8001
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.18.131:8001> 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:2777
cluster_stats_messages_pong_sent:2440
cluster_stats_messages_sent:5217
cluster_stats_messages_ping_received:2435
cluster_stats_messages_pong_received:2777
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:5217
192.168.18.131:8001> CLUSTER NODES
3410ea1dd49144f5d02b59036641bde566f03ee0 192.168.18.132:8005@18005 slave 80618eaa0de9524cf439294b7cb6df1a34d3ad22 0 1586663803774 5 connected
9a6804a96f9351d3fd61ea1e4d7dd77976b4133b 192.168.18.132:8002@18002 master - 0 1586663804782 3 connected 5461-10922
c4083f856388cc73feb3223433d10500b5556abe 192.168.18.131:8004@18004 slave 9a6804a96f9351d3fd61ea1e4d7dd77976b4133b 0 1586663804580 3 connected
6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1 192.168.18.131:8001@18001 myself,master - 0 1586663802000 1 connected 0-5460
80618eaa0de9524cf439294b7cb6df1a34d3ad22 192.168.18.133:8003@18003 master - 0 1586663804000 5 connected 10923-16383
3178d965b77e2967930d7ea6072cdb9d7e5ba8ef 192.168.18.133:8006@18006 slave 6bff20d4d3564180cb8f4e623d1e0cd9f79b68e1 0 1586663804580 6 connected
192.168.18.131:8001> 

进行数据操作验证

192.168.18.131:8001> set artisanKey artisanValue
-> Redirected to slot [6941] located at 192.168.18.132:8002
OK
192.168.18.132:8002> get artisanKey
"artisanValue"

关闭集群则需要逐个进行关闭,使用命令

[redis@artisan bin]$ ./redis-cli -a artisan -c -h 192.168.18.131 -p 8001  shutdown

至此,就搭建完毕了。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6月前
|
存储 缓存 Java
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
【Spring原理高级进阶】有Redis为啥不用?深入剖析 Spring Cache:缓存的工作原理、缓存注解的使用方法与最佳实践
|
5月前
|
存储 运维 NoSQL
Redis Cluster集群模式部署
Redis Cluster集群模式部署
122 4
|
6月前
|
存储 监控 负载均衡
redis 集群 (主从复制 哨兵模式 cluster)
redis 集群 (主从复制 哨兵模式 cluster)
|
3月前
|
存储 NoSQL 算法
深入理解Redis分片Cluster原理
本文深入探讨了Redis Cluster的分片原理,作为Redis官方提供的高可用性和高性能解决方案,Redis Cluster通过数据分片和横向扩展能力,有效降低单个主节点的压力。
深入理解Redis分片Cluster原理
|
3月前
|
缓存 NoSQL 网络协议
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
【Azure Redis 缓存】Azure Redis Cluster 在增加分片数时失败分析
|
3月前
|
缓存 NoSQL Redis
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
【Azure Redis 缓存】Windows版创建 Redis Cluster 实验 (精简版)
|
3月前
|
NoSQL Redis
Redis——单机迁移cluster集群如何快速迁移
Redis——单机迁移cluster集群如何快速迁移
138 0
|
6月前
|
存储 负载均衡 监控
redis 集群模式(redis cluster)介绍
redis 集群模式(redis cluster)介绍
|
5月前
|
NoSQL 数据可视化 Java
rodert单排学习redis进阶【白银一】
rodert单排学习redis进阶【白银一】
27 0
|
5月前
|
NoSQL Redis 数据库
rodert单排学习redis进阶【青铜】2
rodert单排学习redis进阶【青铜】
34 0