1. Redis+Sentinel集群介绍
(1)Sentinel优势
Redis主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况。
当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。
(2) Sentinel特点
* sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
* 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
* sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
* 多sentinel配置的时候,sentinel之间也会自动监控
* 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
* 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
* sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
(3)Sentinel工作机制
* 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令
* 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。
* 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
* 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线
* 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令
* 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次
* 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
2.环境准备
节点IP | 系统版本 | 软件名称--版本号 |
172.16.4.48 -Master | Centos7.4 | Redis+sentinel--5.0.4 |
172.16.4.49 -Slave | Centos7.4 | Redis+sentinel--5.0.4 |
172.16.4.50 -Slave | Centos7.4 | Redis+sentinel--5.0.4 |
3.主从模式搭建
(1)主从集群介绍
在部署redis哨兵模式集群前先搭建主从集群,在此基础上哨兵模式实现主节点故障自动转移功能。
主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。
其中主从复制有如下特点:
* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
* 从数据库一般都是只读的,并且接收主数据库同步过来的数据
* 一个master可以拥有多个slave,但是一个slave只能对应一个master
* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
* master挂了以后,不会在slave节点中重新选一个master
(2)主从集群工作机制
当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
安全设置:
当master节点设置密码后,
客户端访问master需要密码
启动slave需要密码,在配置文件中配置即可
客户端访问slave不需要密码
(3)redis安装包下载
3台服务器同步以下安装步骤:
cd /usr/local/src/
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar zxvf redis-5.0.4.tar.gz
mv redis-5.0.4 redis
cd /usr/local/src/redis && make && make install
(4)制作启动脚本
3台服务器同步以下安装步骤:
vim /usr/lib/systemd/system/redis.service
编辑添加如下代码:
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
ExecStart=/usr/local/bin/redis-server /usr/local/src/redis/redis.conf --supervised systemd
ExecStop=/usr/libexec/redis-shutdown
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
(5)修改redis配置文件
以下操作在172.16.4.48主节点服务器修改:
mkdir -p /data/redis
chown –R redis.redis /data/redis
chown –R redis.redis /usr/local/src/redis
vim /usr/local/redis/redis.conf
更改如下参数:
bind 0.0.0.0
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /data/redis #数据库备份文件存放目录
masterauth redis123 #slave连接master密码,master可省略
requirepass redis123 #设置master连接密码,slave可省略
appendonly yes #在/data/redis/目录生成appendonly.aof文件
执行如下命令系统参数调优:
# echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
# sysctl -p
以下操作在172.16.4.49/50服务器上修改:
mkdir -p /data/redis
chown –R redis.redis /data/redis
chown –R redis.redis /usr/local/src/redis
vim /usr/local/redis/redis.conf
更改如下参数:
ind 0.0.0.0
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /data/redis #数据库备份文件存放目录
replicaof 172.16.4.48 6379
masterauth redis123 #slave连接master密码,master可省略
requirepass redis123 #设置master连接密码,slave可省略
appendonly yes #在/data/redis/目录生成appendonly.aof文件
执行如下命令系统参数调优:
# echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
# sysctl –p
(6)启动redis服务
# systemctl start redis
查看集群状态:
备注:正常主节点是172.16.4.48,这里的截图是模拟48主节点故障转移后选举的50从节点作为主节点
4.Sentinel集群部署
(1)修改sentinel配置文件
vim /usr/local/src/redis/sentinel.conf
所有节点修改如下配置参数:
daemonize yes
logfile "/usr/local/src/redis/sentinel.log"
dir "/usr/local/src/redis/sentinel" #sentinel工作目录
sentinel monitor mymaster 172.16.4.48 6379 2 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
sentinel auth-pass mymaster redis123
protected-mode no #开启会有很多限制
备注:这里需要注意,sentinel auth-pass mymaster redis123
需要配置在sentinel monitor mymaster 172.16.4.48 6379 2
下面,否则启动报错:
(2)启动sentinel
# mkdir /usr/local/src/redis/sentinel && chown -R redis:redis /usr/local/src/redis
# /usr/local/bin/redis-sentinel /usr/local/src/redis/sentinel.conf
查看日志:
tail -1000f /usr/local/src/redis/sentinel.log
可以看到172.16.4.49和172.16.4.50已经加入到集群节点中
5.模拟集群宕机
(1)关闭主节点
172.16.4.48主节点执行:
# systemctl stop redis
查看日志:
tail -1000f /usr/local/src/redis/sentinel.log
从日志中可以看到,master已经从172.16.4.48转移到172.16.4.50上去了
(2)查看redis集群状态
分别执行如下命令查看redis集群各节点信息:
redis-cli -h 172.16.4.48 -a redis123 info replication
redis-cli -h 172.16.4.49 -a redis123 info replication
redis-cli -h 172.16.4.50 -a redis123 info replication
故障转移后,sentinel在选举master后会修改redis.conf配置文件参数
replicaof 172.16.4.50 6379
(3)查看sentinel集群信息
分别执行如下命令查看sentinel集群各节点信息:
redis-cli -h 172.16.4.48 -p 26379 info
redis-cli -h 172.16.4.49 -p 26379 info
redis-cli -h 172.16.4.50 -p 26379 info
分别显示如下信息:
这里也可以看到主节点已经变更为172.16.4.50,2个从节点,3个sentinel节点
6.可能出现的问题
*当哨兵模式集群部署完毕后一定要通过命令查看下哨兵是否已经识别主节点信息,不然主节点宕机后不会故障自动转移。
*通过此命令查看哨兵节点信息redis-cli -h 172.16.4.48 -p 26379 info
*通过此命令查看redis主从集群信息redis-cli -h 172.16.4.48 -a redis123 info replication
*通过日志排查:
tail -1000f /usr/local/src/redis/sentinel.log
tail -1000f /usr/local/src/redis/redis.log
您还未添加分享代码,请到主题选项中,添加百度分享代码!
您可以选择一种方式赞助本站
支付宝转账赞助
支付宝扫一扫赞助
微信钱包扫描赞助