淘宝三星gt-i8268root方法以及三星5830主题

环境规划

此次测试使⽤1台服务器同时配置2个redis实例,组建redis主从⾼可⽤。另外启动3个redis sentinel实例⽤来管理这个拥有2个实例的redis 集群。

 

 

 

环境项 备注
服务器IP地址 10.100.202.248
redis 版本 5.0.12
redis_6379实例端口 6379
redis_6380实例端口 6380
sentinel 实例1端口 26379 待删除的哨兵实例
sentinel 实例2端口 26380
sentinel 实例3端口 26381
sentinel实例4端口 26382 新增哨兵实例

 

 

 

⾼可⽤环境搭建

安装redis_6379redis_6380实例

cd /usr/local/src
tar -zxvf redis-5.0.12.tar.gz 3 cd redis-5.0.12
yum install make gcc-c++
make
make test
make install
cd utils/
./install_server.sh # 该脚本先后执⾏2次,分别配置6379实例和6380实例

6379 实 例

[root@c7-8 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server 15
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful! 

6380 实 例

[root@c7-8 utils]# ./install_server.sh
Welcome to the redis service installer
This script will help you easily set up a running redis server 44
Please select the redis port for this instance: [6379] 6380
Please select the redis config file name [/etc/redis/6380.conf]
Selected default - /etc/redis/6380.conf
Please select the redis log file name [/var/log/redis_6380.log]
Selected default - /var/log/redis_6380.log
Please select the data directory for this instance [/var/lib/redis/6380]
Selected default - /var/lib/redis/6380
Please select the redis executable path [/usr/local/bin/redis-server]
Selected config:
 Port : 6380
Config file : /etc/redis/6380.conf
Log file : /var/log/redis_6380.log
Data dir : /var/lib/redis/6380
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6380.conf => /etc/init.d/redis_6380
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
配置redis 主从⾼可⽤

分别修改2个实例的配置⽂件,配置如下:

redis_6379

[root@c7-8 redis]# grep -Ev "^$|[#,;]" 6379.conf
bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis_6379.log
databases 16
always-show-logo yes
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/6379
masterauth Abc@123
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass Abc@123
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble 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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

redis_6380

[root@c7-8 redis]# grep -Ev "^$|[#,;]" 6380.conf
bind 0.0.0.0
protected-mode yes
port 6380
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/redis_6380.pid
loglevel notice
logfile /var/log/redis_6380.log
databases 16
always-show-logo yes
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/6380
masterauth Abc@123
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
requirepass Abc@123
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
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
aof-use-rdb-preamble 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
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
replicaof 10.100.202.248 6379 # 从实例配置Master实例的IP和端口号

重启启动2个redis实例,使配置⽣效:

[root@c7-8 redis]# service redis_6379 restart Stopping ...
Waiting for Redis to shutdown ... Redis stopped
Starting Redis server...
[root@c7-8 redis]# service redis_6380 restart Stopping ...
Redis stopped
Starting Redis server...

验证主从关系:

[root@c7-8 redis]# redis-cli -p 6379
127.0.0.1:6379> auth Abc@123
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.100.202.248,port=6380,state=online,offset=140,lag=1
master_replid:379bbd733623cf1e7e8c125f6a7027c8344484ad
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:140
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:140

[root@c7-8 redis]# redis-cli -p 6380
127.0.0.1:6380> auth Abc@123
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:10.100.202.248
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:98
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:379bbd733623cf1e7e8c125f6a7027c8344484ad
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
配置redis sentinel 集群

创建sentinel实例所需配置⽂件: touch {26379..26381}.conf

26379实例配置⽂件

bind 0.0.0.0
port 26379
daemonize yes
pidfile /var/run/redis-sentinel-26379.pid
logfile "/var/log/redis-sentinel-26379.log"
dir /tmp
sentinel monitor Redis_Master_cs 10.100.202.248 6379 2
sentinel auth-pass Redis_Master_cs Abc@123
sentinel down-after-milliseconds Redis_Master_cs 30000
sentinel parallel-syncs Redis_Master_cs 1
sentinel failover-timeout Redis_Master_cs 180000
sentinel deny-scripts-reconfig yes

针对另外2个配置⽂件,灌⼊配置并修改

[root@c7-8 redis]# cat 26379.conf >> 26380.conf
[root@c7-8 redis]# cat 26379.conf >> 26381.conf
[root@c7-8 redis]# sed -i 's/26379/26380/g' 26380.conf
[root@c7-8 redis]# sed -i 's/26379/26381/g' 26381.conf

最终配置⽂件内容如下:

[root@c7-8 redis]# cat 26380.conf
bind 0.0.0.0
port 26380
daemonize yes
pidfile /var/run/redis-sentinel-26380.pid
logfile "/var/log/redis-sentinel-26380.log"
dir /tmp
sentinel monitor Redis_Master_cs 10.100.202.248 6379 2
sentinel auth-pass Redis_Master_cs Abc@123
sentinel down-after-milliseconds Redis_Master_cs 30000
sentinel parallel-syncs Redis_Master_cs 1
sentinel failover-timeout Redis_Master_cs 180000
sentinel deny-scripts-reconfig yes

[root@c7-8 redis]# cat 26381.conf
bind 0.0.0.0
port 26381
daemonize yes
pidfile /var/run/redis-sentinel-26381.pid
logfile "/var/log/redis-sentinel-26381.log"
dir /tmp
sentinel monitor Redis_Master_cs 10.100.202.248 6379 2
sentinel auth-pass Redis_Master_cs Abc@123
sentinel down-after-milliseconds Redis_Master_cs 30000
sentinel parallel-syncs Redis_Master_cs 1
sentinel failover-timeout Redis_Master_cs 180000
sentinel deny-scripts-reconfig yes

启动redis sentinel 实例:

[root@c7-8 redis]# redis-sentinel /etc/redis/26379.conf
[root@c7-8 redis]# redis-sentinel /etc/redis/26380.conf
[root@c7-8 redis]# redis-sentinel /etc/redis/26381.conf
[root@c7-8 redis]# ps -ef |grep sentinel
root 6553 1 0 17:20 ? 00:00:00 redis-sentinel 0.0.0.0:26379 [sentinel]
root 6560 1 0 17:20 ? 00:00:00 redis-sentinel 0.0.0.0:26380 [sentinel]
root 6565 1 0 17:20 ? 00:00:00 redis-sentinel 0.0.0.0:26381 [sentinel]
root 6570 1095 0 17:20 pts/0 00:00:00 grep --color=auto sentinel

验证哨兵实例状态

[root@c7-8 redis]# redis-cli -p 26379
127.0.0.1:26379> sentinel master Redis_Master_cs
1) "name"
2) "Redis_Master_cs"
3) "ip"
4) "10.100.202.248"
5) "port"
6) "6379"
7) "runid"
8) "a7704b9feb83df32e4b1a89ee60a62cb06d8750d"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "4"
19) "last-ping-reply"
20) "4"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "3525"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "184570"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26379>
[root@c7-8 redis]# redis-cli -p 26380
127.0.0.1:26380> sentinel master Redis_Master_cs
1) "name"
2) "Redis_Master_cs"
3) "ip"
4) "10.100.202.248"
5) "port"
6) "6379"
7) "runid"
8) "a7704b9feb83df32e4b1a89ee60a62cb06d8750d"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "216"
19) "last-ping-reply"
20) "216"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "5209"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "196097"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
127.0.0.1:26380>
[root@c7-8 redis]# redis-cli -p 26381
127.0.0.1:26381> sentinel master Redis_Master_cs
1) "name"
2) "Redis_Master_cs"
3) "ip"
4) "10.100.202.248"
5) "port"
6) "6379"
7) "runid"
8) "a7704b9feb83df32e4b1a89ee60a62cb06d8750d"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "703"
19) "last-ping-reply"
20) "703"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "1735"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "212721"
29) "config-epoch"
30) "0"
31) "num-slaves"
32) "1"
33) "num-other-sentinels"
34) "2"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"
测试 Failover

查看当前redis相关进程:

[root@c7-8 utils]# ps -ef |grep redis | grep -v grep
root 6444 1 0 4月20 ? 00:03:36 /usr/local/bin/redis-server 0.0.0.0:6379
root 6493 1 0 4月20 ? 00:03:37 /usr/local/bin/redis-server 0.0.0.0:6380
root 6553 1 0 4月20 ? 00:04:10 redis-sentinel 0.0.0.0:26379 [sentinel]
root 6560 1 0 4月20 ? 00:04:10 redis-sentinel 0.0.0.0:26380 [sentinel]
root 6565 1 0 4月20 ? 00:04:09 redis-sentinel 0.0.0.0:26381 [sentinel]

当前主从关系为:

Master实例:redis_6379
Slave实例:redis_6380

强制结束redis master实例进程——redis_6379.

kill -9 6444

查看当前redis实例⻆⾊

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0
master_replid:ce51c53bc762ecb0340d2387caeff78ee17a96ce
master_replid2:379bbd733623cf1e7e8c125f6a7027c8344484ad
master_repl_offset:16133878
second_repl_offset:16123437
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15085303
repl_backlog_histlen:1048576

redis sentinel 26379 实例的⽇志输出

6553:X 21 Apr 2022 13:26:40.576 # +sdown master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:40.642 # +odown master Redis_Master_cs 10.100.202.248 6379 #quorum 3/2
6553:X 21 Apr 2022 13:26:40.642 # +new-epoch 1
6553:X 21 Apr 2022 13:26:40.642 # +try-failover master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:40.712 # +vote-for-leader 282035f5c0b5d960c07eb0c94e57a857b31691b6 1
6553:X 21 Apr 2022 13:26:40.738 # 51d9e69843cbc2d01073843b51d5832a4969da8b voted for 51d9e69843cbc2d01073843b51d5832a4969da8b 1
6553:X 21 Apr 2022 13:26:40.872 # 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 voted for 282035f5c0b5d960c07eb0c94e57a857b31691b6 1
6553:X 21 Apr 2022 13:26:40.887 # +elected-leader master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:40.887 # +failover-state-select-slave master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:40.964 # +selected-slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:40.964 * +failover-state-send-slaveof-noone slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:41.021 * +failover-state-wait-promotion slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:42.030 # +promoted-slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:42.030 # +failover-state-reconf-slaves master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:42.047 # +failover-end master Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 13:26:42.048 # +switch-master Redis_Master_cs 10.100.202.248 6379 10.100.202.248 6380
6553:X 21 Apr 2022 13:26:42.048 * +slave slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6553:X 21 Apr 2022 13:27:12.063 # +sdown slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380

数据查询

127.0.0.1:6380> select 0
OK
127.0.0.1:6380> get abc
"123"
127.0.0.1:6380> set abc 456
OK

恢复6379 实例

[root@c7-8 redis]# rm /var/run/redis_6379.pid
rm:是否删除普通文件 "/var/run/redis_6379.pid"?y
[root@c7-8 redis]# service redis_6379 start
Starting Redis server...
[root@c7-8 redis]# service redis_6379 status
Redis is running (8166)

# sentinel 26379实例日志输出信息如下:
6553:X 21 Apr 2022 13:35:28.481 # -sdown slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380

# 重新查看主从信息
[root@c7-8 redis]# redis-cli -p 6380
127.0.0.1:6380> auth Abc@123
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.100.202.248,port=6379,state=online,offset=16255269,lag=1 # 6379实例已上线连接到主节点了。
master_replid:ce51c53bc762ecb0340d2387caeff78ee17a96ce
master_replid2:379bbd733623cf1e7e8c125f6a7027c8344484ad
master_repl_offset:16255722
second_repl_offset:16123437
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15207147
repl_backlog_histlen:1048576
模拟哨兵实例的增删操作

测试过程:

 1. 向当前3节点的哨兵集群中增加⼀个新的哨兵实例——26382.conf
2. 测试failover
3. 停⽌其中⼀个哨兵实例——测试选⽤26379实例
4. 其他哨兵实例中执⾏reset命令
5. 测试failover
模拟向哨兵集群中增加⼀个实例

创建26382 哨兵实例的配置⽂件

vim /etc/redis/26382.conf
bind 0.0.0.0
port 26382
daemonize yes
pidfile /var/run/redis-sentinel-26382.pid
logfile "/var/log/redis-sentinel-26382.log"
dir /tmp
sentinel monitor Redis_Master_cs 10.100.202.248 6380 2
sentinel auth-pass Redis_Master_cs Abc@123
sentinel down-after-milliseconds Redis_Master_cs 30000
sentinel parallel-syncs Redis_Master_cs 1
sentinel failover-timeout Redis_Master_cs 180000
sentinel deny-scripts-reconfig yes

启动新哨兵实例 26382

[root@c7-8 redis]# /usr/local/bin/redis-sentinel /etc/redis/26382.conf

当前存在4个哨兵实例:

[root@c7-8 redis]# ps -ef |grep redis-sentinel
root 6553 1 0 4月20 ? 00:05:22 redis-sentinel 0.0.0.0:26379 [sentinel]
root 6560 1 0 4月20 ? 00:05:21 redis-sentinel 0.0.0.0:26380 [sentinel]
root 6565 1 0 4月20 ? 00:05:21 redis-sentinel 0.0.0.0:26381 [sentinel]
root 8227 1 0 14:54 ? 00:00:00 /usr/local/bin/redis-sentinel 0.0.0.0:26382 [sentinel]

redis sentinel 26319实例的⽇志输出中 可以看到哨兵集群中增加了⼀个哨兵实例

6553:X 21 Apr 2022 14:54:26.396 * +sentinel sentinel e9726b29c7237775b23d8ae2ba2affa37b5e28c3 10.100.202.248 26382 @ Redis_Master_cs 10.100.202.248 6380

连接任意redis sentinel 控制台,查看当前哨兵集群中 num-other-sentinels 的数值

127.0.0.1:26380> sentinel master Redis_Master_cs
1) "name"
2) "Redis_Master_cs"
3) "ip"
4) "10.100.202.248"
5) "port"
6) "6379"
7) "runid"
8) "cf591aea7d11f8f4fa09910b2c92d786ad4adace"
9) "flags"
10) "master"
11) "link-pending-commands"
12) "0"
13) "link-refcount"
14) "1"
15) "last-ping-sent"
16) "0"
17) "last-ok-ping-reply"
18) "562"
19) "last-ping-reply"
20) "562"
21) "down-after-milliseconds"
22) "30000"
23) "info-refresh"
24) "5143"
25) "role-reported"
26) "master"
27) "role-reported-time"
28) "1623522"
29) "config-epoch"
30) "4"
31) "num-slaves"
32) "1"
33) "num-other-sentinels" # 除当前哨兵实例外,还有另外的3个哨兵实例,符合当前哨兵实例数4.
34) "3"
35) "quorum"
36) "2"
37) "failover-timeout"
38) "180000"
39) "parallel-syncs"
40) "1"

当前4个哨兵实例的状态下,测试主从failover

# 上面测试failover后,6380实例为Master实例,6379位slave实例,结束6380实例进行主从切换测试
[root@c7-8 redis]# ps -ef |grep redis | grep -v sentinel
root 6493 1 0 4月20 ? 00:04:40 /usr/local/bin/redis-server 0.0.0.0:6380
root 8166 1 0 13:35 ? 00:00:18 /usr/local/bin/redis-server 0.0.0.0:6379
[root@c7-8 redis]# kill -9 6493

# 可通过日志观察到,进过了多伦选举失败,终于投票选举出来了 当前的6379实例为master实例
6560:X 21 Apr 2022 15:11:21.534 # +new-epoch 3
6560:X 21 Apr 2022 15:11:21.535 # +try-failover master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:11:21.657 # +vote-for-leader 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 3
6560:X 21 Apr 2022 15:11:21.725 # 282035f5c0b5d960c07eb0c94e57a857b31691b6 voted for 282035f5c0b5d960c07eb0c94e57a857b31691b6 3
6560:X 21 Apr 2022 15:11:21.785 # 51d9e69843cbc2d01073843b51d5832a4969da8b voted for 51d9e69843cbc2d01073843b51d5832a4969da8b 3
6560:X 21 Apr 2022 15:11:21.785 # e9726b29c7237775b23d8ae2ba2affa37b5e28c3 voted for e9726b29c7237775b23d8ae2ba2affa37b5e28c3 3
6560:X 21 Apr 2022 15:11:31.939 # -failover-abort-not-elected master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:11:32.023 # Next failover delay: I will not start a failover before Thu Apr 21 15:17:21 2022
6560:X 21 Apr 2022 15:17:21.907 # +new-epoch 4
6560:X 21 Apr 2022 15:17:21.907 # +try-failover master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.030 # +vote-for-leader 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 4
6560:X 21 Apr 2022 15:17:22.098 # 51d9e69843cbc2d01073843b51d5832a4969da8b voted for 51d9e69843cbc2d01073843b51d5832a4969da8b 4
6560:X 21 Apr 2022 15:17:22.258 # 282035f5c0b5d960c07eb0c94e57a857b31691b6 voted for 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 4
6560:X 21 Apr 2022 15:17:22.323 # e9726b29c7237775b23d8ae2ba2affa37b5e28c3 voted for 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 4
6560:X 21 Apr 2022 15:17:22.386 # +elected-leader master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.386 # +failover-state-select-slave master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.463 # +selected-slave slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.463 * +failover-state-send-slaveof-noone slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.529 * +failover-state-wait-promotion slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.739 # +promoted-slave slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.739 # +failover-state-reconf-slaves master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.749 # +failover-end master Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 15:17:22.750 # +switch-master Redis_Master_cs 10.100.202.248 6380 10.100.202.248 6379
6560:X 21 Apr 2022 15:17:22.750 * +slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6560:X 21 Apr 2022 15:17:52.776 # +sdown slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379

# 查看6379实例的角色,并测试是否可读写
127.0.0.1:6379> info replication
NOAUTH Authentication required.
127.0.0.1:6379> auth Abc@123
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0 # 当前6380实例未启动,所以master实例上看到 连接的slave实例为0.
master_replid:41cd2272f1c43d1465cf71c7ea678eefa28a5fb4
master_replid2:ce51c53bc762ecb0340d2387caeff78ee17a96ce
master_repl_offset:17509840
second_repl_offset:17482487
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16461265
repl_backlog_histlen:1048576
127.0.0.1:6379> get abc
"456"
127.0.0.1:6379> set abc 789
OK
127.0.0.1:6379> get abc
"789"
结论

哨兵实例由原来的3实例,增加到4实例后,如果触发主从切换,会由于哨兵节点数为偶数,导致⼏轮选举失败,但最终会选举出master实例,并进⾏⻆⾊转换。

模拟从哨兵集群中删除⼀个实例

当前环境状态:四个哨兵实例,⼀个6379 redis master实例,⽆slave实例

[root@c7-8 redis]# ps -ef |grep redis | grep -v tailf
root 6553 1 0 4月20 ? 00:05:32 redis-sentinel 0.0.0.0:26379 [sentinel]
root 6560 1 0 4月20 ? 00:05:31 redis-sentinel 0.0.0.0:26380 [sentinel]
root 6565 1 0 4月20 ? 00:05:31 redis-sentinel 0.0.0.0:26381 [sentinel]
root 8166 1 0 13:35 ? 00:00:24 /usr/local/bin/redis-server 0.0.0.0:6379
root 8227 1 0 14:54 ? 00:00:09 /usr/local/bin/redis-sentinel 0.0.0.0:26382 [sentinel]

恢复redis 6380 实例,并验证主从

[root@c7-8 redis]# service redis_6380 status
Redis is not running
[root@c7-8 redis]# service redis_6380 start
/var/run/redis_6380.pid exists, process is already running or crashed
[root@c7-8 redis]# rm /var/run/redis_6380.pid -f
[root@c7-8 redis]# service redis_6380 start
Starting Redis server...
[root@c7-8 redis]# service redis_6380 status
Redis is running (8331)

# redis 6380 实例启动后,sentinel实例日志输出内容如下:
6553:X 21 Apr 2022 15:30:20.564 # -sdown slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
6553:X 21 Apr 2022 15:30:30.557 * +convert-to-slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379
# 可见,6380实例启动后,哨兵实例在其启动前,已将其标记为6379实例的slave,当检测到6380实例启动后,则则将其从原来的+sdown 状态改为-sdown,之后令其(6380实例)转换为slave角色。

# 6379实例 查看主从信息:
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1 # 已连接的slave由0变为1.
slave0:ip=10.100.202.248,port=6380,state=online,offset=17802773,lag=0 # 6380 实例的信息已可获取
master_replid:41cd2272f1c43d1465cf71c7ea678eefa28a5fb4
master_replid2:ce51c53bc762ecb0340d2387caeff78ee17a96ce
master_repl_offset:17802924
second_repl_offset:17482487
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16754349
repl_backlog_histlen:104857
停⽌其中⼀个redis sentinel 实例——26379实例

1 [root@c7-8 redis]# kill -9 6553

⼀段时间后,通过其他哨兵实例的⽇志可以观察到,当前活着的哨兵实例已经检测到26379实例不 存在了,并主观上认为该实例down掉了。

执⾏命令

sentinel master Redis_Master_cs

num-other-sentinels 的值认仍为 3 .

执⾏sentinel reset * 命令重置哨兵集群

# 26380控制台执行:
127.0.0.1:26380> sentinel reset Redis_Master_cs
(integer) 1

# 此时,26380 哨兵实例的日志中,会出现如下信息:
6560:X 21 Apr 2022 16:00:18.884 # +reset-master master Redis_Master_cs 10.100.202.248 6379
6560:X 21 Apr 2022 16:00:19.281 * +sentinel sentinel 51d9e69843cbc2d01073843b51d5832a4969da8b 10.100.202.248 26381 @ Redis_Master_cs 10.100.202.248 6379
6560:X 21 Apr 2022 16:00:19.971 * +sentinel sentinel e9726b29c7237775b23d8ae2ba2affa37b5e28c3 10.100.202.248 26382 @ Redis_Master_cs 10.100.202.248 6379
6560:X 21 Apr 2022 16:00:25.490 * +slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379

127.0.0.1:26380> sentinel master Redis_Master_cs
...
33) "num-other-sentinels" # 执行reset命令后,该值变为2
34) "2"
35) "quorum"
36) "2"
...

# 此时,26381控制台中查询,`num-other-sentinels`的值仍为3.连接26381控制台,执行reset命令进行重置。其他尚活着的哨兵实例,均需要执行该命令。
# 26381控制台执行:
127.0.0.1:26381> sentinel reset Redis_Master_cs
(integer) 1

# 26381哨兵实例的日志输出如下:
6565:X 21 Apr 2022 16:05:53.919 # +reset-master master Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:05:54.457 * +sentinel sentinel 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 10.100.202.248 26380 @ Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:05:55.445 * +sentinel sentinel e9726b29c7237775b23d8ae2ba2affa37b5e28c3 10.100.202.248 26382 @ Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:05:56.951 * +slave slave 10.100.202.248:6380 10.100.202.248 6380 @ Redis_Master_cs 10.100.202.248 6379

`sentinel master Redis_Master_cs`命令执行结果中,`num-other-sentinels`的值变为了2.

# 26382控制台执行:
127.0.0.1:26382> sentinel reset Redis_Master_cs
(integer) 1

当前哨兵实例有:

redis-sentinel 26380
redis-sentinel 26381
redis-sentinel 26382

基于当前的哨兵实例,测试redis failover功能是否正常

# 杀死当前master实例——6379
[root@c7-8 redis]# ps -ef |grep redis-server
root 8166 1 0 13:35 ? 00:00:34 /usr/local/bin/redis-server 0.0.0.0:6379
root 8331 1 0 15:30 ? 00:00:09 /usr/local/bin/redis-server 0.0.0.0:6380
root 8389 8268 0 16:12 pts/3 00:00:00 grep --color=auto redis-server

[root@c7-8 redis]# kill -9 8166
# 30秒后,哨兵实例的日志中会显示出主从切换的过程:
6565:X 21 Apr 2022 16:13:51.542 # +sdown master Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:13:51.620 # +odown master Redis_Master_cs 10.100.202.248 6379 #quorum 3/2
6565:X 21 Apr 2022 16:13:51.620 # +new-epoch 5
6565:X 21 Apr 2022 16:13:51.620 # +try-failover master Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:13:51.773 # +vote-for-leader 51d9e69843cbc2d01073843b51d5832a4969da8b 5
6565:X 21 Apr 2022 16:13:51.773 # e9726b29c7237775b23d8ae2ba2affa37b5e28c3 voted for e9726b29c7237775b23d8ae2ba2affa37b5e28c3 5
6565:X 21 Apr 2022 16:13:51.899 # 3109e9691cc3f8fcfb3d16567ad4fb2dca405679 voted for e9726b29c7237775b23d8ae2ba2affa37b5e28c3 5
6565:X 21 Apr 2022 16:13:52.707 # +config-update-from sentinel e9726b29c7237775b23d8ae2ba2affa37b5e28c3 10.100.202.248 26382 @ Redis_Master_cs 10.100.202.248 6379
6565:X 21 Apr 2022 16:13:52.707 # +switch-master Redis_Master_cs 10.100.202.248 6379 10.100.202.248 6380
6565:X 21 Apr 2022 16:13:52.707 * +slave slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6565:X 21 Apr 2022 16:14:22.715 # +sdown slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380

# `sentinel master Redis_Master_cs`命令执行结果中可看到,当前Maser实例已经变为6380实例了。
127.0.0.1:26382> sentinel master Redis_Master_cs
1) "name"
2) "Redis_Master_cs"
3) "ip"
4) "10.100.202.248"
5) "port"
6) "6380"

# 重新启动redis 6379实例,恢复主从模式
[root@c7-8 redis]# service redis_6379 start
Starting Redis server...
[root@c7-8 redis]# service redis_6379 status
Redis is running (8423)

# sentinel 日志输出:
6560:X 21 Apr 2022 16:16:59.295 # -sdown slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380
6560:X 21 Apr 2022 16:17:09.475 * +convert-to-slave slave 10.100.202.248:6379 10.100.202.248 6379 @ Redis_Master_cs 10.100.202.248 6380

⾄此,redis主从⼜恢复了,只是6380实例为master实例,6379实例为slave实例。

通过上面一系列操作,可以看出redis 哨兵实例退出集群,需要在实例结束后,分别在其他几个正常的实例控制台中手动发起reset指令,重新获取哨兵集群中当前实例的状态信息,才能实现哨兵实例的退出操作。

 

你的手机正在用什么壁纸?是图片壁纸还是动态壁纸?相信很多人目前都会用一张好看的图片作为手机壁纸,而且设置图片壁纸操作起来比较简单,琢磨一下就可以搞定。

但如果你遇到一个喜欢的视频,想将它设为壁纸的话,那又要怎么操作呢?

别担心,三星手机无需第三方软件,就能将手机里的视频设置为壁纸,是不是特别方便!而且你还可以将手机的主题色设置成与壁纸相同,看上去更有整体性,你就会更加喜欢你的手机了。

那么三星手机如何设置视频壁纸呢?

首先要将你喜欢的视频下载到手机里,打开相册就可以看到视频文件已经在里面了。

这时候只要点击视频,然后在右下角的选项里选择“设置为壁纸”。

弹出的选项有“锁屏壁纸”和“通话背景”,这时选择“锁屏壁纸”。

如果你的视频时长超过了30秒,系统会自动提醒,在下方有一个“修剪”选项,你可以选取想要的部分,然后点击“完成”。

在这个设置面板,你还可以设置锁屏的时钟风格和通知风格。

在设置完毕后,点击右上角的“完成”,就能完成动态壁纸的设置啦。

在设置完成后,系统会自动根据壁纸的颜色,为你带来几款系统主题色,你可以选择喜欢的组合,然后点击“应用”,下拉状态栏,就能看到手机的主题色不一样了。

最后你的手机锁屏壁纸就变成了想要的视频壁纸啦,是不是比图片壁纸生动不少,点亮屏幕时,就有一种别样的惊喜了。记得点击“关注”、“收藏”,让你的手机壁纸动起来吧。