本文共 8325 字,大约阅读时间需要 27 分钟。
采用主从架构的模式,可以实现当主redis进行数据存储操作时,从redis也同样进行存储,实现了数据的备份;再结合哨兵模式,监控所有redis节点,当主redis宕机后,如果超过一半数量的哨兵都检测到主宕机,就会在从redis中选举出新的主redis,于是从redis切换为新的主服务器,继续提供redis服务,解决了单点故障的问题。
哨兵模式原理
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。所以整个运行哨兵的集群的数量不得少于3个节点。哨兵模式的作用
① 监控 不断的检查master和slave是否正常运行。 master存活检测、master与slave运行情况检测 ② 通知(提醒) 当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。 ③ 自动故障转移 断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址 PS:哨兵也是一台redis服务器,只是不提供数据服务 哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的redis工作节点是否正常,当master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个master的确出现问题,然后会通知哨兵间,然后从slaves中选取一个作为新的master三台服务器都安装redis,安装方法
修改配置文件(三个节点都需要修改)
主机名 | ip |
---|---|
master | 192.168.158.10 |
slave | 192.168.158.20 |
slave | 192.168.158.30 |
所有服务器上安装,在master上演示
[root@server1 ~]# tar xf redis-5.0.7.tar.gz [root@server1 ~]# cd redis-5.0.7/[root@server1 redis-5.0.7]# make[root@server1 redis-5.0.7]# make PREFIX=/usr/local/redis install[root@server1 redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/[root@server1 redis-5.0.7]# cd utils/[root@server1 utils]# ./install_server.shWelcome to the redis service installerThis script will help you easily set up a running redis serverPlease select the redis port for this instance: [6379] Selecting default: 6379Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.confPlease select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.logPlease select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379Please select the redis executable path [/usr/local/bin/redis-server] Selected config:Port : 6379Config file : /etc/redis/6379.confLog file : /var/log/redis_6379.logData dir : /var/lib/redis/6379Executable : /usr/local/bin/redis-serverCli Executable : /usr/local/bin/redis-cliIs this ok? Then press ENTER to go on or Ctrl-C to abort.Copied /tmp/6379.conf => /etc/init.d/redis_6379Installing service...Successfully added to chkconfig!Successfully added to runlevels 345!Starting Redis server...Installation successful!
[root@server1 ~]# vim /etc/redis/6379.conf#70行 修改监听地址为192.168.158.10(在实验环境使用),现网环境建议绑定从服务器IP地址bind 192.168.158.10#136行 开启守护进程daemonize yes#171行 修改日志文件目录logfile /var/log/redis_6379.log#263行 修改工作目录dir /var/lib/redis/6379#700行 开启AOF持久化功能appendonly yes[root@master utils]# /etc/init.d/redis_6379 restart #开启Redis[root@server1 ~]# netstat -anpt | grep redistcp 0 0 192.168.158.10:6379 0.0.0.0:* LISTEN 11447/reds-server
vim /etc/redis/6379.conf#70行 修改监听地址为192.168.158.20(在实验环境使用),现网环境建议绑定从服务器IP地址bind 192.168.158.20#136行 开启守护进程daemonize yes#171行 修改日志文件目录logfile /var/log/redis_6379.log#263行 修改工作目录dir /var/lib/redis/6379#700行 开启AOF持久化功能appendonly yes#287行 修改IP和端口replicaof 192.168.158.10 6379[root@client1 utils]# netstat -anpt | grep redistcp 0 0 192.168.158.20:6379 0.0.0.0:* LISTEN 19152/redis-server tcp 0 0 192.168.158.20:42646 192.168.158.10:6379 ESTABLISHED 19152/redis-server
查看master日志
[root@master utils]# /etc/init.d/redis_6379 restart #开启Redis[root@server1 utils]# redis-cli -h 192.168.158.10 -p 6379192.168.158.10:6379> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.158.20,port=6379,state=online,offset=490,lag=1slave1:ip=192.168.158.30,port=6379,state=online,offset=490,lag=1
[root@server1 ~]# vi /var/log/redis_6379.log #省略部分11447:M 11 Nov 2020 21:50:41.027 * Ready to accept connections11447:M 11 Nov 2020 21:53:24.410 * Replica 192.168.158.20:6379 asks for synchronization11447:M 11 Nov 2020 21:53:24.410 * Full resync requested by replica 192.168.158.20:637911447:M 11 Nov 2020 21:53:24.410 * Starting BGSAVE for SYNC with target: disk11447:M 11 Nov 2020 21:53:24.411 * Background saving started by pid 1153511535:C 11 Nov 2020 21:53:24.417 * DB saved on disk11535:C 11 Nov 2020 21:53:24.418 * RDB: 4 MB of memory used by copy-on-write11447:M 11 Nov 2020 21:53:24.476 * Background saving terminated with success11447:M 11 Nov 2020 21:53:24.477 * Synchronization with replica 192.168.158.20:6379 succeeded11447:M 11 Nov 2020 21:55:32.438 * Replica 192.168.158.30:6379 asks for synchronization11447:M 11 Nov 2020 21:55:32.438 * Full resync requested by replica 192.168.158.30:637911447:M 11 Nov 2020 21:55:32.439 * Starting BGSAVE for SYNC with target: disk11447:M 11 Nov 2020 21:55:32.439 * Background saving started by pid 1156511565:C 11 Nov 2020 21:55:32.441 * DB saved on disk11565:C 11 Nov 2020 21:55:32.441 * RDB: 4 MB of memory used by copy-on-write11447:M 11 Nov 2020 21:55:32.465 * Background saving terminated with success11447:M 11 Nov 2020 21:55:32.465 * Synchronization with replica 192.168.158.30:6379 succeeded
master192.168.158.10:6379> set name suxiOK192.168.158.10:6379> set score 77OK192.168.158.10:6379> keys *1) "score"2) "name"slave1[root@client1 utils]# redis-cli -h 192.168.158.20192.168.158.20:6379> keys *1) "score"2) "name"192.168.158.20:6379> get name"suxi"slave2[root@server3 utils]# redis-cli -h 192.168.158.30192.168.158.30:6379> keys *1) "name"2) "score"192.168.158.30:6379> get score"77"
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
哨兵模式的作用
不断的检查master和slave是否正常运行。master存活检测、master与slave运行情况检测
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
PS:哨兵也是一台redis服务器,只是不提供数据服务
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的redis工作节点是否正常,当master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个master的确出现问题,然后会通知哨兵间,然后从slaves中选取一个作为新的master,至少需要3个或3个以上服务器
所有节点都需要修改
[root@master ~]# vi redis-5.0.7/sentinel.conf17行/protected-mode no #关闭保护模式26行/daemonize yes #指定sentinel为后台启动36行/logfile "/var/log/sentinel.log" #指定日志存放路径65行/dir "/var/lib/redis/6379" #指定数据库存放路径84行/sentinel monitor mymaster 20.0.0.10 6379 2 #至少几个哨兵检测到主服务器故障了,才会进行故障迁移,全部指向masterIP113行/sentinel down-after-milliseconds mymaster 30000 #判定服务器down掉的时间周期,默认30000毫秒(30秒)146行/sentinel failover-timeout mymaster 180000 #故障节的的最大超时时间为180000(180秒)
先启master,再启slave
[root@client1 ~]# redis-sentinel redis-5.0.7/sentinel.conf &[1] 11412[root@server1 ~]# redis-cli -h 192.168.158.10 -p 26379 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.158.10:6379,slaves=2,sentinels=1[1]+ 完成 redis-sentinel redis-5.0.7/sentinel.conf[root@client1 ~]# redis-sentinel redis-5.0.7/sentinel.conf &[1] 19227[root@client1 ~]# redis-cli -h 192.168.158.20 -p 26379 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.158.10:6379,slaves=2,sentinels=2[1]+ 完成 redis-sentinel redis-5.0.7/sentinel.conf[root@server3 ~]# redis-sentinel redis-5.0.7/sentinel.conf &[1] 10647[root@server3 ~]# redis-cli -h 192.168.158.30 -p 26379 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.158.10:6379,slaves=2,sentinels=3[1]+ 完成 redis-sentinel redis-5.0.7/sentinel.conf
查看master进程号[root@server1 ~]# ps -ef | grep redisroot 11412 1 0 23:11 ? 00:00:01 /usr/local/bin/redis-server 127.0.0.1:6379root 11719 1 0 23:27 ? 00:00:00 redis-sentinel *:26379 [sentinel]root 11764 11481 0 23:32 pts/1 00:00:00 grep --color=auto redis[root@server1 ~]# kill -9 11412也可查看状态
[root@server1 ~]# redis-cli -p 26379 info Sentinel# Sentinelsentinel_masters:1sentinel_tilt:0sentinel_running_scripts:0sentinel_scripts_queue_length:0sentinel_simulate_failure_flags:0master0:name=mymaster,status=ok,address=192.168.158.20:6379,slaves=2,sentinels=3
转载地址:http://kfdaf.baihongyu.com/