1、 简述redis主从和哨兵的主要作用以及工作原理;
redis主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致。同时slave上还可以开启二级slave,三级slave从库。 Redis主从配置非常简单,只需要在Redis从库配置中指定slaveof ip port 即可,IP表示指定主库的ip,port表示redis监听端口。
redis主从虽然解决了单点导致的数据丢失问题,但是还是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据宕机。
哨兵的主要作用:
监控:监控redis主库及从库运行状态;
通知:如果redis发生故障转移,可以通过邮件通知管理员;
自动故障转移:一旦发现主库宕机,则在从库中通过选举新的master进行故障转移
哨兵的工作原理:
哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。
每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方宕机了,这种宕机称为”主观认为宕机” Subjective Down,简称sdown)。
若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master真正宕机,即客观上认为宕机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置。
2、利用三台服务器部署redis主从及哨兵(可以结合日志分析);
三台机器源码安装:
master: 192.168.1.34
slave1: 192.168.1.35
slave2: 192.168.1.36
cd /usr/src
wget http://download.redis.io/redis-stable.tar.gz
tar xvf redis-stable.tar.gz
cd redis-stable
#编译安装redis
yum install -y gcc gcc-c++
make MALLOC=libc
make PREFIX=/usr/local/redis install
cp redis.conf /usr/local/redis/6379.conf
vim /etc/sysctl.conf
net.core.somaxconn=512
vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
sysctl -p
#主库修改配置文件:
以守护进程在后台运行:
daemonize yes
bind 0.0.0.0
#从库修改配置文件设置(重启服务器生效)
bind 0.0.0.0
#指定隶属于谁:
slaveof 192.168.1.34 6379
或者
REPLICAOF 192.168.1.34 6379
#三台机器启动redis
nohup /usr/local/redis/bin/redis-server /usr/local/redis/6379.conf &
#从库状态查询:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> role
1) "slave"
2) "192.168.1.34"
3) (integer) 6379
4) "connected"
5) (integer) 98
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.1.34
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:126
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e395bb3eeb962c8abd6fd191dbcee4e2dab9c119
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126
#主库状态查询:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> role
1) "master"
2) (integer) 28
3) 1) 1) "192.168.1.35"
2) "6379"
3) "28"
2) 1) "192.168.1.36"
2) "6379"
3) "28"
127.0.0.1:6379> info replication
#Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.35,port=6379,state=online,offset=140,lag=0
slave1:ip=192.168.1.36,port=6379,state=online,offset=140,lag=1
master_replid:e395bb3eeb962c8abd6fd191dbcee4e2dab9c119
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
配置哨兵:
#master端配置sentinel:
[root@localhost ~]# cd /usr/src/redis-stable
#复制哨兵得配置文件:
[root@node5 redis-stable]# cp sentinel.conf /usr/local/redis/
#修改配置文件:
vim /usr/local/redis/sentinel.conf
#绑定监听IP
bind 0.0.0.0
#监听端口
port 26379
#后台运行
daemonize yes
pidfile /var/run/redis-sentinel.pid
#哨兵得日志文件
logfile “sentinel.log”
#日志文件存放路径
dir /usr/local/redis/
#设置初始master以及法定认为下线人数:
sentinel monitor mymaster 192.168.75.135 6379 2
#master主观下线时间,默认3秒,3秒内没有回复pong,则认为下线了
sentinel down-after-milliseconds mymaster 3000
#指定在故障转移期间,多少个slave向新的master同步得数量,如果slave
是提供查询服务,则应该设置小一点更好
sentinel parallel-syncs mymaster 1
#指定故障转移超时时间,默认为1分钟
sentinel failover-timeout mymaster 60000
#slave端配置sentinel,把配置好的sentinel配置文件直接复制过去
scp /usr/local/redis/sentinel.conf 192.168.1.35:/usr/local/redis/
scp /usr/local/redis/sentinel.conf 192.168.1.36:/usr/local/redis/
#三台机器都启动哨兵
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
#master端:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> set user jjx
#slave端:
127.0.0.1:6379> get user
"jjx"
#master端关闭:
127.0.0.1:6379> shutdown
not connected>
[root@localhost ~]# tailf /usr/local/redis/sentinel.log
1352:X 16 Jun 2020 22:40:14.919 * +sentinel sentinel 90d5cb4272f38519ef4bfb26aa7da92fa73799af 192.168.1.34 26379 @ mymaster 192.168.1.34 6379
1352:X 16 Jun 2020 22:40:15.255 * +sentinel sentinel baddfb7b65aacc0fba1ebaa39a27cffadbe4ec14 192.168.1.35 26379 @ mymaster 192.168.1.34 6379
1352:X 16 Jun 2020 22:55:54.748 # +sdown master mymaster 192.168.1.34 6379
1352:X 16 Jun 2020 22:55:54.812 # +new-epoch 1
1352:X 16 Jun 2020 22:55:54.813 # +vote-for-leader 90d5cb4272f38519ef4bfb26aa7da92fa73799af 1
1352:X 16 Jun 2020 22:55:55.370 # +config-update-from sentinel 90d5cb4272f38519ef4bfb26aa7da92fa73799af 192.168.1.34 26379 @ mymaster 192.168.1.34 6379
1352:X 16 Jun 2020 22:55:55.370 # +switch-master mymaster 192.168.1.34 6379 192.168.1.36 6379
1352:X 16 Jun 2020 22:55:55.370 * +slave slave 192.168.1.35:6379 192.168.1.35 6379 @ mymaster 192.168.1.36 6379
1352:X 16 Jun 2020 22:55:55.370 * +slave slave 192.168.1.34:6379 192.168.1.34 6379 @ mymaster 192.168.1.36 6379
1352:X 16 Jun 2020 22:55:58.428 # +sdown slave 192.168.1.34:6379 192.168.1.34 6379 @ mymaster 192.168.1.36 6379
可以看出192.168.1.36被选举为master了。
#在192.168.1.35和192.168.1.36中进入redis查看数据,没有丢失:
127.0.0.1:6379> get user
"jjx"