Redis基础之主从复制与sentinel实现

来源:互联网 发布:品牌床垫推荐 知乎 编辑:程序博客网 时间:2024/06/06 08:34

Redis基础之主从复制与sentinel实现

先了解分布式系统两个基础理论:CAP/BASECAP:    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 noappendfilename "appendonly.aof"*appendfsync  指定同步操作模式    no:redis不执行主动同步操作,而是OS进行;    everysec:每秒一次;    always:每语句一次;no-appendfsync-on-rewrite no    是否在后台执行aof重写期间不调用fsync,默认为no,表示调用;auto-aof-rewrite-percentage 100auto-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 PORTmasterauth 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/IPredis-cli> info # Replicationrole:masterconnected_slaves:2slave0:ip=172.16.253.190,port=6379,state=online,offset=138828,lag=1slave1:ip=172.16.252.140,port=6379,state=online,offset=138828,lag=1

从机信息:

~]#redis-cli –h SLAVE_HOST/IPredis-cli> info# Replicationrole:slavemaster_host:172.16.251.3master_port:6379master_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.3protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize nosupervised nopidfile "/var/run/redis/redis.pid"loglevel noticelogfile "/var/log/redis/redis.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump.rdb"dir "/var/lib/redis"masterauth "redispass"  #一致slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 90requirepass "redispass"appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes

slave1设置

bind 172.16.253.190protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize nosupervised nopidfile "/var/run/redis/redis.pid"loglevel noticelogfile "/var/log/redis/redis.log"databases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump.rdb"dir "/var/lib/redis"slaveof 172.16.251.3 6379  #切换master变化masterauth "redispass"slave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 110requirepass "redispass"appendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes

slave2设置

bind 172.16.252.140protected-mode yesport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize nosupervised nopidfile /var/run/redis/redis.pidloglevel noticelogfile /var/log/redis/redis.logdatabases 16save 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename dump.rdbdir /var/lib/redisslaveof 172.16.251.3 6379  #切换master变化masterauth redispassslave-serve-stale-data yesslave-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noslave-priority 100requirepass redispassappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit slave 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10aof-rewrite-incremental-fsync yes

sentinel设置

[root@webhost ~]# grep '^[[:alpha:]]' /etc/redis-sentinel.conf port 26379dir "/tmp"sentinel myid 21c007ee7ab1e817585d78fb97fa902a7da8a9cbsentinel monitor master 172.16.251.3 6379 1  #切换master变化sentinel failover-timeout master 5000sentinel auth-pass master redispasssentinel config-epoch master 11logfile "/var/log/redis/sentinel.log"sentinel leader-epoch master 11sentinel known-slave master 172.16.252.140 6379  #切换master变化sentinel known-slave master 172.16.253.190 6379  #切换master变化sentinel current-epoch 11