REDISRedis

5.Redis的哨兵服务

2020-07-28  本文已影响0人  Stone_説

0.Redis主从架构的问题
1.哨兵服务介绍
2.架构图
3.主从服务搭建
4.配置哨兵服务
5.启动哨兵服务
6.验证哨兵服务

0.Redis主从架构的问题

对于Redis的主从架构而言,无法实现 master 和 slave 角色的自动切换, 即当 master 出现 redis 服务异常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave 提升为 master),需要手动改环境配置才能切换到 slave redis 服务器。另外无法横向扩展 Redis 服务的并行写入性能, 当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解决此问题。
1.master和slave角色的无缝切换,让业务无感知从而不影响业务使用
2.可以横向动态扩展Redis服务器, 从而实现多台服务器并行写入以实现更高并发的目的。

1.哨兵(Sentinel)服务介绍

Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在 redis2.6+的版本中,Redis的哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用Redis2.8以后版本。哨兵(Sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是: Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决 master 和 slave 角色的切换问题。

2.架构图

哨兵服务.jpg

3.主从服务搭建

3.1主服务器配置

安装

[root@node09 ~]# cd /usr/local/src
[root@node09 src]# tar xvf redis-4.0.14.tar.gz
[root@node09 src]# mkdir -p /apps/redis
[root@node09 src]# mkdir /apps/redis/{etc,logs,data,run}
[root@node09 src]# cd redis-4.0.14
[root@node09 redis-4.0.14]# make PREFIX=/apps/redis install
[root@node09 redis-4.0.14]# ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmar
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-ao
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rd
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’

修改配置文件

[root@node09 redis-4.0.14]# cp redis.conf /apps/redis/etc/
[root@node09 redis-4.0.14]# grep "^[a-Z]" /apps/redis/etc/redis.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised systemd
pidfile /apps/redis/run/redis_6379.pid
loglevel notice
logfile "/apps/redis/logs/redis_6379.log"
databases 30
always-show-logo yes
save 3   1
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump_6379.rdb
dir /apps/redis/data
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 123456
maxmemory 1073741824
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly yes
appendfilename "appendonly_6379.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit 5000
slowlog-log-slower-than 20000
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

启动服务

[root@node09 etc]# redis-server /apps/redis/etc/redis.conf
[root@node09 etc]# ss -nlut
Netid  State      Recv-Q Send-Q Local Address:Port                     
udp    UNCONN     0      0      192.168.177.138:123                               
tcp    LISTEN     0      128          *:6379                             
[root@node09 etc]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
3.2从服务器配置

192.168.177.139

[root@node10 redis-4.0.14]# grep "^[a-Z]" /apps/redis/etc/redis.conf
...
slaveof 192.168.177.138 6379
masterauth 123456
...

192.168.177.140

[root@node10 redis-4.0.14]# grep "^[a-Z]" /apps/redis/etc/redis.conf
...
slaveof 192.168.177.138 6379
masterauth 123456
...

其他地方配置和主服务器一致

3.3主从服务验证

启动服务

[root@node09 etc]# redis-server /apps/redis/etc/redis.conf
[root@node10 etc]# redis-server /apps/redis/etc/redis.conf
[root@node11 etc]# redis-server /apps/redis/etc/redis.conf

查看主从状态
MASTER

[root@node09 etc]# redis-cli
127.0.0.1:6379> AUTH 123456
127.0.0.1:6379> info
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.177.139,port=6379,state=online,offset=3626,lag=0
slave1:ip=192.168.177.140,port=6379,state=online,offset=3626,lag=0
master_replid:329a43ea6a057c090b10c1d8ee42e75956e62e84
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3626
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3626

SLAVE1

[root@node10 etc]# redis-cli
127.0.0.1:6379> AUTH 123456
127.0.0.1:6379> info
# Replication
role:slave
master_host:192.168.177.138
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:3654
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:329a43ea6a057c090b10c1d8ee42e75956e62e84
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3654
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3654

SLAVE2

[root@node10 etc]# redis-cli
127.0.0.1:6379> AUTH 123456
127.0.0.1:6379> info
# Replication
role:slave
master_host:192.168.177.138
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:3654
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:329a43ea6a057c090b10c1d8ee42e75956e62e84
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3654
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:113
repl_backlog_histlen:3542

4.配置哨兵服务

MASTER

[root@node09 etc]# pwd
/apps/redis/etc
[root@node09 etc]# vim sentinel.conf 
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
dir "/apps/redis/logs"
sentinel monitor mymaster 192.168.177.138 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
[root@node09 etc]# scp sentinel.conf root@192.168.177.139:/apps/redis/etc/
[root@node09 etc]# scp sentinel.conf root@192.168.177.140:/apps/redis/etc/

SLAVE1

[root@node10 etc]# pwd
/apps/redis/etc
[root@node10 etc]# cat sentinel.conf 
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
dir "/apps/redis/logs"
sentinel monitor mymaster 192.168.177.138 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

SLAVE2

[root@node11 etc]# pwd
/apps/redis/etc
[root@node11 etc]# cat sentinel.conf 
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
dir "/apps/redis/logs"
sentinel monitor mymaster 192.168.177.138 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

5.启动哨兵服务

[root@node09 etc]# redis-sentinel /apps/redis/etc/sentinel.conf 
[root@node09 etc]# ss -ntlu
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port                            
tcp    LISTEN     0      128          *:26379                    *:*                  
tcp    LISTEN     0      128          *:6379                     *:*                  
[root@node10 etc]# redis-sentinel /apps/redis/etc/sentinel.conf 
[root@node10 etc]# ss -ntlu
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port                            
tcp    LISTEN     0      128          *:26379                    *:*                  
tcp    LISTEN     0      128          *:6379                     *:*     
[root@node11 etc]# redis-sentinel /apps/redis/etc/sentinel.conf
[root@node11 etc]# ss -ntlu
Netid  State      Recv-Q Send-Q Local Address:Port               Peer Address:Port                            
tcp    LISTEN     0      128          *:26379                    *:*                  
tcp    LISTEN     0      128          *:6379                     *:*      
[root@node09 etc]# tail -f /apps/redis/logs/sentinel_26379.log 
12846:X 28 Jul 18:33:48.842 * Running mode=sentinel, port=26379.
12846:X 28 Jul 18:33:48.842 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
12846:X 28 Jul 18:33:48.843 # Sentinel ID is c959cfd6b1741c0754da1ca413c5849cac1f955e
12846:X 28 Jul 18:33:48.843 # +monitor master mymaster 192.168.177.138 6379 quorum 2
12846:X 28 Jul 18:33:48.844 * +slave slave 192.168.177.139:6379 192.168.177.139 6379 @ mymaster 192.168.177.138 6379
12846:X 28 Jul 18:33:48.845 * +slave slave 192.168.177.140:6379 192.168.177.140 6379 @ mymaster 192.168.177.138 6379
12846:X 28 Jul 18:33:53.164 * +sentinel sentinel 7c9818281a7c5585beb7aff37e65d5ed51764115 192.168.177.139 26379 @ mymaster 192.168.177.138 6379
12846:X 28 Jul 18:33:55.082 * +sentinel sentinel 32d5df9242e4492300f324559ee8cbc0ad421a31 192.168.177.140 26379 @ mymaster 192.168.177.138 6379
12846:X 28 Jul 18:34:18.906 # +sdown slave 192.168.177.140:6379 192.168.177.140 6379 @ mymaster 192.168.177.138 6379
12846:X 28 Jul 18:34:25.112 # +sdown sentinel 32d5df9242e4492300f324559ee8cbc0ad421a31 192.168.177.140 26379 @ mymaster 192.168.177.138 6379

6.验证哨兵服务

6.1查看哨兵状态
[root@node11 ~]# redis-cli -p 26379
127.0.0.1:26379> info
# 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=192.168.177.138:6379,slaves=2,sentinels=3
6.2关闭主redis服务
[root@node09 ~]# ps -ef|grep redis
root      12676      1  0 12:09 ?        00:00:49 redis-server 0.0.0.0:6379
root      12846      1  0 18:33 ?        00:00:03 redis-sentinel 0.0.0.0:26379 [sentinel]
[root@node09 ~]# kill -9 12676
[root@node09 ~]# ps -ef|grep redis
root      12846      1  0 18:33 ?        00:00:03 redis-sentinel 0.0.0.0:26379 [sentinel]
6.3查看主从切换

主服务器

127.0.0.1:6379> ifno
Could not connect to Redis at 127.0.0.1:6379: Connection refused

SLAVE1:升级为主服务器

127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> AUTH 123456
OK

# Replication
role:master
connected_slaves:0
master_replid:b1e636ac76067a9f2dfb0d4e05c23bcef0940aed
master_replid2:329a43ea6a057c090b10c1d8ee42e75956e62e84
master_repl_offset:174530
second_repl_offset:137533
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:174530

SLAVE2:主服务器变为node10

127.0.0.1:6379> info
NOAUTH Authentication required.
127.0.0.1:6379> AUTH 123456
OK
127.0.0.1:6379> info

# Replication
role:slave
master_host:192.168.177.139
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:184156
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b1e636ac76067a9f2dfb0d4e05c23bcef0940aed
master_replid2:329a43ea6a057c090b10c1d8ee42e75956e62e84
master_repl_offset:184156
second_repl_offset:137533
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:113
repl_backlog_histlen:184044
6.4读写数据

主服务器

127.0.0.1:6379> keys *
1) "foo"
2) "key1"
127.0.0.1:6379> set master 139
OK
127.0.0.1:6379> get master
"139"

从服务器

127.0.0.1:6379> keys *
1) "key1"
2) "foo"
127.0.0.1:6379> keys *
1) "master"
2) "key1"
3) "foo"
127.0.0.1:6379> get master
"139"
127.0.0.1:6379> set key2 value2
(error) READONLY You can't write against a read only slave.
上一篇 下一篇

猜你喜欢

热点阅读