redis集群哨兵模式安装脚本

redis高可用集群=主从复制+Redis Sentinel的高可用

主从复制

Redis主从复制模式可以将主节点的数据同步给从节点,从而保障当主节点不可达的情况下,从节点可以作为
后备顶上来,并且可以保障数据尽量不丢失(主从复制可以保障最终一致性)。第二,从节点可以扩展主节点的读
能力,一旦主节点不能支持大规模并发量的读操作,从节点可以在一定程度上分担主节点的压力。

主从复制面临的问题:

1.当主节点发生故障的时候,需要手动的将一个从节点晋升为主节点,同时通知应用方修改主节点地址并重启应用,同时需要命令其它从节点复制新的主节点,整个过程需要人工干预。
2.主节点的写能力受到单机的限制。
3.主节点的存储能力受到单机的限制。

Redis Sentinel的高可用

当主节点出现故障时,Redis Sentinel能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。
RedisSentine是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线标识。如果被标识的是“主节点”,它还会和其他的Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,它们会选举一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis应用方。整个过程是自动的,不需要人工干预,解决了

Redis的高可用问题。

Redis Sentinel包含了若干个Sentinel节点,这样做也带来了两个好处:

  1. 对节点的故障判断是由多个Sentinel节点共同完成,这样可以有效的防止误判。
  2. Sentinel节点集合是由若干个Sentinel节点组成的,这样即使个别Sentinel节点不可用,整个Sentinel节点集合依然是健壮的。

Redis Sentinel具有以下几个功能:

1.监控:Sentinel会定期检测Redis数据节点、其余Sentinel节点是否可到达
2.通知:Sentinel会将故障转移的结果通知给应用方。
3.主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
4.配置提供者:在RedisSentinel结构中,客户端在初始化的时候连接的是Sentinel节点集合,从中获取主节点信息。

Redis Sentinel节点发现和监控机制

Redis Sentinel通过三个定时监控任务完成对各个节点的发现和监控:
1.每隔10秒,每个Sentinel会向主节点和从节点发送info命令获取最新的拓扑结构。
2.每隔2秒,每个Sentinel节点会向Redis数据节点的_sentinel_:hello频道上发送该Senitnel节点对于主节点的判断。
以及当前Sentinel节点的信息,同时每个Sentinel节点也会订阅该频道,来了解其他Sentinel节点以及他们对主节点的判断。这个定时任务可以完成以下两个工作:
1)发现新的Sentinel节点:通过订阅主节点的_Sentinel_:hello了解其他Sentinel节点信息。如果是新加入的Sentinel节点,将该Sentinel节点信息保存起来,并与改Sentinel节点创建连接
2)Sentinel节点之间交换主节点状态,作为后面客观下线以及领导者选举的依据
3.每隔1秒,每个Sentinel节点会向主节点、从节点、其余Sentinel节点发送一条ping命令做一次心跳检测,来确认当前节点是否可达。与主节点,从节点,其余Sentinel都建立起连接,实现了对每个节点的监控。这个定时任务是节点失败判定的重要依据。

redis安装

#!/bin/bash

#This is a script to install redis, the source code is compiled and installed. The version number of redis is 4.0.8

#Installation dependency package

yum -y install gcc gcc-c++




#Download the installation package

wget http://download.redis.io/releases/redis-4.0.8.tar.gz



#Extract to the specified directory

tar zxvf redis-4.0.8.tar.gz -C /usr/src

cd /usr/src/redis-4.0.8/

#cc: error: ../deps/hiredis/libhiredis.a: No such file or directory
#cc: error: ../deps/lua/src/liblua.a: No such file or directory
#cd /usr/src/redis-4.0.8/deps
#make lua hiredis linenoise


#Compile and install

make MALLOC=libc

make && make install


mkdir -p /usr/local/redis/{db,etc,bin,sentinel,logs}

cd  /usr/src/redis-4.0.8/src/
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-server redis-cli redis-sentinel /usr/local/redis/bin 

#主节点
cat >/usr/local/redis/etc/redis-16379.conf << EOF
daemonize yes
pidfile /var/run/redis-16379.pid
logfile /usr/local/redis/logs/redis-16379.log
port 16379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-16379.db
dir /usr/local/redis/db
masterauth 123456
requirepass 123456
EOF

#第一个从节点
cat >/usr/local/redis/etc/redis-26379.conf << EOF
daemonize yes
pidfile /var/run/redis-26379.pid
logfile /usr/local/redis/logs/redis-26379.log
port 26379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-26379.db
dir /usr/local/redis/db
masterauth 123456
requirepass 123456
slaveof 127.0.0.1 16379
EOF
#第二个从节点
cat >/usr/local/redis/etc/redis-36379.conf << EOF
daemonize yes
pidfile /var/run/redis-36379.pid
logfile /usr/local/redis/logs/redis-36379.log
port 36379
bind 0.0.0.0
timeout 300
databases 16
dbfilename dump-36379.db
dir /usr/local/redis/db
masterauth 123456
requirepass 123456
slaveof 127.0.0.1 16379
EOF
#Start service

cd /usr/local/redis/bin

redis-server /usr/local/redis/etc/redis-16379.conf
redis-server /usr/local/redis/etc/redis-26379.conf
redis-server /usr/local/redis/etc/redis-36379.conf

#启动之后查看日志,以下两行日志日志表明redis-16379 作为 Redis 的 主节点,redis-26379 和 redis-36379 作为 从节点,从 主节点 同步数据

#125639:M 25 Mar 22:51:07.135 * Background saving terminated with success
#125639:M 25 Mar 22:51:07.135 * Synchronization with slave 127.0.0.1:26379 succeeded
#125639:M 25 Mar 22:52:11.074 * Slave 127.0.0.1:36379 asks for synchronization


#Sentinel的配置

#节点1 sentinel-16380.conf

cat >/usr/local/redis/sentinel/sentinel-16380.conf<< EOF
protected-mode no
bind 0.0.0.0
port 16380
daemonize yes
sentinel monitor master 127.0.0.1 16379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 180000
sentinel parallel-syncs master 1
sentinel auth-pass master 123456
logfile /usr/local/redis/logs/sentinel-16380.log
EOF



#节点2 sentinel-26380.conf

cat >/usr/local/redis/sentinel/sentinel-26380.conf<< EOF
protected-mode no
bind 0.0.0.0
port 26380
daemonize yes
sentinel monitor master 127.0.0.1 16379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 180000
sentinel parallel-syncs master 1
sentinel auth-pass master 123456
logfile /usr/local/redis/logs/sentinel-26380.log
EOF


#节点3 sentinel-36380.conf

cat >/usr/local/redis/sentinel/sentinel-36380.conf<< EOF
protected-mode no
bind 0.0.0.0
port 36380
daemonize yes
sentinel monitor master 127.0.0.1 16379 2
sentinel down-after-milliseconds master 5000
sentinel failover-timeout master 180000
sentinel parallel-syncs master 1
sentinel auth-pass master 123456
logfile /usr/local/redis/logs/sentinel-36380.log
EOF


#Sentinel启动

redis-sentinel /usr/local/redis/sentinel/sentinel-16380.conf 
redis-sentinel /usr/local/redis/sentinel/sentinel-26380.conf 
redis-sentinel /usr/local/redis/sentinel/sentinel-36380.conf 

#查看 Sentinel 的启动进程
#ps -ef | grep redis-sentinel

#启动之后查看配置文件已刷新
#Redis Sentinel登陆
#redis-cli -p 16380

#查看 Redis 主从集群的 主节点 信息
#127.0.0.1:16380> SENTINEL master master

#redis-server 客户端登陆

#redis-cli -h 127.0.0.1 -p 16379

#127.0.0.1:16379> auth 密码

Sentinel时客户端命令

检查其他 Sentinel 节点的状态,返回 PONG 为正常。

PING sentinel

显示被监控的所有 主节点 以及它们的状态。

SENTINEL masters

显示指定 主节点 的信息和状态。

SENTINEL master <master_name>

显示指定 主节点 的所有 从节点 以及它们的状态。

SENTINEL slaves <master_name>

返回指定 主节点 的 IP 地址和 端口。如果正在进行 failover 或者 failover 已经完成,将会显示被提升为 主节点 的 从节点 的 IP 地址和 端口。

SENTINEL get-master-addr-by-name <master_name>

重置名字匹配该 正则表达式 的所有的 主节点 的状态信息,清除它之前的 状态信息,以及 从节点 的信息。

SENTINEL reset <pattern>

强制当前 Sentinel 节点执行 failover,并且不需要得到其他 Sentinel 节点的同意。但是 failover 后会将 最新的配置 发送给其他 Sentinel 节点。

SENTINEL failover <master_name>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章