您现在的位置是:首页 >学无止境 >redis哨兵集群网站首页学无止境

redis哨兵集群

彭宇栋 2024-07-09 10:33:23
简介redis哨兵集群

1. redis简介

  • Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、key-value数据库,并提供多种语言的API。(是一个非关系型的数据库)

既然提到非关系数据库,那么就有必要说一下关系型数据库和非关系型数据库的区别了。

1. 数据存储结构的不同
首先关系型数据库一般都有固定的表结构,并且需要通过DDL(数据定义语言)语句来修改表结构,不是很容易进行扩展。
非关系型数据库的存储机制就有很多,比如咱们今天介绍的redis就是基于key/value俗称键值对,还有其他的比如基于文档的、基于图的等等,对于数据的格式十分灵活没有固定的表结构,方便扩展,因此如果业务的数据结构并不固定的或者经常变动比较大的,那么非关系型数据库是一个不错的选择

2. 可扩展性的不同
传统的关系型数据库给人一种横向扩展难,不好对数据进行分片等。

而一些非关系型数据库则原生就支持数据的水平扩展(就比如mongodb的sharding机制),并且这可能也是很多nosql的一大卖点,其实像mysql这种关系型数据库的水平扩展也并不是难,即使nosql水平扩展容易但对于向跨分片进行joins这种场景都没有什么太好的解决办法,不管是关系型还是非关系型数据库,解决水平扩展或者跨分片joins这种场景,在应用层和数据层中间加一层中间件来做数据处理也许是个好的办法

3. 数据一致性的不同
非关系型数据库一般强调的是数据最终一致性,而没有像ACID一样强调数据的强一致性,从非关系型数据库中读到的有可能还是处于一个中间态的数据,因此如果你的业务对于数据的一致性要求很高,那么非关系型数据库并不是一个很好的选择,非关系型数据库可能更多的偏向OLAP场景,而关系型数据库更多偏向于OLTP场景

  • Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系型数据库起到很好的补充作用。它提供了Java,c/c++,c#,PHP,JavaScript,Perl,object-C,python,ruby,erlang等客户端,使用很方便

  • redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以关联其他从服务器的主服务器。这使得redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从服务器在任何地方同步树时,可以阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。

2. redis安装部署

2.1 下载安装包

[root@localhost src]# wget https://download.redis.io/releases/redis-5.0.9.tar.gz
[root@localhost src]# tar xf redis-5.0.9.tar.gz -C /usr/local/
[root@localhost ~]# yum -y install gcc gcc-c++ make

2.2 编译安装

[root@localhost ~]# cd /usr/local/redis-5.0.9/
[root@localhost redis-5.0.9]# make 
[root@localhost redis-5.0.9]# cd src/
[root@localhost src]# make install

2.3 配置环境变量

[root@localhost redis-5.0.9]# vim /etc/profile

末尾添加
省略……
#redis
export PATH=/usr/local/redis-5.0.9/src:$PATH
[root@localhost redis-5.0.9]# source /etc/profile

2.4 启动redis

[root@localhost redis-5.0.9]# vim redis.conf
136 daemonize yes      //把no改为yes

[root@localhost redis-5.0.9]# redis-server /usr/local/redis-5.0.9/redis.conf
[root@localhost redis-5.0.9]# ss -anlt | awk -F "  *|:" 'NR==2{print $5}'
6379     //看到6379端口号说明成功

进入客户端
[root@localhost redis-5.0.9]# redis-cli -p 6379
127.0.0.1:6379>

关闭服务
[root@localhost redis-5.0.9]# redis-cli -p 6379 shutdown

3. 配置redis主从

redis集群架构

现在所部署的哨兵集群是基于redis主从的基础上的,整体架构如下:
一个主节点(master)可拥有多个从节点(slave),从节点实现对主节点的复制,保证数据同步。而哨兵(sentinel)则对各节点进行监控,主要包括主节点存活检测、主从运行情况检测等,一旦主节点宕机,哨兵可自动进行故障转移 (failover)、主从切换。

3.1 环境说明

IP角色版本
192.168.5.55masterredis5.0.9
192.168.5.56slave1redis5.0.9
192.168.5.56slave2redis5.0.9

此次配置需要三台主机,一主两从,均需安装redis5.0.9版本
安装过程请查看目录第二章节

3.2 修改配置文件

此步骤需要redis安装完成后才能修改

修改主配置文件(192.168.5.55)
[root@localhost ~]# cd /usr/local/redis-5.0.9/
[root@localhost redis-5.0.9]# mkdir logs
[root@localhost redis-5.0.9]# vim redis.conf
69 #bind 127.0.0.1    //注释掉此行
88 protected-mode no   //关闭保护模式,不会阻止远程访问
136 daemonize yes     //修改为yes,允许后台运行
171 logfile "/usr/local/redis-5.0.9/logs/redis.log"  //指定日志目录文件
[root@localhost redis-5.0.9]# redis-server redis.conf
修改从配置文件(192.168.5.56和192.1668.5.100)
[root@localhost ~]# cd /usr/local/redis-5.0.9/
[root@localhost redis-5.0.9]# mkdir logs
[root@localhost redis-5.0.9]# vim redis.conf
69 #bind 127.0.0.1          //注释掉此行 
88 protected-mode no      //关闭保护模式
136 daemonize yes     //修改为yes
171 logfile "/usr/local/redis-5.0.9/logs/redis_log"   //指定日志目录文件
286 replicaof 192.168.5.55 6379     //修改为主的ip和端口号
[root@localhost redis-5.0.9]# redis-server redis.conf

3.3 测试主从效果

//查看主从配置
[root@localhost redis-5.0.9]# redis-cli –h 192.168.5.55 –p 6379
192.168.5.55:6379> info replication 
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.5.56,port=6379,state=online,offset=91628,lag=0
slave1:ip=192.168.5.100,port=6379,state=online,offset=91628,lag=1
后面省略……
//在主上设置一个值,在从上验证
[root@localhost redis-5.0.9]# redis-cli –h 192.168.5.55 –p 6379
192.168.5.55:6379> set name test
OK
192.168.5.55:6379> get name
"test"
从节点上验证
[root@localhost redis-5.0.9]# redis-cli –h 192.168.5.56 –p 6379
192.168.5.56:6379> get name
"test"

[root@localhost redis-5.0.9]# redis-cli –h 192.168.5.100 –p 6379
192.168.5.100:6379> get name
"test"

4. 哨兵集群

4.1 哨兵集群简介

  • 哨兵集群详解:
    Redis Sentinel是Redis 的高可用性解决方案由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

    监控: Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

    通知:当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。

    故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。

    统一的配置管理:连接者询问sentinel取得主从的地址。

  • 哨兵集群原理:
    Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

  1. 每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命

  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

  3. 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。

  4. 如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。

  5. 在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

  6. 当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除

4.2 配置哨兵集群

此步骤是基于一主两从的基础上配置的,下面配置文件需要在主和从上执行
192.168.5.55,192.168.5.56,192.168.5.100这三台主机都要修改配置文件

[root@localhost redis-5.0.9]# pwd
/usr/local/redis-5.0.9
[root@localhost redis-5.0.9]# vim sentinel.conf
17 protected-mode no    //修改为no
26 daemonize yes        //修改为yes
36 logfile "/usr/local/redis-5.0.9/logs/sentinel.log"   //指定日志文件位置
121 sentinel monitor mymaster 192.168.5.56 6379 2  //修改为主的ip和端口

//三台配置完成后依次启动
[root@localhost redis-5.0.9]# redis-sentinel sentinel.conf
查看26379端口
[root@localhost redis-5.0.9]# ss -antl | grep 26379
LISTEN     0      128      *:26379                    *:*                  
LISTEN     0      128      [::]:26379                  [::]:*                  

分别登录三台主机查看哨兵状态
[root@localhost redis-5.0.9]# redis-cli -h 192.168.5.55 -p 26379
192.168.5.55:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.5.55:6379,slaves=2,sentinels=3

[root@localhost redis-5.0.9]# redis-cli -h 192.168.5.56 -p 26379
192.168.5.56:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.5.55:6379,slaves=2,sentinels=3

[root@localhost redis-5.0.9]# redis-cli -h 192.168.5.100 -p 26379
192.168.5.56:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.5.55:6379,slaves=2,sentinels=3

检查status、slaves、sentinels 状态,数量。确认无误后进行下一步测试。

4.3 模拟故障,进行容灾切换

//模拟故障之前确认主的ip
[root@localhost redis-5.0.9]# redis-cli -h 192.168.5.56 -p 6379
192.168.5.56:6379> info replication
# Replication
role:slave
master_host:192.168.5.55
master_port:6379

//模拟主机192.168.5.55宕机
[root@localhost ~]# init 0
//登录192.168.5.56主机查看
[root@localhost redis-5.0.9]# redis-cli -h 192.168.5.56 -p 6379
192.168.5.56:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.5.100,port=6379,state=online,offset=115805,lag=0
master_replid:a2378393fec9fea2ead06a8c57a628462ad4aa7f
master_replid2:ba34586996ba173136eb297e70a52af08a13f2a8

//主从切换成功,当原来的192.168.5.55恢复后,会默认的变成192.168.5.56的从节点
192.168.5.56:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.5.100,port=6379,state=online,offset=2782961,lag=1
slave1:ip=192.168.5.55,port=6379,state=online,offset=2782961,lag=0
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。