驿站:
1、超详细 高性能redis集群搭建 —— 第一篇(cluster搭建)
2、超详细 高性能redis集群搭建 —— 第二篇(predixy搭建)
3、超详细 高性能redis集群搭建 —— 第三篇(redis-cluster-proxy搭建)
写这篇文章之前我其实踩了很多的坑,也看了很多网上的资料,发现写的不是那么的清楚,其中埋的坑也不少,走了很多弯路,于是决定写了这篇坑比较少并且搭建方式简单的文章,希望你们能少走些弯路。(预防针:其实非常简单,不要让集群这个听起来高大上的名词所吓倒)
基础了解
主从模式介绍:
1、主节点可以进行读写操作,当写操作触发成功导致数据变化时会自动将数据同步给从节点
2、从节点一般都是只读的
3、一个master节点可以拥有多个slave节点,而一个slave节点只能对应一个master节点
4、slave节点挂了不影响其他slave节点的读和master节点的读和写,重新启动后会将数据从master节点同步过来
5、master节点挂了以后,不影响slave节点的读,但redis不再提供写服务,master节点重启后redis将重新对外提供写服务
6、 master节点挂了以后,不会在slave节点中重新选一个master节点
接下来介绍下redis的两种模式 sentinel(哨兵)、cluster(集群)两者的特性是什么,以便做出更适合自己的选择,只有最适合的才是最好的。
sentinel(哨兵):
上面我们提到,当主节点挂掉后从节点不会升级为主节点,不能达到高可用的目的。sentinel解决了该难题实现了高可用,sentinel模式是建立在主从模式的基础上,因此具有主从的一些特性,下面说说不同点。
sentinel特性
1、当master节点挂了以后,会在slave节点中选择一个做为master节点继续工作,升官后会通知其他slave节点跟随新的主人
2、当挂掉的master节点重新启动后,它将变为slave节点并同步主节点数据
3、sentinel也可以启动多个形成一个sentinel集群,sentinel之间也会自动监控
4、当主从模式配置密码时,sentinel会同步将配置信息修改到配置文件中,不需要担心
5、 一个sentinel或sentinel集群可以管理多个主从Redis
6、sentinel支持多数据库的选择
7、所有节点数据完全一致,受限于此特性对单机容量要求较高,扩容不方便
8、sentinel会每秒向所有节点发送ping命令,如当某个节点发生超时会被标记为主观下线,当其他sentinel的监视标记主观下线节点超过一定数量后标记为客观下线,当发现下线节点正常时下线状态会被移除。
sentinel事件说明
1、+reset-master :主服务器已被重置。
2、+slave :一个新的从服务器已经被 Sentinel 识别并关联。
3、 +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
4、+failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
5、 +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
6、+slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
7、 +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
8、 -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
9、 +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
10、+sdown :给定的实例现在处于主观下线状态。
11、 -sdown :给定的实例已经不再处于主观下线状态。
12、+odown :给定的实例现在处于客观下线状态。
13、 -odown :给定的实例已经不再处于客观下线状态。
14、 +new-epoch :当前的纪元(epoch)已经被更新。
15、+try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
16、+elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
17、 +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
18、no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
19、selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
20、failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
21、failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
22、failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
23、+switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
24、 +tilt :进入 tilt 模式。
25、-tilt :退出 tilt 模式。
cluster(集群):
cluster同时满足了sentinel的一些特性达到了高可用目的,不同点是采用hash算法根据key自动将数据分配到不同的节点当中,新增节点非常方便,当数据量过大时,可增加机器进行扩容,解决了单机容量受限的问题。
cluster特性
1、多个redis节点直接数据共享
2、所有的节点都是一主一从或一主多从
3、不支持同时处理多个key(如MSET/MGET),因为cluster需要把key分配节点,高并发量同时创建key-value会降低性能并导致不可预测的行为
4、支持在线增加、删除节点
5、不支持多数据库选择
下面主要讲的是cluster集群搭建方式
1、安装redis
1.1、打开网站选择稳定版进行下载安装: https://redis.io/download
1.2、执行安装命令
wget http://download.redis.io/releases/redis-5.0.8.tar.gz
tar -zxvf redis-5.0.8.tar.gz #解压文件
mv redis-5.0.8/ /usr/local/ #移动到指定的安装目录
cd /usr/local/redis-5.0.8 #进入安装目录
make #安装
通过以上几步简单的操作即可完成redis的安装,需要注意的是redis安装需要依赖gcc,如果没有安装gcc执行 yum install gcc 即可继续执行安装
稍后讲cluster集群过程中会讲一下如何启动安装好的redis,这里暂时先不用启动。
2、搭建cluster集群
2.1、部署前说明
对于redis4之前的版本来说需要额外在安装redis-trib工具来实现集群的部署,redis5之后对Redis-cli做了优化,集成了集群的所有管理功能。具体使用可以通过命令 redis-cli --cluster help 查看帮助信息。
redis-trib工具的安装在这里不多做赘述(现在也基本用不到了),如需安装务必安装最新的稳定版,默认安装的是2.0版本太低不能用,需要切换到阿里源进行下载安装。
集群的部署至少需要6个节点(6台机器),由于是学习测试用,我这里使用了一台机器进行搭建,生产环境切勿使用一台机器搭建,这样就失去了高可用的意义。
2.2、开始部署
#进入redis安装目录
cd 目录
#创建集群配置目录
mkdir redis-cluster
#进入集群配置目录
cd redis-cluster
#创建各节点配置目录,每个目录代表一个端口
mkdir 7001 7002 7003 7004 7005 7006
#打开redis配置文件
vim ../redis.conf
打开配置文件之后修改一下几个主要配置项
port 7000 #端口(现在暂时不用修改)
cluster-enabled yes #启用集群
cluster-node-timeout 5000 #超时时间
bind 0.0.0.0
protected-mode no
daemonize yes #后台启动
修改后将配置文件复制到各节点目录中:7001 7002 7003 7004 7005 7006,编辑配置文件,依次将各节点中的配置文件端口参数改为与目录对应的编号后保存退出。
在各节点中分别启动redis,在节点之外的目录启动可能会造成启动失败。
#启动redis(redis-server是启动入口)
redis-server redis.conf
#查看启动状态
ps aux | grep redis-server
所有节点启动后会如下所示,共有6个redis服务。
最重要的一步,将节点加入集群
#为了方便测试关闭防火墙
systemctl stop firewalld.service #临时关闭
systemctl disable firewalld.service #禁止开机启动
irewall-cmd --state #查看防火墙状态
#创建集群(redis-cli集群创建入口,这里需要注意的是IP地址一定要写成机器的IP不可写成127.0.0.1,至于为什么,下期讲搭建redis代理中会讲到)
redis-cli --cluster create 192.168.6.129:7001 192.168.6.129:7002 192.168.6.129:7003 192.168.6.129:7004 192.168.6.129:7005 192.168.6.129:7006 --cluster-replicas 1
#查看集群信息
redis-cli --cluster check 192.168.6.129:7001
出现如上图所示代表大功告成了(3主3从模式)。
那这么多的节点客户端在使用过程中应该链接哪个呢?只连一个能用吗?
1、只连一个不可用,redis在读写过程中会根据key进行hash运算分配到不同的节点,只连一个时无法进行分配导致出错。
2、客户端如何连接使用
方式一:所有节点一次性全部链接。(不推荐)
方式二:使用代理进行链接,客户端只需连接代理即可。(推荐)
redis代理分为很多种,下期讲如何搭建高性能redis代理。