1.Redis主从介绍
主从服务就是用户在主服务器写入数据后,从服务器在写一份数据,一般用在如下场景:
1、辅助实现备份
2、高可用(主从复制只是redis高可用的前提)
3、异地容灾
4、分摊负载
redis主从特点介绍:
1、redis使用异步复制,从服务器会以每秒一次的频率向主服务器报告复制流的处理进度
2、一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器
3、复制功能不会阻塞主服务器,即使一个或多个从服务器正在进行初次同步,主服务器也可以继续处理命令请求
4、复制功能可以用于数据冗余,也可以通过让多个从服务器处理只读命令请求来提升扩展性
5、Redis从节点默认为只读,无须手动配置
注意事项:
看到网上很多人都说使用主从复制后可以关闭主服务器持久化操作,由从服务器执行持久化操作,这个需要分场景;比如
场景一:
一主一从环境下,主节点故障临时切换所有读写操作到从节点,但是主节点从新上线,从节点就会从新复制主节点数据,从而导致数据丢失。
场景二:
Sentinel高可用环境下,主节点故障从新上线后,会被当成从节点,而不是主节点,从而不会丢失数据。
Redis主从复制原理图说明:
1、启动一个slave以后,slave会向master发送sync请求,请求同步主库数据
2、Master会启动一个后台的子进程(BGSAVE),将数据快照保持在数据文件(.rdb)中,将数据文件发送给slave
3、Slave接收到主库的数据文件(.rdb)后保存到本地,而后把数据文件重新载入内存中,完成同步。
篇幅有限,更多内容参考:
http://redisdoc.com/topic/replication.html
2.sentinel介绍:
思考一个问题。在redis主从复制架构中,如果主服务器当机那么这个复制集群能否正常提供服务?答案当然是不能。
Sentinel就是来解决redis复制集群主节点单点问题的,作用如下:
1、监控:sentinel会不断的检查你的主服务器和从服务器是否运行正常
2、当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发送通知
3、自动故障转移:当一个主服务器不能正常工作时,sentinel会开始一次自动故障转移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主机的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器。
sentinel配置文件介绍:
Sentinel需要专用配置文件:/etc/redis-sentinel.conf,主要配置有以下四个
(1)指明监控的主节点(可以监控多个,一组sentinel可以监控多个主节点):
sentinel monitor
(2)判断某节点不在线需要的时长,默认单位为毫秒
sentinel down-after-milliseconds
(3)设置故障转移后,允许多少从服务器连接主节点发起同步请求
sentinel parallel-syncs
(4)故障转移的超时时间(单位毫秒),如果故障转移在指定时间内无法完成,则认为故障转移失败
sentinel failover-timeout
专用命令:
SENTINEL masters 列出所有监视的主服务器
SENTINEL slaves 获取指定主服务器的所有从节点
SENTINEL get-master-addr-by-name 根据master命令来获取地址
SENTINEL reset 清除服务器所有状态
SENTINEL failover 手动执行故障转移
Redis主从+sentinel架构需要考虑的问题:
1、sentinel节点故障
2、sentinel节点无法连接到主节点
解决方法,配置sentinel高可用
更多内容参考:
http://redisdoc.com/topic/sentinel.html
3.Redis主从+sentinel配置
实验环境说明:
主机名 | Ip地址 | 功能介绍 | |
主节点 | master | 172.16.4.101 | Redis主节点,提供读写操作 |
从节点-01 | slave-01 | 172.16.4.102 | Redis从节点,复制主节点数据,提供冗余作用 |
从节点-02 | slave-02 | 172.16.4.103 | Redis从节点,复制主节点数据,提供冗余作用 |
Sentinel | sentinel | 172.16.4.104 | 监控节点,一旦发现主节点宕机,则启动从节点为主节点 |
系统环境:
[root@master ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@master ~]# uname -rn master 2.6.32-504.el6.x86_64
软件环境:
redis-3.0.2-1.el6.remi.x86_64.rpm
架构图:
架构说明:
1、如果主节点修复在上线,就会变成从节点。
2、客户端程序连接时,应该链接sentinel节点
配置注意事项:
1、主服务器和从服务器都不能使用127.0.0.1地址,否则会复制失败。
2、从服务器监听地址需要和主服务器在同一个网段,不要使用0.0.0.0
3、时间同步,只要是集群都需要做这个
4、如果master使用requirepass开启了认证功能,从服务器要使用masteauth 来连入服务器请求使用此密码进行认证。
4.Redis安装
master节点:
(1)下载redis到本地,使用yum命令安装
[root@master ~]# yum localinstall redis-3.0.0-2.el6.remi.x86_64.rpm
(2)修改配置文件,设置监听的端口和设置后台启动,并且开启aof持久化功能
[root@master ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf [root@master ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.101/'g /etc/redis.conf [root@master ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf
(3)启动redis,并且检查是否监听了6379端口
[root@master ~]# service redis start [root@master ~]# netstat -lntp | grep redis tcp 0 0 172.16.4.101:6379 0.0.0.0:* LISTEN 39868/redis-server
4.1.slave-01节点:
配置过程和主节点一样,只不过监听的地址不同
[root@slave-01 ~]# yum -y localinstall redis-3.0.0-2.el6.remi.x86_64.rpm [root@slave-01 ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf [root@slave-01 ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.102/'g /etc/redis.conf [root@slave-01 ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf [root@slave-01 ~]# service redis start
4.2.slave-02节点:
配置过程和主节点一样,只不过监听的地址不同
[root@slave-02 ~]# yum -y localinstall redis-3.0.0-2.el6.remi.x86_64.rpm [root@slave-02 ~]# sed -i s'/^daemonize no/daemonize yes/'g /etc/redis.conf [root@slave-02 ~]# sed -i s'/^bind 127.0.0.1/bind 172.16.4.103/'g /etc/redis.conf [root@slave-02 ~]# sed -i s'/^appendonly no/appendonly yes/'g /etc/redis.conf [root@slave-02 ~]# service redis start
5.配置主从
slave-01配置:
redis配置主从的过程非常简单,只需要一行配置指明主服务器地址和端口即可
[root@slave-01 ~]# vim /etc/redis.conf slaveof 172.16.4.101 6379
设置完成重启服务
[root@slave-01 ~]# service redis restart
slave-02配置:
slave-02配置和slave-01一样,同样是一个配置文件指明主节点地址即可,只不过这里使用的是sed命令直接替换配置文件
[root@slave-02 ~]# sed -i '/# slaveof /aslaveof 172.16.4.101 6379' /etc/redis.conf [root@slave-02 ~]# service redis restart
查看主从复制状态:
主节点查看复制信息
[root@master ~]# redis-cli -h 172.16.4.101 #登陆redis 172.16.4.101:6379> INFO replication #查看复制的详细信息 # Replication role:master #当前节点角色 connected_slaves:2 #从节点数量 slave0:ip=172.16.4.103,port=6379,state=online,offset=141,lag=1 #显示从节点的复制信息 slave1:ip=172.16.4.102,port=6379,state=online,offset=141,lag=0 master_repl_offset:141 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:140
从节点查看复制信息
[root@slave-01 ~]# redis-cli -h 172.16.4.102 172.16.4.102:6379> INFO replication # Replication role:slave #当前节点角色 master_host:172.16.4.101 #主节点地址 master_port:6379 master_link_status:up #复制状态 master_last_io_seconds_ago:9 master_sync_in_progress:0 slave_repl_offset:225 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
验证主从复制
主节点设置一个键值对:
172.16.4.101:6379> SET name xmfb OK 172.16.4.101:6379> KEYS * 1) "name" 172.16.4.101:6379> GET name "xmfb"
从节点查看已经复制过来了对应的键值对:
[root@slave-01 ~]# redis-cli -h 172.16.4.101 172.16.4.101:6379>KEYS * 1) "name" 172.16.4.101:6379>GET name "xmfb" [root@slave-02 ~]# redis-cli -h 172.16.4.103 172.16.4.103:6379>KEYS * 1) "name" 172.16.4.103:6379> GET name "xmfb"
6.配置sentinel
Sentinel安装和其他节点一样,也只是安装一个redis包,只不过配置文件和启动文件和redis不同罢了
[root@master ~]# yum localinstall redis-3.0.0-2.el6.remi.x86_64.rpm
修改sentinel配置文件,指定监控的主redis服务器和其他的一些监控配置
[root@sentinel ~]# vim /etc/redis-sentinel.conf sentinel monitor mymaster 172.16.4.101 6379 1 #设置监控的redis主节点 sentinel down-after-milliseconds mymaster 5000 #如果5秒内检测不到mymaster节点存活,则认为主节点故障从而进行转移操作 sentinel parallel-syncs mymaster 1 #设置故障转移后,允许多少从服务器连接主节点发起同步请求 sentinel failover-timeout mymaster 60000 #故障转移的超时时间(单位毫秒)
设置完成,启动sentinel的专用脚本redis-sentinel,启动之后检查是否监听了26379端口
[root@sentinel ~]# /etc/init.d/redis-sentinel start [root@sentinel ~]# netstat -lntp | grep sentinel tcp 0 0 0.0.0.0:26379 0.0.0.0:* LISTEN 2724/redis-sentinel tcp 0 0 :::26379 :::* LISTEN 2724/redis-sentinel
连入sentinel监听的26375端口查看sentinel的信息
[root@sentinel ~]# redis-cli -h 172.16.4.104 -p 26379 172.16.4.104:26379> INFO # Server redis_version:3.0.2 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:6be7fc9e6b88f79 redis_mode:sentinel os:Linux 2.6.32-504.el6.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.7 process_id:2724 run_id:dc0fadff4036fb0a8a0d9f0ecd728d97c9e8ac38 tcp_port:26379 uptime_in_seconds:58 uptime_in_days:0 hz:11 lru_clock:16361951 config_file:/etc/redis-sentinel.conf # Sentinel sentinel_masters:1 #监听主服务器数量 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=mymaster,status=ok,address=172.16.4.101:6379,slaves=2,sentinels=1 #监听主服务器信息
7.验证sentinel故障转移是否成功
非正常关闭redis主节点,模拟主节点故障(当然直接关闭redis服务也可以)
[root@master ~]# ps aux | grep redis redis 39868 0.1 0.7 139344 7492 ? Ssl 23:00 0:03 /usr/bin/redis-server 172.16.4.101:6379 root 39954 0.0 0.0 103252 832 pts/1 S+ 23:28 0:00 grep redis [root@master ~]# kill -9 39868 [root@master ~]# ps aux | grep redis root 39956 0.0 0.0 103252 836 pts/1 S+ 23:29 0:00 grep redis
登陆sentinel查看主节点已经变成了从slave-02
172.16.4.104:26379> INFO # Server redis_version:3.0.2 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:6be7fc9e6b88f79 redis_mode:sentinel os:Linux 2.6.32-504.el6.x86_64 x86_64 arch_bits:64 multiplexing_api:epoll gcc_version:4.4.7 process_id:2724 run_id:dc0fadff4036fb0a8a0d9f0ecd728d97c9e8ac38 tcp_port:26379 uptime_in_seconds:165 uptime_in_days:0 hz:12 lru_clock:16362058 config_file:/etc/redis-sentinel.conf # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 master0:name=mymaster,status=ok,address=172.16.4.103:6379,slaves=2,sentinels=1 #集群主节点发生改变
登陆slave-01查看redis主节点已经变成了slave-02
[root@slave-01 ~]# redis-cli -h 172.16.4.102 172.16.4.102:6379> INFO replication # Replication role:slave master_host:172.16.4.103 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:4278 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
登陆slave-02查看自己已经变成了主节点,并且有了一个从节点
172.16.4.103:6379> INFO replication # Replication role:master connected_slaves:1 slave0:ip=172.16.4.102,port=6379,state=online,offset=6405,lag=0 master_repl_offset:6405 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:6404
这个时候redis主从复制+sentinel集群就配置完成了,限于篇幅有限说明可能不是很清楚,有问题可以留言或者直接联系我qq
补充内容
sentinel还可以获取主节点的配置信息
172.16.4.104:26379> SENTINEL masters
获取指定主节点的从节点信息
172.16.4.104:26379>SENTINEL slaves mymaster
8.参考文档:
Redis命令参考手册:http://redisdoc.com/
redis官方站点:http://www.redis.io/