redis哨兵模式搭建
简介:哨兵模式(Redis-Sentinel)是官方推荐的高可用解决方案,当redis在做master-slave的高可用方案时,假如master宕机了,redis本身(以及其很多客户端)都没有实现自动进行主备切换,而redis-sentinel本身也是独立运行的进程,可以部署在其他与redis集群可通讯的机器中监控redis集群。
redis为什么快:
-
纯内存操作,数据存放在内存中,内存的响应时间大约是 100纳秒 ,这是Redis每秒万亿级别访问的重要基础。
-
单线程操作,避免了频繁的上下文切换
虽然是采用单线程,但是单线程避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU;虽然作者认为CPU不是瓶颈,内存与网络带宽才是。但实际测试时并非如此,见上。 -
采用了非阻塞I/O多路复用机制,多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程。加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间。
-
纯ANSI C编写,不依赖第三方类库,没有像memcached那样使用libevent,因为libevent迎合通用性而造成代码庞大,所以作者用libevent中两个文件修改实现了自己的epoll event loop。微软的兼容Windows补丁也因为同样原因被拒了。
基础架构图
哨兵的监控: -
任务1:每个哨兵节点每10秒会向主节点和从节点发送info命令获取最拓扑结构图,哨兵配置时只要配置对主节点的监控即可,通过向主节点发送info,获取从节点的信息,并当有新的从节点加入时可以马上感知到
-
任务2:每个哨兵节点每隔2秒会向redis数据节点的指定频道上发送该哨兵节点对于主节点的判断以及当前哨兵节点的信息,同时每个哨兵节点也会订阅该频道,来了解其它哨兵节点的信息及对主节点的判断,其实就是通过消息publish和subscribe来完成的
-
任务3:每隔1秒每个哨兵会向主节点、从节点及其余哨兵节点发送一次ping命令做一次心跳检测,这个也是哨兵用来判断节点是否正常的重要依据
选举流程:
如果主节点被判定为客观下线之后,就要选取一个哨兵节点来完成后面的故障转移工作,选举出一个leader的流程如下:
a)每个在线的哨兵节点都可以成为领导者,当它确认(比如哨兵3)主节点下线时,会向其它哨兵发is-master-down-by-addr命令,征求判断并要求将自己设置为领导者,由领导者处理故障转移;
b)当其它哨兵收到此命令时,可以同意或者拒绝它成为领导者;
c)如果哨兵3发现自己在选举的票数大于等于num(sentinels)/2+1时,将成为领导者,如果没有超过,继续选举…………
一、redis哨兵模式步骤
然后解压至指定目录:
tar -zxvf redis-4.0.14.tar.gz -C /usr/local/
进入到解压后的目录之后进行编译:
cd /usr/local/redis-4.0.14
make
编译成功后进行安装,设置安装路径:
make install PREFIX=/usr/local/redis
新建用户redis
groupadd redis
useradd -g redis
passwd redis (输入密码)
chown redis:redis redis-4.0.14.tar.gz
chmod 777 –R /usr/local
二、修改内核参数
主配置文件
vi /etc/sysctl.conf
vm.max_map_count = 262144
vm.swappiness = 1
vm.overcommit_memory=1
sysctl -p 生效
echo 262144 > /proc/sys/net/core/somaxconn
三、redis主服务器配置
主配置文件
vim redis_63790.conf
bind 0.0.0.0
daemonize yes
loglevel notice
slave-read-only no
port 63790
logfile “/usr/local/redis-4.0.14/logs/redis.log”
pidfile “/var/run/redis_63790.pid”
dbfilename “63790dump.rdb”
protected-mode no
save 900 1
save 300 10
save 60 10000
#这里设置密码
requirepass “password”
masterauth “password”
#Generated by CONFIG REWRITE
dir “/usr/local/redis-4.0.14”
maxmemory 32gb ##设置内存,根据系统资源进行配置,设置最大内存避免omm
哨兵文件
vi 63790_sentinel.conf
port 26379
daemonize no
sentinel monitor mymaster 192.168.2.167 63790 2
sentinel down-after-milliseconds mymaster 3000
sentinel deny-scripts-reconfig yes
logfile “/usr/local/redis-4.0.14/logs/sentinel.log”
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster password
bind 0.0.0.0
四、redis从服务器配置
主配置文件
bind 0.0.0.0
port 63790
loglevel notice
logfile “63790.log”
daemonize yes
pidfile “/var/run/redis_63790.pid”
slave-read-only yes
dbfilename “63790dump.rdb”
protected-mode no
#这里设置密码
requirepass “password”
masterauth “password”
maxmemory 32gb
#Generated by CONFIG REWRITE
dir “/usr/local/redis-4.0.14”
五、启动redis集群
主配置文件
启动redis,注意redis启动顺序是很重要的,先主后从
主服务器:
cd /usr/local/redis-4.0.14
src/redis-server ./redis_63790.conf
nohup src/redis-sentinel ./63790_sentinel.conf >/dev/null 2>&1 &
从服务器
cd /usr/local/redis-4.0.141
src/redis-server ./redis_63790.conf
nohup src/redis-sentinel ./sentinel_26379.conf >/dev/null 2>&1 &