您的位置:首页 > 数据库 > Redis

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: