简介
REmote DIctionary Server(Redis),远程字典服务器。是一个key-value存储系统。类似于memcached,将数据完全存储于内存中,不过和memcached不同的是,redis可以将内存中的数据存储到磁盘中,以实现数据的持久化存储,还可以实现主从复制、高可用等架构。主从复制很常用,也很简单,跟着我来实现吧!
主从复制原理
当启动主从复制时候,主节点将自己内存中的数据做一份快照(snapshotting),将快照发给从节点从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。不过基于快照方式有两种:
(1)一种是主节点创建快照后不保存到本地,而直接从内存中通过网络发送给从节点。
(2)另一种是如果从服务器比较多的时候,对于每个从服务器都要复制一份快照存在于内存中,然后再逐个发给客户端,这样就大大浪费了资源。这时候主节点时候将创建的快照存在于本地磁盘中,然后将这一份快照可以重复使用,发送给所有的从节点即可。
主从复制特点:
- 一个Master可以有多个slave主机,支持链式复制;
- Master以非阻塞方式同步数据至slave主机;
配置方式
配置方式有两种,一种是基于配置文件进行配置,另一种是直接在命令行中配置。
主节点什么都不需要配置,只需要在从节点上指定主服务器即可。
命令行方式
1、redis-cli> SLAVEOF <MASTER_IP> <MASTER_PORT>
指定主服务器,默认主服务器监听在本地127.0.0.1ip上,需要使用bind指定绑定地址,bind可以使用多次。
2、redis-cli> CONFIG SET masterauth <PASSWORD>
如果主服务器设定了认证密码,需要指定此选项
3、如果正常的话,将成功指定主服务器
配置文件方式
编辑配置文件/etc/redis.conf
1、指定slaveof
格式:slaveof <masterip> <masterport>
2、指定masterauth
格式:masterauth <master-password>
指定主服务器验证密码
3、重启服务
systemctl restart redis
注意:主服务器上要监听到指定的网卡ip,默认监听的是本机的127.0.0.1接口上。
如何确认主从配置成功
配置好了,进行重启服务后,如何确认主从配置成功呢?
主服务上:
127.0.0.1:6379> INFO Replication
role:master
connected_slaves:1
slave0:ip=172.16.251.241,port=6379,state=online,offset=8597,lag=1
从服务器上:
127.0.0.1:6379> info replication,不区分大小写
# Replication
role:slave角色是slave
master_host:172.16.253.44
master_port:6379
master_link_status:up,确保状态是连接,如果是down则代表未成功连接上主服务器
主服务器可能用到的配置
- slave-serve-stale-data yes在主服务器宕机时候,能不能使用旧的数据提供服务。
- slave-read-only yes,只有作为从服务器时候才有用。
- *repl-diskless-sync no,无磁盘复制是否开启,no代表使用基于磁盘的复制。如果是磁盘很慢,网络很快,则建议使用diskless模式,
新的从节点或某较长时间未能与主节点进行同步的从节点重新与主节点通信,需要做“full synchronization”,此时其同步方式有两种style:
a) Disk-backend:主节点新创建快照文件于磁盘中,而后将其发送给从节点;
b) Diskless:主节点新创建快照后直接通过网络套接字文件发送给从节点;为了实现并行复制,通常需要在复制启动前延迟一个时间段;
c) no:no代表使用基于Disk-backend磁盘的方式 - repl-diskless-sync-delay 5无磁盘复制时候才有效,主机应该延迟一段时间,再进行复制给从节点,等待越多的从节点加进来,则进行集中发送的可能性越大。
repl-ping-slave-period 10,主节点每隔10s进行探测从服务器是否在线
*repl-timeout 60,如果探测一次不在线,再探测还不在线,则过多长时间超时。
repl-disable-tcp-nodelay no,no代表启用,数据再小都要发送给从服务器,而不是凑到一堆时候在发送给从服务器。
- repl-backlog-size 1mb后援队列的大小
repl-back-ttl 3600后援队列的超时时长,0代表不超时
*slave-priority 100
复制集群中,主节点故障时,sentinel应用场景中的主节点选举时使用的优先级;数字越小优先级越高,但0表示不参与选举;min-slaves-to-write 3:当集群比较大,机器比较多的时候,至少有几个从节点时候,主节点才允许写操作。
- min-slaves-max-lag 10:从节点延迟于主节点多少时长时,主节点将拒绝写入操作;lag代表延迟,如果超过10s的时候,不将其作为在线的从节点。