1.主从复制的问题
(1)主从复制中,如果master宕机了,必须手动去选出一个master,再继续转移数据到改master上。
(2)读写能力受到限制。只有一个master可以存储数据,其他的只能当作读数据库。
2.redis sentinel
(1)client访问redis时,在client访问地址是sentinel集群的一个sentinel(这里的sentinel其实就类似于zookeeper监控hadoop组件)
(2)sentinel会对master进行一个调节,sentinel可以区分谁是master,谁是slave。一旦出现master宕机,sentinel就会转移故障。
(1)一旦master宕机了,就会选举出一个新的master,选举算法,后面再讲解。
(2)如果选出新的master以后,原来的master又重新启动了,就让它成为一个slave去连接新的master。
一个sentinel可以监控多个master-slave集群,每套master-slave会有一个master-name作为标识。
3.redis 主从配置
在一个机器上模拟3台redis,配置的架构图。
在redis的config目录下:(需要手动新建config文件)
vi redis-7000.conf
redis-7000.conf的内容
port 7000
daemonize yes
pidfile /usr/local/redis/data/redis-7000.pid
logfile "/usr/local/redis/logs/redis-7000.log"
dir "/usr/local/redis/data" #工作目录,也就是rdb文件存放的地方
复制
sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf #并将文件中的7000全局替换成7001
sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf
查看配置
设置redis-7000为主节点
echo "slaveof 127.0.0.1 7000" >> redis-7001.conf
echo "slaveof 127.0.0.1 7000" >> redis-7002.conf
启动redis-7000
用同样的方式启动其他配置
redis-server redis-7001.conf
redis-server redis-7002.conf
查看后台进程
ps -ef | grep redis-server | grep 700
查看主从关系
redis-cli -p 7000 info replication
4. redis sentinel配置
将sentinel.conf拷贝到config目录
cp sentinel.conf config/
删除所有的注释
cat sentinel.conf | grep -v "#" | grep -v "^$"
写入到配置文件
cat sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf
配置redis-sentinel-26379.conf,在redis-sentinal中我们只需要配置master就行,redis-sentinel会通过info replication自动获取从节点信息
redis-sentinel中mymaster 用于标识不同的master-slave集群
port 26379
dir /usr/local/redis/data
logfile "/usr/local/redis/logs/redis-sentinel-26379.log"
sentinel monitor mymaster 127.0.0.1 7000 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
daemonize yes
启动redis-sentinel
redis-sentinel redis-sentinel-26379.conf
查看是否启动
ps -ef | grep redis-sentinel
连接redis-sentinel
redis-cli -p 26379
直接在客户端使用info
127.0.0.1:26379> info
# Server
redis_version:4.0.2
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:295a0ed66cd7604a
redis_mode:sentinel
os:Linux 2.6.32-573.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
atomicvar_api:sync-builtin
gcc_version:4.4.7
process_id:3657
run_id:e0de9acefe48b6f5b0bacd58340037f96b9cb6cb
tcp_port:26379
uptime_in_seconds:199
uptime_in_days:0
hz:11
lru_clock:8666370
executable:/usr/local/redis/config/redis-sentinel
config_file:/usr/local/redis/config/redis-sentinel-26379.conf
# Clients
connected_clients:1
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# CPU
used_cpu_sys:0.20
used_cpu_user:0.17
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
# Stats
total_connections_received:1
total_commands_processed:0
instantaneous_ops_per_sec:0
total_net_input_bytes:31
total_net_output_bytes:32
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0
# 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=127.0.0.1:7000,slaves=2,sentinels=1
退出客户端
此时再查看,配置信息已经更新,配置文件中自动生成了slave相关的信息
cat redis-sentinel-26379.conf
变成redis-sentinel集群
生成其他两个sentinel的配置
sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
启动这两个sentinel
redis-sentinel redis-sentinel-26380.conf
redis-sentinel redis-sentinel-26381.conf
查看
ps -ef | grep redis-sentinel | grep 263
连接查看
redis-cli -p 26379
127.0.0.1:26379> info #在redis客户端中使用该命令行
5. redis-sentinel内部原理
三个定时任务保证master,slave和sentinel之间数据的交互
6.sentinel的主观下线和客观下线
下面是客观下线和主观下线的命令:
sentinel is-master-down-by-addr可以询问其他sentinel节点是否也认为该master或者slave也需要客观下线。
7.领导者选举
为了完成故障转移,需要选举一个sentinel去完成领导者的选举。
sentinel is-master-down-by-addr命令的另一个作用:选举成为领导者
8.sentinel完成故障转移
那什么是“合适的”节点,可以被作为master呢?
ps:runId最小的节点就是启动最早的节点。
9.手动下线
手动下线master,直接在某个sentinel上执行,sentinel会自动完成故障转移的过程
节点上线