Redis基础之主从复制与sentinel实现
2017-07-24 17:16
621 查看
Redis基础之主从复制与sentinel实现
先了解分布式系统两个基础理论:CAP/BASE CAP: C:多个数据节点上的数据一致; A:用户发出请求后的有限时间范围内返回结果; P:network partition,网络发生分区后,服务是否依然可用; CAP理论:一个分布式系统不可能同时满足C、A、P三个特性,最多可同时满足其中两者;对于分布式系统满足分区容错性几乎是必须的。 AP: 常用 C:弱一致性; BASE:BA,S,E,基于CAP演化而来 BA:Basically Available,基本可用; S:Soft state,软状态/柔性事务,即状态可以在一个时间窗口内是不同步的; E:Eventually consistency,最终一致性; Redis本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库,但是他的数据可以持久化的保存在磁盘上,解决了服务重启后数据不丢失的问题,他的值可以是string(字符串)、list(列表)、sets(集合)或者是ordered sets(被排序的集合),所有的数据类型都具有push/pop、add/remove、执行服务端的并集、交集、两个sets集中的差别等等操作,这些操作都是具有原子性的,Redis还支持各种不同的排序能力 Redis 2.0更是增加了很多新特性,如:提升了性能、增加了新的数据类型、更少的利用内存(AOF和VM) Redis支持绝大部分主流的开发语言,如:C、Java、C#、PHP、Perl、Python、Lua、Erlang、Ruby等等 Redis数据库:开源、内存存储、数据结构存储、数据库、缓存、消息队列; 数据结构:字符串、列表(数组)、hashes(关联数组)、集合、有序集合、bitmaps、hyperloglogs、空间索引 支持内建的复制、Lua scripting、LRU、事务、持久存储、高可用(Sentinel,Redis Cluster) Redis数据存储格式为:K/V key:直接ASCII字符串 value:strings, lists, hashes, sets, sorted sets, bitmaps, hyperloglogs 本地连接直接使用redis-cli命令,使用help+空格+两次tab键可以查看相关指令使用方法,help使用如下: "help @<group> "help <command> "help <tab> "quit" 退出 这里不进行指令的解释说明,请自行使用help指令获取。 Yum安装:yum install -y redis 版本为:3.2.3 程序环境: 配置文件:/etc/redis.conf 主程序:/usr/bin/redis-server 客户端:/usr/bin/redis-cli Unit File:/usr/lib/systemd/system/redis.service 数据目录:/var/lib/redis 配置/etc/redis.conf和使用Redis: 基本配置项 网络配置项 持久化相关配置 复制相关的配置 安全相关配置 Limit相关的配置 SlowLog慢日志相关的配置 INCLUDES 包含其它配置文件配置 Advanced配置 通用配置项: daemonize, supervised, loglevel, pidfile, logfile, databases:设定数据库数量,默认为16个,每个数据库的名字均为整数,从0开始编号,默认操作的数据库为0; 切换数据库的方法: SELECT <dbid> 网络配置项: bind IP port PORT protected-mode tcp-backlog unixsocket timeout:连接的空闲超时时长; 安全配置: requirepass <PASSWORD> rename-command <COMMAND> <NEW_CMND_NAME> 在AOF或Replication环境中,不推荐使用; Limits相关的配置: maxclients maxmemory <bytes> maxmemory-policy noeviction 淘汰策略:volatile-lru, allkeys-lru, volatile-random, allkeys-random, volatile-ttl, noeviction maxmemory-samples 5 淘汰算法运行时的采样样本数; SlowLog相关的配置: slowlog-log-slower-than 10000 单位是微秒; slowlog-max-len 128 SlowLog记录的日志最大条目; ADVANCED配置: hash-max-ziplist-entries 512 hash-max-ziplist-value 64 设置ziplist的键数量最大值,每个值的最大空间; Redis的持久化: RDB:snapshotting, 二进制格式;按事先定制的策略,周期性地将数据从内存同步至磁盘;数据文件默认为dump.rdb; 客户端显式使用SAVE或BGSAVE命令来手动启动快照保存机制; SAVE:同步,即在主线程中保存快照,此时会阻塞所有客户端请求; BGSAVE:异步; AOF:Append Only File, fsync 记录每次写操作至指定的文件尾部实现的持久化;当redis重启时,可通过重新执行文件中的命令在内存中重建出数据库; BGREWRITEAOF:AOF文件重写; 不会读取正在使用AOF文件,而是通过将内存中的数据以命令的方式保存至临时文件中,完成之后替换原来的AOF文件; RDB相关的配置: 方法:save <seconds> <changes> save 900 1 save 300 10 save 60 10000 表示:三个策略满足其中任意一个均会触发SNAPSHOTTING操作;900s内至少有一个key有变化,300s内至少有10个key有变化,60s内至少有1W个key发生变化; stop-writes-on-bgsave-error yes dump操作出现错误时,是否禁止新的写入操作请求; rdbcompression yes 是否压缩 rdbchecksum yes 检验校验和 dbfilename dump.rdb:指定rdb文件名 *dir /var/lib/redis:rdb文件的存储路径 AOF相关的配置 *appendonly no appendfilename "appendonly.aof" *appendfsync 指定同步操作模式 no:redis不执行主动同步操作,而是OS进行; everysec:每秒一次; always:每语句一次; no-appendfsync-on-rewrite no 是否在后台执行aof重写期间不调用fsync,默认为no,表示调用; auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb 上述两个条件同时满足时,方会触发重写AOF;与上次aof文件大小相比,其增长量超过100%,且大小不少于64MB; 注意:持久机制本身不能取代备份;应该制订备份策略,对redis库定期备份 RDB与AOF同时启用: (1) BGSAVE和BGREWRITEAOF不会同时进行; (2) Redis服务器启动时用持久化的数据文件恢复数据,会优先使用AOF;
主从复制
特点: 一个Master可以有多个slave主机,支持链式复制; Master以非阻塞方式同步数据至slave主机; 配置(最小配置)master 节点: /etc/redis.conf内修改一下两项: Bind 172.16.253.190 #监听本机地址,0.0.0.0本机可用地址 Requirepass redispass #远程登录密码,用于从复制主的数据 配置slave节点: redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT> redis-cli> CONFIG SET masterauth <PASSWORD> 或在配置文件/etc/redis.conf中REPLICATION段增加以下的两行就可以: slaveof 172.16.253.190 6379 #此处为主服务的IP PORT masterauth password #此处密码为主服务的访问密码 辅助配置: requirepass password #远程访问当前节点的密码 slave-serve-stale-data yes slave-read-only yes #从节点只读 *repl-diskless-sync no #同步数据时使用方式 no, Disk-backed, Diskless 新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization",此时其同步方式有两种style: Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点; Diskless:主节占新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段; repl-diskless-sync-delay 5 启动前延迟时间 repl-ping-slave-period 10 repl-disable-tcp-nodelay no tcp发送信息不延时,类似nginx的nodelay repl-backlog-size 1mb 同步时等待队列大小 *slave-priority 100 复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举; min-slaves-to-write 3:主节点仅允许其能够通信的从节点数量大于等于此处的值时接受写操作; min-slaves-max-lag 10:从节点延迟时长超出此处指定的时长时,主节点会拒绝写入操作; 配置完成后启动redis服务,可查看info指令显示信息的Replication段的信息,确定从服务信息,如下图:
主从模型:
主机数据改变,从机会把数据复制到从机,如下:
sentinel:
主要完成三个功能:监控、通知、自动故障转移 故障切换master时选举协议:流言协议、投票协议 配置选项: port 26379 sentinel monitor <master-name> <ip> <redis-port> <quorum> <quorum>表示sentinel集群的quorum机制,即至少有quorum个sentinel节点同时判定主节点故障时,才认为其真的故障; sentinel auth-pass <master-name> <password> sentinel down-after-milliseconds <master-name> <milliseconds> 监控到指定的集群的主节点异常状态持续多久方才将标记为“故障”; sentinel parallel-syncs <master-name> <numslaves> 指在failover过程中,能够被sentinel并行配置的从节点的数量; sentinel failover-timeout <master-name> <milliseconds> sentinel必须在此指定的时长内完成故障转移操作,否则,将视为故障转移操作失败; sentinel notification-script <master-name> <script-path> 通知脚本,此脚本被自动传递多个参数; s_down: subjectively down 主观下线,指的是单个 Sentinel 实例对服务器做出的下线判断 o_down: objectively down 客观下线,指的是多个 Sentinel 实例在对同一个服务器做出 SDOWN 判断, 并且通过SENTINEL is-master-down-by-addr 命令互相交流之后, 得出的服务器下线判断 启动服务:systemctl start redis-sentinel或systemctl start redis-sentinel
Sentinel信息:
~]#redis-cli –h SENTINEL_HOST/IP –p 263790(默认端口) redis-cli> info #最后一行 master0:name=master,status=ok,address=172.16.251.3:6379,slaves=2,sentinels=1
主机信息:
~]#redis-cli –h MASTER_HOST/IP redis-cli> info # Replication role:master connected_slaves:2 slave0:ip=172.16.253.190,port=6379,state=online,offset=138828,lag=1 slave1:ip=172.16.252.140,port=6379,state=online,offset=138828,lag=1
从机信息:
~]#redis-cli –h SLAVE_HOST/IP redis-cli> info # Replication role:slave master_host:172.16.251.3 master_port:6379 master_link_status:up
sentinel指令: SENTINEL masters 主节点信息 SENTINEL slaves <MASTER_NAME> 主节点下的从节点信息 SENTINEL failover <MASTER_NAME> 手动将主节点下线 使用:sentinel failover master_name #手动切换master。 注意:各主机的远程访问密码要一致,因为切换主机后从机要请求新master数据。 /etc/redis.conf的Slaveof的值会随sentinel failover master_name变化,始终指向当前时间点的master主机
当前master配置文件:
bind 172.16.251.3 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile "/var/run/redis/redis.pid" loglevel notice logfile "/var/log/redis/redis.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/var/lib/redis" masterauth "redispass" #一致 slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 90 requirepass "redispass" appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
slave1设置
bind 172.16.253.190 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile "/var/run/redis/redis.pid" loglevel notice logfile "/var/log/redis/redis.log" databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename "dump.rdb" dir "/var/lib/redis" slaveof 172.16.251.3 6379 #切换master变化 masterauth "redispass" slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 110 requirepass "redispass" appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
slave2设置
bind 172.16.252.140 protected-mode yes port 6379 tcp-backlog 511 timeout 0 tcp-keepalive 300 daemonize no supervised no pidfile /var/run/redis/redis.pid loglevel notice logfile /var/log/redis/redis.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename dump.rdb dir /var/lib/redis slaveof 172.16.251.3 6379 #切换master变化 masterauth redispass slave-serve-stale-data yes slave-read-only yes repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no slave-priority 100 requirepass redispass appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
sentinel设置
[root@webhost ~]# grep '^[[:alpha:]]' /etc/redis-sentinel.conf port 26379 dir "/tmp" sentinel myid 21c007ee7ab1e817585d78fb97fa902a7da8a9cb sentinel monitor master 172.16.251.3 6379 1 #切换master变化 sentinel failover-timeout master 5000 sentinel auth-pass master redispass sentinel config-epoch master 11 logfile "/var/log/redis/sentinel.log" sentinel leader-epoch master 11 sentinel known-slave master 172.16.252.140 6379 #切换master变化 sentinel known-slave master 172.16.253.190 6379 #切换master变化 sentinel current-epoch 11
相关文章推荐
- redis应用之使用sentinel实现主从复制高可用
- 使用Sentinel机制实现Redis高可用主从复制
- redis应用之使用sentinel实现主从复制高可用 推荐
- 实现redis(主从,sentinel,cluster)的主从复制集群
- redis 实现主从复制
- Redis的Replication(主从复制)和sentinel机制
- redis实现主从复制和高可用(主从切换)
- redis实现主从复制和高可用(主从切换)
- 在多台服务器上简单实现Redis的数据主从复制
- 高可用架构篇--MyCat在MySQL主从复制基础上实现读写分离
- 【Redis基础】主从复制
- 在多台服务器上简单实现Redis的数据主从复制
- 配置redis主从复制和sentinel模式
- 分布式架构学习之:MyCat在MySQL主从复制基础上实现读写分离
- 在多台服务器上简单实现Redis的数据主从复制
- Redis集群方案之Twemproxy+HAProxy+Keepalived+Sentinel+主从复制(待实践)
- CentOS7单节点部署redis主从复制和sentinel
- redis主从复制和集群实现原理
- MySQL主从复制与读写分离在windows系统下的实现(amoeba3.0+mysql5.1实现)因版本问题,本文在原来文章基础上有更改并且本人已经测试成功
- 【Redis专题】实现redis的主从复制