本文共 3231 字,大约阅读时间需要 10 分钟。
操作系统: ubuntu-16.04-x64master: 192.168.0.101slave: 192.168.0.120redis版本:4.0.9
单节点redis异常退出后,将导致这个系统的服务不可用,也即存在所谓的”单点故障”
redis 是基于key-value的内存数据库,而单节点的物理内存是有上限的,因此单节点的容量不可能大于最大物理内存。
单节点redis的性能是存在瓶颈的,不能应对海量高并发的应用场景。
为了解决以上问题,redis提供了集群解决方案。今天介绍redis主从复制技术。
redis的复制功能是支持多个数据库之间的数据同步。一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。
master与slave的数据流是单向的,只能从master到slave。
优点
1.数据副本 数据分布在多台机器上,增加了系统的可靠性,集群中任何一台机器宕机都不影响数据。2.扩展读性能
在主从复制集群中,master 一般不接受读请求,只接受写请求,slave 处理各种读请求。因此可以大大扩展集群的写性能,特别适合读多写少的应用场景。缺点
1.自动容错和恢复 主从复制不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。2.数据一致性
主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。3.复制开销
Redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。4.扩展性
主从复制较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。redis 主从的常见配置项:
slaveof# master ip 和端口masterauth # master 密码slave-read-only yes #slave 只读repl-diskless-sync no ##slave-serve-stale-data yes #当salve与mater丢失链接,或者正在同步的时候,有两种选择:如果 slave-serve-stale-data 设置为yes,slave将会响应client请求。数据可能是过时或者没有数据。如果 slave-serve-stale-data 设置为no,slave将会回复 error“sync with master in progress”。repl-diskless-sync-delay 5 #套接字模式复制策略的等待时长,单位是秒。等待是想汇集更多的slaverepl-ping-slave-period 10 #slaves在预定的时间间隔内发送ping给server。可以通过repl_ping_slave_period选项设置。默认是10秒。可以理解为心跳。repl-timeout 60 #与repl_ping_slave_period配合使用确认超时。repl-disable-tcp-nodelay norepl-backlog-size 1mb #slave与master断开后数据写入的存储空间大小repl-backlog-ttl 3600 #slave 在 3600秒内不与主站恢复链接,则释放空间。slave-priority 100 从站优先级,默认100,当主站宕机以后,哨兵会根据从站的配置,来确定把谁提升为主站。min-slaves-to-write 3 #最小从服务器数min-slaves-max-lag 10 #从服务器最大确认延迟slave-announce-ip 5.5.5.5slave-announce-port 1234
修改slave节点redis配置中的slaveof属性即可
#修改绑定地址与保护模式,使redis可以接受远程访问,master 节点也应修改此配置bind 0.0.0.0protected-mode no# 配置slaveof 属性slaveof 192.168.0.101 6379
启动master 节点与slave 节点,查看master 与slave 节点的信息
master
# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.0.120,port=6379,state=online,offset=450,lag=0master_replid:98964946bd40954a2edc52c72df20ad69ebfac9bmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:450second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:450
slave
# Replicationrole:slavemaster_host:192.168.0.101master_port:6379master_link_status:upmaster_last_io_seconds_ago:6master_sync_in_progress:0slave_repl_offset:520slave_priority:100slave_read_only:1connected_slaves:0master_replid:98964946bd40954a2edc52c72df20ad69ebfac9bmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:520second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:520
完成后可以通过在master写数据,slave读数据进行简单的测试。
master
127.0.0.1:6379> set key1 test OK
slave
127.0.0.1:6379> get key1"test"
通过redis-cli 连接到从节点服务器,执行下面命令即可。
127.0.0.1:6379> SLAVEOF 192.168.0.101 6379
通过这个命令slave 与master 就建立了主从关系,也可以通过slaveof 命令取消主从关系。
127.0.0.1:6379> SLAVEOF no one
转载地址:http://vgcmb.baihongyu.com/