redis哨兵搭建

一、Redis 入门简介

Redis(Remote Dictionary Server
远程字典服务)是一个开源的高性能key-value数据库,它通常被称为数据结构服务器,因为值(value)可以是 字符串(String),
哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted
sets)等类型,官网:https://redis.io/。

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供 list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

为什么用Redis?
一个字,快!传统的关系型数据库如 Mysql 等已经不能适用所有的场景了,比如在高并发,访问流量高峰等情况时,数据库很容易崩了。Redis 运行在内存,能起到一个缓冲作用,由于内存的读写速度远快于硬盘,因此 Redis 在性能上比其他基于硬盘存储的数据库有明显的优势。同时除了快之外,还可应用于集群的自动容灾切换以及数据的读写分离,减轻高并发的压力。

在这里插入图片描述

在这里插入图片描述

二、Redis 安装部署

三台服务器:192.168.211.6xx(主) 192.168.211.7xx(从) 192.168.211.8xx(从)

2.1 安装

# 安装依赖包
yum  install autoconf automake binutils-devel bison cpp dos2unix gcc gcc-c++ python-devel -y
2.2 上传包并解压、安装
cd /usr/local
#下载安装包:
wget http://redis/redis-5.0.14.tar.gz
tar -xzvf redis-5.0.14.tar.gz 
cd redis-5.0.14
make
make install

2.2创建redis配置文件

#创建配置文件目录    
mkdir  -p  /data/redis/logs
cd   /data/redis

192.168.211.6xx(主)添加配置文件

#新增配置文件  
vi redis.conf

protected-mode yes #开启protected-mode保护模式,需配置bind ip或者设置访问密码
port 6490 #端口号
tcp-backlog 511 #确定了TCP连接中已完成队列(完成三次握手之后)的长度
timeout 0 # timeout:单位秒,默认0;如果在一个 timeout 时间内,没有数据的交互,是否断开连接。0代表永不断开。
#cluster-enabled yes
tcp-keepalive 300 #用于校验是否有机器已经挂了,保持网络活跃(通讯)
daemonize yes #守护进程
supervised no #可以通过upstart和systemd管理Redis守护进程,这个参数是和具体的操作系统相关的
pidfile "/var/run/redis.pid"
loglevel notice # log 等级分为4 级,debug,verbose, notice, 和warning。生产环境下一般开启notice
logfile "/data/redis/logs/redis.log" 
databases 16
#分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改  数据同步数据文件
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes #当为yes时如果创建快照失败禁止写入
rdbcompression yes #指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbchecksum yes #对rdb数据进行校验,耗费CPU资源,默认为yes
dbfilename "dump.rdb" # rdb文件名称
dir "/data/redis" #存放路径
masterauth "Sdkfjdksfdksf_d@Redddis20881" #当master服务设置了密码保护时,slav服务连接master的密码
replica-serve-stale-data yes # slave-serve-stale-data参数设置成yes,主从复制中,从服务器可以响应客户端请求
replica-read-only yes #yes是从服务器只读
repl-diskless-sync no #默认不使用diskless同步方式
repl-diskless-sync-delay 5 #无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒
repl-disable-tcp-nodelay no #是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽
replica-priority 100 #这是 replicas 节点通过 INFO 接口给出的信息,默认值为 100。 当 master 节点无法正常工作后 Redis Sentinel 通过这个值来决定将哪个 replicas 节点提升为 master 节点,这个数值越小表示越优先进行提升
requirepass "Sdkfjdksfdksf_d@Redddis20881" #redis密码
appendonly no #指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename "appendonly.aof" #指定更新日志文件名,默认为appendonly.aof
appendfsync everysec #指定更新日志条件,共有3个可选值:no:表示等操作系统进行数据缓存同步到磁盘(快)always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)everysec:表示每秒同步一次(折衷,默认值)
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100 #触发重写百分比 (指定百分比为0,将禁用aof自动重写功能
auto-aof-rewrite-min-size 64mb #触发自动重写的最低文件体积(小于64mb不自动重写)
aof-load-truncated yes #指redis在恢复时,会忽略最后一条可能存在问题的指令
lua-time-limit 5000  #lua脚本执行超时时间
slowlog-log-slower-than 10000 #超过10s被标记慢日志
slowlog-max-len 128 #slowlog-max-len表示慢查询最大的条数,当slowlog超过设定的最大值后,会将最早的slowlog删除,是个FIFO队列
latency-monitor-threshold 0 #当设置为0时,这个监控系统处于停止状态
notify-keyspace-events "" # Redis能通知 Pub/Sub 客户端关于键空间发生的事件,默认关闭
# 当hash只有少量的entry时,并且最大的entry所占空间没有超过指定的限制时,会用一种节省内存的
# 数据结构来编码。可以通过下面的指令来设定限制
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes # 启用哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
# 当一个子进程重写AOF文件时,如果启用下面的选项,则文件每生成32M数据会被同步
aof-rewrite-incremental-fsync yes
# Generated by CONFIG REWRITE

192.168.211.7xx(从)添加配置文件

protected-mode yes
port 6490
tcp-backlog 511
cluster-enabled no
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile "/var/run/redis.pid"
loglevel notice
logfile "/data/redis/logs/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis"
masterauth "Sdkfjdksfdksf_d@Redddis20881"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "Sdkfjdksfdksf_d@Redddis20881"
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

# Generated by CONFIG REWRITE

replicaof 192.168.211.6xx 6490

192.168.211.8xx(从)添加配置文件

protected-mode yes
port 6490
tcp-backlog 511
timeout 0
cluster-enabled no
tcp-keepalive 300
daemonize yes
supervised no
pidfile "/var/run/redis.pid"
loglevel notice
logfile "/data/redis/logs/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/data/redis"
masterauth "Sdkfjdksfdksf_d@Redddis20881"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass "Sdkfjdksfdksf_d@Redddis20881"
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

# Generated by CONFIG REWRITE
replicaof 192.168.211.6xx 6490

注意:
1)logfile “/data/redis /logs/redis.log” 根据实际情况调整
2)如果是从库比主库多一项配置 slaveof 192.168.211.6xx 6490

# 授权用户
chown -R  appuser.appuser  /usr/local/bin/redis-server
chown -R  appuser.appuser  /data/redis
su  -  appuser
# 启动redis服务
/usr/local/bin/redis-server  /data/redis/redis.conf  &

将redis启动交于systmctl管理

vi /lib/systemd/system/redis.service
[Unit]
Description=redis
After=redis.service

[Service]
ExecStart=/usr/local/bin/redis-server /data/redis/redis.conf –daemonize no
ExecStop=/usr/local/bin/redis-cli -p 端口号 -a redis密码 shutdown
 [Install]
WantedBy=multi-user.target

systemctl enable redis.service #加入开机自启
systemctl start redis.service
systemctl stop redis.service

三、sentine搭建

新增sentine配置文件 vi /data/redis/sentinel.conf
192.168.211.6xx(主) 192.168.211.7xx(从) 192.168.211.8xx(从)
192.168.211.6xx的配置文件:

sentinel myid 0502b103233c4d36e89169093d46051ec17bd724
sentinel deny-scripts-reconfig yes
sentinel monitor master6490 192.168.211.6xx 6490 2
sentinel down-after-milliseconds master6490 5000
sentinel failover-timeout master6490 15000
port 6800
logfile "/data/redis/logs/sentinel.log"
dir "/data/redis"
sentinel auth-pass master6490 Sdkfjdksfdksf_d@Redddis20881
sentinel config-epoch master6490 22
sentinel leader-epoch master6490 22
sentinel known-replica master6490 192.168.211.7xx 6490
sentinel known-replica master6490 192.168.211.8xx 6490
sentinel known-sentinel master6490 192.168.211.8xx 6800 497181c34eb7e77e7d89ccf11e83b995c2edfac4
sentinel known-sentinel master6490 192.168.211.7xx 6800 497181c34eb7e77e7d89ccf11e83b995c2edfac3
daemonize yes
bind 0.0.0.0
# Generated by CONFIG REWRITE
protected-mode no
sentinel current-epoch 22

192.168.211.7xx的配置文件:

sentinel myid 497181c34eb7e77e7d89ccf11e83b995c2edfac3
sentinel deny-scripts-reconfig yes
sentinel monitor master6490 192.168.211.6xx 6490 2
sentinel down-after-milliseconds master6490 5000
sentinel failover-timeout master6490 15000
port 6800
logfile "/data/redis/logs/sentinel.log"
dir "/data/redis"
sentinel auth-pass master6490 Sdkfjdksfdksf_d@Redddis20881
sentinel config-epoch master6490 22
sentinel leader-epoch master6490 22
sentinel known-replica master6490 192.168.211.7xx 6490
sentinel known-replica master6490 192.168.211.8xx 6490
sentinel known-sentinel master6490 192.168.211.8xx 6800 497181c34eb7e77e7d89ccf11e83b995c2edfac4
sentinel known-sentinel master6490 192.168.211.6xx 6800 0502b103233c4d36e89169093d46051ec17bd724
daemonize yes
bind 0.0.0.0
# Generated by CONFIG REWRITE
protected-mode no
sentinel current-epoch 22

192.168.211.8xx的配置文件:

sentinel myid 497181c34eb7e77e7d89ccf11e83b995c2edfac4
sentinel deny-scripts-reconfig yes
sentinel monitor master6490 192.168.211.6xx 6490 2
sentinel down-after-milliseconds master6490 5000
sentinel failover-timeout master6490 15000
port 6800
logfile "/data/redis/logs/sentinel.log"
dir "/data/redis"
sentinel auth-pass master6490 Sdkfjdksfdksf_d@Redddis20881
sentinel config-epoch master6490 22
sentinel leader-epoch master6490 22
sentinel known-replica master6490 192.168.211.7xx 6490
sentinel known-replica master6490 192.168.211.8xx 6490
sentinel known-sentinel master6490 192.168.211.6xx 6800 0502b103233c4d36e89169093d46051ec17bd724
sentinel known-sentinel master6490 192.168.211.7xx 6800 497181c34eb7e77e7d89ccf11e83b995c2edfac3
daemonize yes
bind 0.0.0.0
# Generated by CONFIG REWRITE
protected-mode no
sentinel current-epoch 22

启动sentine

chown -R  appuser:appuser  /usr/local/bin/redis-sentinel
su  -  appuser
chown –R appuser:appuse /data/redis/logs/sentinel.log
/usr/local/bin/redis-sentinel  /data/redis/sentinel.conf  &
# 检查服务状态
/usr/local/bin /redis-cli -h 192.168.211.6xx -p 6800 info sentinel
redis-cli -h 192.168.211.7xx -p 6800 info sentinel
redis-cli -h 192.168.211.8xx -p 6800 info sentinel

将sentinel加入systmctl中

哨兵开机自启

vim /lib/systemd/system/redis-sentinel.service
[Unit]
Description=redis-sentinel
After=redis-ms.service
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-sentinel /data/redis/sentinel.conf –daemonize no
ExecStop=/usr/local/bin/redis-cli –p 哨兵端口号 shutdown 
 [Install]
WantedBy=multi-user.target
# 改变权限
chmod 777 redis-sentinel.service #可不执行
chmod 777 /data/redis/sh/*
# 进程服务重加载
systemctl daemon-reload

# 开机启动哨兵
systemctl enable redis-sentinel.service
# 启动哨兵
systemctl start redis-sentinel.service
# 关闭哨兵
systemctl stop redis-sentinel.service

四、Redis 主从复制、哨兵和集群原理与区别

简介

谈到Redis服务器的高可用,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。
哨兵(Sentinel):可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能。
复制(Replication):则是负责让一个Redis服务器可以配备多个备份的服务器。
Redis正是利用这两个功能来保证Redis的高可用
哨兵
哨兵是Redis集群架构中非常重要的一个组件,哨兵的出现主要是解决了主从复制出现故障时需要人为干预的问题。
Redis哨兵主要功能
(1)集群监控:负责监控Redis master和slave进程是否正常工作
(2)消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
(3)故障转移:如果master node挂掉了,会自动转移到slave node上
(4)配置中心:如果故障转移发生了,通知client客户端新的master地址
Redis哨兵的高可用
原理:当主节点出现故障时,由Redis Sentinel自动完成故障发现和转移,并通知应用方,实现高可用性。

  1. 哨兵机制建立了多个哨兵节点(进程),共同监控数据节点的运行状况。
  2. 同时哨兵节点之间也互相通信,交换对主从节点的监控状况。
  3. 每隔1秒每个哨兵会向整个集群:Master主服务器+Slave从服务器+其他Sentinel(哨兵)进程,发送一次ping命令做一次心跳检测。
    这个就是哨兵用来判断节点是否正常的重要依据,涉及两个新的概念:主观下线和客观下线。
    主观下线:一个哨兵节点判定主节点down掉是主观下线。
    客观下线:只有半数哨兵节点都主观判定主节点down掉,此时多个哨兵节点交换主观判定结果,才会判定主节点客观下线。
    基本上哪个哨兵节点最先判断出这个主节点客观下线,就会在各个哨兵节点中发起投票机制Raft算法(选举算法),最终被投为领导者的哨兵节点完成主从自动化切换的过程。
    Redis 复制(Replication)
    Redis为了解决单点数据库问题,会把数据复制多个副本部署到其他节点上,通过复制,实现Redis的高可用性,实现对数据的冗余备份,保证数据和服务的高度可靠性。

①从数据库向主数据库发送sync(数据同步)命令。
②主数据库接收同步命令后,会保存快照,创建一个RDB文件。
③当主数据库执行完保持快照后,会向从数据库发送RDB文件,而从数据库会接收并载入该文件。
④主数据库将缓冲区的所有写命令发给从服务器执行。
⑤以上处理完之后,之后主数据库每执行一个写命令,都会将被执行的写命令发送给从数据库。
注意:在Redis2.8之后,主从断开重连后会根据断开之前最新的命令偏移量进行增量复制

Redis 主从复制、哨兵和集群三者区别
主从复制是为了数据备份,哨兵是为了高可用,Redis主服务器挂了哨兵可以切换,集群则是因为单实例能力有限,搞多个分散压力,简短总结如下:
主从模式:备份数据、负载均衡,一个Master可以有多个Slaves。
sentinel发现master挂了后,就会从slave中重新选举一个master。
cluster是为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器。
sentinel着眼于高可用,Cluster提高并发量。

  1. 主从模式:读写分离,备份,一个Master可以有多个Slaves。
  2. 哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。
  3. 集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值