redis---哨兵模式
步骤
搭建redis哨兵模式的大致步骤为
- 安装依赖 yum install gcc
- 安装redis
- 修改redis.conf配置文件
- 修改sentinel.conf配置文件
哨兵模式主要做了两件事
- 监控主数据库和从数据库是否正常运行。
- 主数据库出现故障时自动将从数据库转换为主数据库。
1. 安装redis
下载地址:https://redis.io/download
解压: tar zxvf redis-4.0.10.tar.gz
编译安装
# 1. 进入到解压后的文件夹 cd /usr/redis-4.0.10 # 2. 执行make命令 make # 如果执行make命令报错,error: jemalloc/jemalloc.h: No such file or directory
,则需要指定内存管理方式
make MALLOC=libc
# 3. 进入
cd /usr/redis-4.0.10/src
make install
启动服务端测试
cd /usr/redis-4.0.10/src
./redis-server ../redis.conf
启动客户端测试
cd /usr/redis-4.0.10/src
./redis-cli
成功进入下一步
配置redis.conf
配置master
1 # NETWORK 设置 2 # 关闭保护模式 3 # 注意:redis3.0.x版本没有该参数, 声明会报错 4 protected-mode no 5 # 绑定IP地址,可以通过ifconfig 获取Ip地址 6 # bind 172.168.3.166 7 # 保持默认值,也可以修改 8 port 6381 9 # Client 端空闲断开连接的时间,0表示不断开 10 # timeout 30 11 # GENERAL 设置 12 # 默认值是no,把值修改为yes,以后台模式运行 13 daemonize yes 14 # 日志文件的位置 15 logfile /usr/redis/log/redis-server_sentinel.log 16 # SNAPSHOTTING 设置 17 # SNAPSHOTTING文件的路径 18 # dir /usr/redis/redisdb 19 # 设置密码 20 masterauth root 21 requirepass root 22 # APPEND ONLY MODE 设置 23 # 默认值是No,意思是使用RDB全量持久化的方式。Yes是使用AOF增量持久化的方式 24 # appendonly yes 25 # appendfsync always 26 # 关闭集群模式 27 # cluster-enabled no
配置slave
# NETWORK 设置 protected-mode no # bind 172.168.3.167 port 6381 # timeout 30 # GENERAL 设置 daemonize yes logfile /usr/redis/log/redis-server_sentinel.log # SNAPSHOTTING 设置 # dir /usr/redis/redisdb # 设置密码 masterauth root requirepass root # REPLICATION 设置 # 主服务器的Ip地址和Port端口号 slaveof 172.168.3.166 6381 # 如果slave 无法与master 同步,设置成slave不可读,方便监控脚本发现问题 # slave-serve-stale-data no # APPEND ONLY MODE 设置 # appendonly yes # appendfsync always # 关闭集群模式 # cluster-enabled no
配置sentinel.conf
# 关闭保护模式,需要将redis.conf中的属性也设置为no protected-mode no # 开启守护线程 daemonize yes # sentinel默认监听26379端口,所以运行前必须确定该端口没有被别的进程占用 bind 127.0.0.1 172.168.3.166 # 对应服务器相应的ip, 也可直接注掉 port 26379 # 工作路径 # dir /usr/redis/sentinel-work # 指明日志文件名 logfile /usr/redis/sentinellog/sentinel.log # 配置监听的IP和port,以及将主服务器判断为失效并下线至少需要几个sentinel的同意 sentinel monitor mymaster1 192.168.3.166 6379 2 # 配置验证密码 sentinel auth-pass mymaster root # 多长时间(默认30秒)不能使用后标记为sdown状态(单位毫秒) # sentinel down-after-milliseconds mymaster 30000 # 指定了最多可以有多少个slave同时对新的master进行同步 # sentinel parallel-syncs mymaster 1 # 指定故障转移超时时间(单位毫秒) # sentinel failover-timeout mymaster 180000
开启防火墙
## 查看防火墙状态,若显示running则为开启防火墙状态 firewall-cmd –state ## 开启防火墙 systemctl start firewalld.service ## 查看已开放端口号 firewall-cmd --list-ports ## 开放指定端口号,下方示例端口号为6379 firewall-cmd --zone=public --add-port=6379/tcp –permanent ## 重启防火墙,如此,端口号才算开放成功 firewall-cmd --reload
# centos防火墙更多配置参考:https://blog.csdn.net/qq_36850813/article/details/91353864
配置完成,接下来开始启动
启动
启动redis
# 指定redis配置文件启动 cd /usr/redis-4.0.10/src ./redis-server ../redis.conf
启动哨兵
# 第一种 cd /usr/redis/redis-4.0.10/src ./redis-sentinel ../sentinel.conf # 第二种 ./redis-server ../sentinel.conf --sentinel # 以上两种方式,都必须指定一个配置文件sentinel.conf; # 如果不指定,将无法启动sentinel
查看集群状态
# 查看集群状态,必须使用ip 和port进行连接, 否者查询不了 ./redis-cli -h 172.168.3.166 -p 6381 -a root 172.168.3.166:6381> info Replication
检查是否安装成功(步骤)
- 只能master写,slave只读
- master写之后,slave可以读取到
- kill掉master,会在slave中重新 分配master
扩展
主从复制的流程
- Slave端在配置文件中添加了slave of指令,于是Slave启动时读取配置文件,初始状态为REDIS_REPL_CONNECT。
- Slave端在定时任务serverCron(Redis内部的定时器触发事件)中连接Master,发送sync命令,然后阻塞等待master发送回其内存快照文件(最新版的Redis已经不需要让Slave阻塞)。
- Master端收到sync命令简单判断是否有正在进行的内存快照子进程,没有则立即开始内存快照,有则等待其结束,当快照完成后会将该文件发送给Slave端。
- Slave端接收Master发来的内存快照文件,保存到本地,待接收完成后,清空内存表,重新读取Master发来的内存快照文件,重建整个内存表数据结构,并最终状态置位为 REDIS_REPL_CONNECTED状态,Slave状态机流转完成。
- Master端在发送快照文件过程中,接收的任何会改变数据集的命令都会暂时先保存在Slave网络连接的发送缓存队列里(list数据结构),待快照完成后,依次发给Slave,之后收到的命令相同处理,并将状态置位为 REDIS_REPL_ONLINE。
参考流程图