一、Redis主从模式配置
1.1、案例拓扑
1.2、环境说明
主机名称 |
IP地址 |
redis版本和角色说明 |
master |
20.0.0.10 |
redis 5.0.7(主) |
slave1 |
20.0.0.20 |
redis 5.0.7(从) |
slave2 |
20.0.0.30 |
redis 5.0.7(从) |
1.3、Redis安装
所有服务器上安装,在master上演示
[root@master ~]# tar zxf redis-5.0.7.tar.gz [root@master ~]# cd redis-5.0.7/ [root@master redis-5.0.7]# make -j2 [root@master redis-5.0.7]# make PREFIX=/usr/local/redis install [root@master redis-5.0.7]# ln -s /usr/local/redis/bin/* /usr/local/bin/ [root@master redis-5.0.7]# cd utils/ [root@master utils]# ./install_server.sh Welcome to the redis service installer This script will help you easily set up a running redis server Please select the redis port for this instance: [6379] Selecting default: 6379 Please select the redis config file name [/etc/redis/6379.conf] Selected default - /etc/redis/6379.conf Please select the redis log file name [/var/log/redis_6379.log] Selected default - /var/log/redis_6379.log Please select the data directory for this instance [/var/lib/redis/6379] Selected default - /var/lib/redis/6379 Please select the redis executable path [/usr/local/bin/redis-server] Selected config: Port : 6379 Config file : /etc/redis/6379.conf Log file : /var/log/redis_6379.log Data dir : /var/lib/redis/6379 Executable : /usr/local/bin/redis-server Cli Executable : /usr/local/bin/redis-cli Is this ok? Then press ENTER to go on or Ctrl-C to abort. Copied /tmp/6379.conf => /etc/init.d/redis_6379 Installing service... Successfully added to chkconfig! Successfully added to runlevels 345! Starting Redis server... Installation successful!
1.4、修改配置文件
1.4.1、master配置文件修改
[root@master src]# vim /etc/redis/6379.conf #69行 修改监听地址为20.0.0.10(在实验环境使用),现网环境建议绑定从服务器IP地址 bind 20.0.0.10 #136行 开启守护进程 daemonize yes #171行 修改日志文件目录 logfile /var/log/redis_6379.log #263行 修改工作目录 dir /var/lib/redis/6379 #699行 开启AOF持久化功能 appendonly yes [root@master utils]# /etc/init.d/redis_6379 restart #开启Redis [root@master utils]# netstat -anpt | grep redis tcp 0 0 20.0.0.10:6379 0.0.0.0:* LISTEN 57685/redis-server
1.4.2、slave1配置文件修改
[root@slave1 src]# vim /etc/redis/6379.conf #69行 修改监听地址为20.0.0.10(在实验环境使用),现网环境建议绑定从服务器IP地址 bind 20.0.0.20 #136行 开启守护进程 daemonize yes #171行 修改日志文件目录 logfile /var/log/redis_6379.log #263行 修改工作目录 dir /var/lib/redis/6379 #699行 开启AOF持久化功能 appendonly yes #287行 修改IP和端口 replicaof 20.0.0.10 6379 [root@slave1 utils]# /etc/init.d/redis_6379 restart #开启Redis [root@slave1 utils]# netstat -anpt | grep redis #查看端口号 tcp 0 0 20.0.0.20:6379 0.0.0.0:* LISTEN 19037/redis-server tcp 0 0 20.0.0.20:34397 20.0.0.10:6379 ESTABLISHED 19037/redis-server
1.4.2、slave2配置文件修改
[root@slave2 src]# vim /etc/redis/6379.conf #69行 修改监听地址为20.0.0.10(在实验环境使用),现网环境建议绑定从服务器IP地址 bind 20.0.0.30 #136行 开启守护进程 daemonize yes #171行 修改日志文件目录 logfile /var/log/redis_6379.log #263行 修改工作目录 dir /var/lib/redis/6379 #699行 开启AOF持久化功能 appendonly yes #287行 修改IP和端口 replicaof 20.0.0.10 6379 [root@slave2 utils]# /etc/init.d/redis_6379 restart #开启Redis [root@slave2 utils]# netstat -anpt | grep redis tcp 0 0 20.0.0.30:6379 0.0.0.0:* LISTEN 59182/redis-server tcp 0 0 20.0.0.30:46648 20.0.0.10:6379 ESTABLISHED 59182/redis-server
1.5、测试效果
1.5.1、验证主从效果(master上看日志)
[root@master utils]# vi /var/log/redis_6379.log ......省略部分内容 57685:M 11 Nov 2020 10:51:17.605 * Replica 20.0.0.20:6379 asks for synchronization #slave1服务器IP 57685:M 11 Nov 2020 10:51:17.605 * Full resync requested by replica 20.0.0.20:6379 57685:M 11 Nov 2020 10:51:17.605 * Starting BGSAVE for SYNC with target: disk 57685:M 11 Nov 2020 10:51:17.606 * Background saving started by pid 57691 57691:C 11 Nov 2020 10:51:17.607 * DB saved on disk 57691:C 11 Nov 2020 10:51:17.607 * RDB: 4 MB of memory used by copy-on-write 57685:M 11 Nov 2020 10:51:17.658 * Background saving terminated with success 57685:M 11 Nov 2020 10:51:17.658 * Synchronization with replica 20.0.0.20:6379 succeeded 57685:M 11 Nov 2020 10:55:07.287 * Replica 20.0.0.30:6379 asks for synchronization #slave2服务器IP 57685:M 11 Nov 2020 10:55:07.287 * Full resync requested by replica 20.0.0.30:6379 57685:M 11 Nov 2020 10:55:07.287 * Starting BGSAVE for SYNC with target: disk 57685:M 11 Nov 2020 10:55:07.288 * Background saving started by pid 57734 57734:C 11 Nov 2020 10:55:07.290 * DB saved on disk 57734:C 11 Nov 2020 10:55:07.290 * RDB: 4 MB of memory used by copy-on-write 57685:M 11 Nov 2020 10:55:07.372 * Background saving terminated with success 57685:M 11 Nov 2020 10:55:07.372 * Synchronization with replica 20.0.0.30:6379 succeeded
1.5.2、master上验证从节点
[root@master utils]# redis-cli -h 20.0.0.10 -p 6379 20.0.0.10:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=20.0.0.20,port=6379,state=online,offset=2702,lag=0 slave1:ip=20.0.0.30,port=6379,state=online,offset=2702,lag=1
1.5.3、插入数据验证
master上插入数据 20.0.0.10:6379> set name lisi OK 20.0.0.10:6379> set score 80 OK 20.0.0.10:6379> keys * 1) "score" 2) "name" 20.0.0.10:6379> get name "lisi" 20.0.0.10:6379> get score "80" slave1上查看 [root@slave1 utils]# redis-cli -h 20.0.0.20 -p 6379 20.0.0.20:6379> keys * 1) "score" 2) "name" 20.0.0.20:6379> get name "lisi" 20.0.0.20:6379> get score "80" slave2上查看 [root@slave2 utils]# redis-cli -h 20.0.0.30 -p 6379 20.0.0.30:6379> keys * 1) "score" 2) "name" 20.0.0.30:6379> get name "lisi" 20.0.0.30:6379> get score "80"
二、Redis哨兵模式
2.1、Redis sentinel介绍
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移。
2.2、哨兵模式的作用
① 监控
不断的检查master和slave是否正常运行。master存活检测、master与slave运行情况检测
② 通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
③ 自动故障转移
断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
PS:哨兵也是一台redis服务器,只是不提供数据服务
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的redis工作节点是否正常,当
master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个master的确出现问题,然后会通知哨兵间,然后从slaves中选取一个作为新的
master,至少需要3个或3个以上服务器
2.3、环境说明
主机名称 | IP地址 | redis版本和角色说明 |
---|---|---|
master | 20.0.0.10:6379 | redis 5.0.7(主) |
slave1 | 20.0.0.20:6379 | redis 5.0.7(从) |
slave2 | 20.0.0.30:6379 | redis 5.0.7(从) |
master | 20.0.0.10:26379 | Sentinel1 |
slave1 | 20.0.0.20:26379 | Sentinel2 |
slave2 | 20.0.0.30:26379 | Sentinel3 |
2.4、哨兵模式配置
所有节点都需要修改
[root@master ~]# vi redis-5.0.7/sentinel.conf 17行/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 #至少几个哨兵检测到主服务器故障了,才会进行故障迁移,全部指向masterIP 113行/sentinel down-after-milliseconds mymaster 30000 #判定服务器down掉的时间周期,默认30000毫秒(30秒) 146行/sentinel failover-timeout mymaster 180000 #故障节的的最大超时时间为180000(180秒)
2.5、启动哨兵模式
[root@master ~]# redis-sentinel redis-5.0.7/sentinel.conf & [1] 58571 [root@slave1 ~]# redis-sentinel redis-5.0.7/sentinel.conf & [1] 19812 [root@slave2 ~]# redis-sentinel redis-5.0.7/sentinel.conf & [1] 59917
2.6、查看哨兵信息
master查看 [root@master ~]# redis-cli -h 20.0.0.10 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=20.0.0.10:6379,slaves=2,sentinels=3 slave1查看 [root@slave1 ~]# redis-cli -h 20.0.0.20 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=20.0.0.10:6379,slaves=2,sentinels=3 slave2上查看 [root@slave2 ~]# redis-cli -h 20.0.0.20 -p 26379 info Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=20.0.0.10:6379,slaves=2,sentinels=3
2.7、故障模拟
查看master进程号 [root@master ~]# ps -ef | grep redis root 57685 1 0 10:51 ? 00:00:06 /usr/local/bin/redis-server 20.0.0.10:6379 root 58567 1 0 12:07 ? 00:00:01 redis-sentinel *:26379 [sentinel] root 58649 58470 0 12:15 pts/1 00:00:00 grep --color=auto redis 杀死master上redis-server的进程号 [root@master ~]# kill -9 57685 #master上redis-server的进程号
2.7.2、验证结果
[root@master ~]# tail -f /var/log/sentinel.log 58567:X 11 Nov 2020 12:18:14.388 # +failover-state-reconf-slaves master mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:14.467 * +slave-reconf-sent slave 20.0.0.20:6379 20.0.0.20 6379 @ mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:14.776 # -odown master mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:15.428 * +slave-reconf-inprog slave 20.0.0.20:6379 20.0.0.20 6379 @ mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:15.428 * +slave-reconf-done slave 20.0.0.20:6379 20.0.0.20 6379 @ mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:15.483 # +failover-end master mymaster 20.0.0.10 6379 58567:X 11 Nov 2020 12:18:15.483 # +switch-master mymaster 20.0.0.10 6379 20.0.0.30 6379 #从master转到了slave2上 58567:X 11 Nov 2020 12:18:15.483 * +slave slave 20.0.0.20:6379 20.0.0.20 6379 @ mymaster 20.0.0.30 6379 58567:X 11 Nov 2020 12:18:15.483 * +slave slave 20.0.0.10:6379 20.0.0.10 6379 @ mymaster 20.0.0.30 6379 58567:X 11 Nov 2020 12:18:45.535 # +sdown slave 20.0.0.10:6379 20.0.0.10 6379 @ mymaster 20.0.0.30 6379 [root@master ~]# redis-cli -p 26379 INFO Sentinel # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=20.0.0.30:6379,slaves=2,sentinels=3
重新启动原旧master
[root@master ~]# /etc/init.d/redis_6379 restart Stopping ... Could not connect to Redis at 127.0.0.1:6379: Connection refused Waiting for Redis to shutdown ... Waiting for Redis to shutdown ... Waiting for Redis to shutdown ... Waiting for Redis to shutdown ... Waiting for Redis to shutdown ... 直接重启无法启动,需要进入/var/run 讲pid文件删除 [root@master run]# rm -rf redis_6379.pid [root@master run]# /etc/init.d/redis_6379 restart /var/run/redis_6379.pid does not exist, process is not running Starting Redis server... [root@master run]# netstat -anpt | grep redis tcp 0 0 20.0.0.10:6379 0.0.0.0:* LISTEN 60732/redis-server tcp 0 0 20.0.0.10:6379 20.0.0.30:43102 ESTABLISHED 60732/redis-server 启动成功