92
Redis Sentinel [email protected]

Redis sentinelinternals deview

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Redis sentinelinternals deview

Redis Sentinel

[email protected]

Page 2: Redis sentinelinternals deview

Redis.io

Page 3: Redis sentinelinternals deview

Redis/Twemproxy Contributor

카카오 홈 개발자

Page 4: Redis sentinelinternals deview

Redis Monitoring?

Page 5: Redis sentinelinternals deview
Page 6: Redis sentinelinternals deview
Page 7: Redis sentinelinternals deview
Page 8: Redis sentinelinternals deview

Checking Liveness

Page 9: Redis sentinelinternals deview

Checking Liveness servers = [ ('localhost', 6379),

('localhost', 6380),

('localhost', 6381) ]

conns = []

def check():

for conn in conns:

print conn.ping()

Page 10: Redis sentinelinternals deview

Checking it works

Page 11: Redis sentinelinternals deview

Checking it works def check():

for conn in conns:

i = conn.info()

print i['run_id'],

i['used_memory_human'],

i['total_commands_processed']

Page 12: Redis sentinelinternals deview

Is it Reliable?

Page 13: Redis sentinelinternals deview

Is Server really Failed?

Page 14: Redis sentinelinternals deview

Split Network.

Page 15: Redis sentinelinternals deview

Server is busy.

Page 16: Redis sentinelinternals deview

Monitoring is not the one we really

want.

Page 17: Redis sentinelinternals deview

HA High Availity

Page 18: Redis sentinelinternals deview

What do you do? When your servers failed

Page 19: Redis sentinelinternals deview

1. Recognize Redis is down.

Page 20: Redis sentinelinternals deview

2. choose new master candidate

Page 21: Redis sentinelinternals deview

3. Promote slave to Master.

Page 22: Redis sentinelinternals deview

4. make client connect to new master

Page 23: Redis sentinelinternals deview

What Redis Sentinel

do?

Page 24: Redis sentinelinternals deview

1. Check Redis Liveness

Page 25: Redis sentinelinternals deview

1. Check Redis Liveness -Subjective Down -Objective Down

Page 26: Redis sentinelinternals deview

2. Choose good slave.

Page 27: Redis sentinelinternals deview

Good Slave NOT SDOWN, ODOWN, DISCONNECTED

NOT DEMOTE

Ping reply > info_validity_time

Slave_priority != 0

Info reply > info_validity_time

Page 28: Redis sentinelinternals deview

Choose new master

Sort Slave Priority

Runid

Page 29: Redis sentinelinternals deview

3. Promote it

Page 30: Redis sentinelinternals deview

Promoting Send Slaveof no one to new master

Send Slaveof [new master ip] [addr] to Other redis

Notify new master to clietns +switch-master

Set DEMOTE mark to old-Master

Page 31: Redis sentinelinternals deview

Failover Scenario

Page 32: Redis sentinelinternals deview

Master Slave Slave

Sentinel

Client Client

Pub/Sub

Page 33: Redis sentinelinternals deview

Master Slave A Slave B

Sentinel

Client Client

Pub/Sub

Page 34: Redis sentinelinternals deview

Master Slave A Slave B

Sentinel

Client Client

Pub/Sub

Choose Slave A as New Master

Page 35: Redis sentinelinternals deview

Master Slave A Slave B

Sentinel

Client Client

Pub/Sub

Send to Slave B Slaveof Slave A

Page 36: Redis sentinelinternals deview

Master Slave A Slave B

Sentinel

Client Client

Pub/Sub

Send “Slaveof no one” to Slave A

Page 37: Redis sentinelinternals deview

Master Master Slave B

Sentinel

Client Client

Pub/Sub

Send “Slaveof Slave A” to Slave B

Page 38: Redis sentinelinternals deview

Master Master Slave B

Sentinel

Client Client

Pub/Sub: +switch-master

Page 39: Redis sentinelinternals deview

Sentinel Internal

Page 40: Redis sentinelinternals deview

Sentinel Failover State Machine

State 내용 Next State

NONE

WAIT_START SELECT_SLAVE

SELECT_SLAVE SEND_SLAVEOF

SEND_SLAVEOF WAIT_PROMOTION

WAIT_PROMOTION

RECONF_SLAVES

DETECT_END

Page 41: Redis sentinelinternals deview

Starting Point Of Sentinel • sentinelTimer in sentinel.c

–Called every 100ms

–sentinelHandleRedisInstance

Page 42: Redis sentinelinternals deview

SentinelRedisInstance • master

–If it is master, it is null.

• slaves

• sentinels

Page 43: Redis sentinelinternals deview

sentinelHandleDictOfRedisInstances while((de = dictNext(di)) != NULL) {

sentinelRedisInstance *ri = dictGetVal(de);

sentinelHandleRedisInstance(ri);

if (ri->flags & SRI_MASTER) {

sentinelHandleDictOfRedisInstances(ri->slaves);

sentinelHandleDictOfRedisInstances(ri->sentinels);

……

}

}

Page 44: Redis sentinelinternals deview

sentinelHandleRedisInstance • Reconnect to Instances

• Ping

• Asking Master State to other Sentinel

• Check SDOWN

• Check ODOWN

Page 45: Redis sentinelinternals deview

How to check Subjective Down • When Sentinel get Ping Reply

–Set last_avail_time as current

• Check –e = current –last_avail_time

–e > last_avail_time •Subjective Down.

Page 46: Redis sentinelinternals deview

How to check Objective Down • Ask to other sentinels is it down.

–sentinelAskMasterStateToOtherSentinels

• If other sentinels reply it is down.

–Count them, if it is bigger than Quorum.

–It is objective Down.

Page 47: Redis sentinelinternals deview

How to find Redis

Page 48: Redis sentinelinternals deview

INFO Command

# Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=1,lag=0 master_repl_offset:1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:0

Page 49: Redis sentinelinternals deview

INFO Command

# Replication role:slave master_host:127.0.0.1 master_port:6379

Page 50: Redis sentinelinternals deview

+redirect-master

Page 51: Redis sentinelinternals deview

How to find Sentinel

Page 52: Redis sentinelinternals deview

Find Sentinel Subscribe SENTINEL_HELLO_CHANNEL

In Master

Publish Sentinel Information In sentinelPingInstance

Add New Sentinel In sentinelReceiveHelloMessages

Page 53: Redis sentinelinternals deview

Using Pub/sub *4 $8 pmessage $1 * $18 __sentinel__:hello $58 127.0.0.1:26379:7d717f945afde99e6f82f825de052f17cab7e6f3:1

Page 54: Redis sentinelinternals deview

Is Sentinel Really Good?

Page 55: Redis sentinelinternals deview

Not Mature #1

Page 56: Redis sentinelinternals deview

Sentinel Conf port 26379 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 2000 sentinel can-failover mymaster yes sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 900000

Page 57: Redis sentinelinternals deview

Quorum Count sentinel monitor mymaster 127.0.0.1 6379 2

We should check this count.

Page 58: Redis sentinelinternals deview

Sentinel Conf sentinel down-after-milliseconds mymaster 2000

If this value is Too small, It can cause some trouble.

-sdown/+sdown loop

Page 59: Redis sentinelinternals deview

Compare with Zookeeper Conf tickTime=2000 dataDir=/var/zookeeper clientPort=2181 initLimit=5 syncLimit=2 server.1=zoo1:2888:3888 server.2=zoo2:2888:3888 server.3=zoo3:2888:3888

Page 60: Redis sentinelinternals deview

Not Mature #2

Page 61: Redis sentinelinternals deview

Master

Slave Sentinel

Page 62: Redis sentinelinternals deview

Master

Slave Sentinel

Page 63: Redis sentinelinternals deview

Master

Master Sentinel

Page 64: Redis sentinelinternals deview

Master

Master Sentinel

Page 65: Redis sentinelinternals deview

Master

Master Sentinel

Case #1

It’s OK.

Page 66: Redis sentinelinternals deview

Master

Master Sentinel

Case #1

Page 67: Redis sentinelinternals deview

Master

Slave Sentinel

Case #2

Page 68: Redis sentinelinternals deview

Master

Slave Sentinel

Case #2

Sentinel can’t promote Slave to Master

Page 69: Redis sentinelinternals deview

Why?

Page 70: Redis sentinelinternals deview

Sentinel Mechanism. When master is changed to Slave,

Reconf with new Master.

Page 71: Redis sentinelinternals deview

Sentinel Mechanism. When master is changed to Slave,

Reset information with new Master.

But, if new master failed, sentinel will not get any information from it.

Page 72: Redis sentinelinternals deview

Sentinel Mechanism.

if ((ri->flags & SRI_MASTER) && role == SRI_SLAVE && ri->slave_master_host) { sentinelEvent(REDIS_WARNING,"+redirect-to-master",ri, "%s %s %d %s %d", ri->name, ri->addr->ip, ri->addr->port, ri->slave_master_host, ri->slave_master_port); sentinelResetMasterAndChangeAddress(ri,ri->slave_master_host, ri->slave_master_port); return; /* Don't process anything after this event. */ }

Page 73: Redis sentinelinternals deview

Not Mature #3

Page 74: Redis sentinelinternals deview

If redis is down, when redis is loading data(RDB,

AOF), sentinel can’t register redis.

Page 75: Redis sentinelinternals deview

Conclusion

Page 76: Redis sentinelinternals deview

Even though, Sentinel is not mature. It is useful.

Page 77: Redis sentinelinternals deview

Redis Sentinel Tips

Page 78: Redis sentinelinternals deview

1. Subscribe all Sentinels And ignore duplicated

message

Page 79: Redis sentinelinternals deview

2. Sentinel has explicit failover command

sentinel mymaster failover

Page 80: Redis sentinelinternals deview

But can’t select new master

Page 81: Redis sentinelinternals deview

Hacking is easy. https://github.com/antirez/redis/pull/1126

Page 82: Redis sentinelinternals deview

3. Make Sentinel.conf same.

Page 83: Redis sentinelinternals deview

Sentinels can’t share their status

Page 84: Redis sentinelinternals deview

Deploy conf to all sentinels with Script

Page 85: Redis sentinelinternals deview

And restart all sentinels.

Page 86: Redis sentinelinternals deview

4. If you want not to promote specific server

to master

Page 87: Redis sentinelinternals deview

Set Slave-Priority = 0

Page 88: Redis sentinelinternals deview

Thank you!

Page 89: Redis sentinelinternals deview

Just One more thing

Page 90: Redis sentinelinternals deview

Twemprox Redis Redis-sentinel

Sharded Redis

Page 92: Redis sentinelinternals deview

HA Proxy

HA Proxy

VRRP Twemproxy

Twemproxy

Twemproxy

Redis Master

Redis Slave

Redis Slave

Shard

Redis Master

Redis Slave

Redis Slave

Shard Sentinel

Agent Pub/Sub

Restart