Redis主从复制
1、采用异步的方式进行数据同步
3、支持级联复制, 某一个slave服务器可以作为另外slave服务器的主
4、进行主从复制时,master/slave不会阻塞客户端访问请求
5、自redis 2.6版本后,slave服务器默认工作在只读模式
****环境描述
172.16.68.169 7001 master 172.16.68.169 7002 slave 172.16.68.169 7003 slave
一、主从环境搭建
注:redis搭建参考 https://www.cnblogs.com/lina-2159/p/13553695.html,在此基础上继续以下操作。
1、创建配置文件目录,以端口号来作为标识
# mkdir -p /usr/local/redis-4.0.11/conf/{7001,7002,7003} # cp /usr/local/redis-4.0.11/redis.conf /usr/local/redis-4.0.11/conf/7001 # cp /usr/local/redis-4.0.11/redis.conf /usr/local/redis-4.0.11/conf/7002 # cp /usr/local/redis-4.0.11/redis.conf /usr/local/redis-4.0.11/conf/7003
2、修改master配置文件
7001]# grep '^[a-z]' redis.conf bind 172.16.68.169 protected-mode no port 7001 daemonize yes pidfile "/var/run/redis_7001.pid" dir "/usr/local/redis-4.0.11/conf/7001" requirepass "123456" appendonly yes appendfilename "appendonly.aof" appendfsync everysec
3、修改两个slave的配置文件
7002]# grep '^[a-z]' redis.conf bind 172.16.68.169 protected-mode no port 7002 daemonize yes pidfile "/var/run/redis_7002.pid" dir "/usr/local/redis-4.0.11/conf/7002" requirepass "123456" appendonly yes appendfilename "appendonly.aof" appendfsync everysec masterauth "123456" slaveof 172.16.68.169 7001
7003]# grep '^[a-z]' redis.conf bind 172.16.68.169 protected-mode no port 7003 daemonize yes pidfile "/var/run/redis_7003.pid" dir "/usr/local/redis-4.0.11/conf/7003" requirepass "123456" appendonly yes appendfilename "appendonly.aof" appendfsync everysec masterauth "123456" slaveof 172.16.68.169 7001
4、启动三个redis实例
# /usr/local/redis-4.0.11/src/redis-server /usr/local/redis-4.0.11/conf/7001/redis.conf # /usr/local/redis-4.0.11/src/redis-server /usr/local/redis-4.0.11/conf/7002/redis.conf # /usr/local/redis-4.0.11/src/redis-server /usr/local/redis-4.0.11/conf/7003/redis.conf
5、查看复制状态
# /usr/local/redis-4.0.11/src/redis-cli -h 172.16.68.169 -p 7001 -a 123456 172.16.68.169:7001> info replication # Replication role:master connected_slaves:2 slave0:ip=172.16.68.169,port=7003,state=online,offset=14,lag=0 slave1:ip=172.16.68.169,port=7002,state=online,offset=0,lag=1 master_replid:494e12b5972575d97bda32b1c139d006ad42d59f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:14 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:14
# /usr/local/redis-4.0.11/src/redis-cli -h 172.16.68.169 -p 7002 -a 123456 172.16.68.169:7002> info replication # Replication role:slave master_host:172.16.68.169 master_port:7001 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:196 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:494e12b5972575d97bda32b1c139d006ad42d59f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:196 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:196
# /usr/local/redis-4.0.11/src/redis-cli -h 172.16.68.169 -p 7003 -a 123456 172.16.68.169:7003> info replication # Replication role:slave master_host:172.16.68.169 master_port:7001 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:252 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:494e12b5972575d97bda32b1c139d006ad42d59f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:252 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:252
至此,redis一主两从搭建完毕。
二、Redis高可用sentinel
但是master突然宕机了怎么办?slave需要手动提升为master,这种不太现实,我们需要一个能监控master状态的服务,一旦检测到master的状态是down,就从slave中选一个当master,这就需要sentinel登场啦。
Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。
1、sentinel配置
# vim /usr/local/redis-4.0.11/sentinel.conf port 26379 daemonize yes dir "/usr/local/redis-4.0.11" logfile "26379.log" sentinel deny-scripts-reconfig yes sentinel monitor mymaster 172.16.68.169 7001 1 #监控的主机为7001 sentinel down-after-milliseconds mymaster 5000 #master宕机5s后提升slave为主 sentinel auth-pass mymaster 123456 #redis认证密码
2、启动sentinel
# /usr/local/redis-4.0.11/src/redis-sentinel /usr/local/redis-4.0.11/sentinel.conf
3、redis切换测试
停掉master7001
# /usr/local/redis-4.0.11/src/redis-cli -h 172.16.68.169 -p 7001 -a 123456 Warning: Using a password with '-a' option on the command line interface may not be safe. 172.16.68.169:7001> shutdown
可以看到此时7003已经成为了master
注:这里我只启用了一个哨兵,当然也可以启用多个,配置多个哨兵和一个类似,监控的都要是master服务器,别忘记把哨兵监听的端口号变一变呀。