一、 搭建环境信息
Linux 操作系统: centos6.1
Redis版本:redis-4.0.6.tar.gz
二、配置主从复制原理
1、 为什么搭建redis主从复制:持久化保证了即使 redis 服务重启也会丢失数据,因为 redis 服务重启后会将硬盘上持久化的数据恢复到内存中,但是当 redis 服务器的硬盘损坏了可能会导致数据丢失,如果通过 redis 的主从复制机制就可以避免这种单点故障
2、redis主从复制原理:redis的主从结构可以采用一主多从或者级联结构,Redis主从复制分为全量同步和增量同步。
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。
增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
注意点
注意:
1:在Redis2.8之前,主从断线或则重启之后再重连接,都需要做一次完整的sync操作(5步骤),即使断线期间只有几
条的更新操作或则是没有操作,导致系统资源极度浪费。Redis2.8之后,会用一个psync来替换sync,不会进行完成的sync
操作,只需要同步断线期间的记录。相关参数:repl-backlog-size、repl-backlog-ttl
2:如果多个Slave断线了,需要重启的时候,因为只要Slave启动,就会发送sync请求和主机全量同步,当多个同时出现的
时候,可能会导致Master IO剧增宕机,
三、redis 主从环境搭建
1、实验环境:
准备使用一主二从搭建redis主从服务
server:1921.68.2.166:6378 redis-master
server:1921.68.2.166:6377 redis-slave1
server:1921.68.2.166:6376 redis-slave2
2、redis安装及配置在前面已经讲过,不懂到可以参考:
在redis安装目录下创建文件夹:mkdir redis-master redis-slave1 redis-slave2
[root@zero local]# mkdir redis-master redis-slave1 redis-slave2
[root@zero local]# ll
total 60
3、拷贝redis.conf配置文件分别到刚创建到文件夹下
[root@zero local]# cp redis/redis.conf redis-master/
[root@zero local]# cp redis/redis.conf redis-slave1
[root@zero local]# cp redis/redis.conf redis-slave2
4、修改配置文件端口号和绑定到ip访问限制
#修改bind参数后面到ip,如果默认只能在本机访问redis服务,如果只限制某个ip能访问,
# bind 192.168.2.116 ,如果不限制ip访问,所有都可以访问需要注解该参数
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
# 同时需要修改protected-mode参数,默认是yes受保护到,需要修改成no取消保护
protected-mode no
# bind和protected-mode同时修改才行,不然远程访问不起作用
# requirepass 设置redis密码访问,如果master设置requirepass ,slave需要设置masterauth
# requirepass foobared
# 主从最主要slave服务要配置 slaveof ip地址 port端口号
slaveof 192.168.2.166 6378
redis-master 服务参数配置
bind 0.0.0.0
port 6378
protected-mode no
requirepass 123456
redis-slave1 服务参数配置
bind 0.0.0.0
port 6377
protected-mode no
requirepass 123456
# 配置redis-master IP 和端口
slaveof 192.168.2.166 6378
#如果redis-master添加有密码访问修改添加masterauth
masterauth 123456
redis-slave2 服务参数配置
bind 0.0.0.0
port 6376
protected-mode no
requirepass 123456
# 配置redis-master IP 和端口
slaveof 192.168.2.166 6378
#如果redis-master添加有密码访问修改添加masterauth
masterauth 123456
以上配置信息全部配置完成,启动redis服务
[root@zero local]# ./redis/src/redis-server redis-master/redis.conf
[root@zero local]# ./redis/src/redis-server redis-slave1/redis.conf
[root@zero local]# ./redis/src/redis-server redis-slave2/redis.conf
# 查看服务启动情况
[root@zero local]# ps -ef|grep redis
root 11544 1 0 16:11 ? 00:00:00 ./redis/src/redis-server 0.0.0.0:6378
root 11568 1 0 16:12 ? 00:00:00 ./redis/src/redis-server *:6377
root 11806 1 0 16:17 ? 00:00:00 ./redis/src/redis-server *:6376
root 12047 3410 0 16:22 pts/0 00:00:00 grep redis
使用redis disktop message 连接远程redis服务,在master服务添加一个值看slave服务是否同步key值,如果能同步key值,说明redis一主二从服务搭建成功。
redis主从配置一些常见参数说明:
################################# REPLICATION #################################
#复制选项,slave复制对应的master。
# slaveof <masterip> <masterport>
#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。
# masterauth <master-password>
#当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续响应客户端的请求。2) 如果slave-serve-stale-data设置为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC with master in progress”。
slave-serve-stale-data yes
#作为从服务器,默认情况下是只读的(yes),可以修改成NO,用于写(不建议)。
slave-read-only yes
#是否使用socket方式复制数据。目前redis复制提供两种方式,disk和socket。如果新的slave连上来或者重连的slave无法部分同步,就会执行全量同步,master会生成rdb文件。有2种方式:disk方式是master创建一个新的进程把rdb文件保存到磁盘,再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程,直接把rdb文件以socket的方式发给slave。disk方式的时候,当一个rdb保存的过程中,多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢,网速快的情况下推荐用socket方式。
repl-diskless-sync no
#diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间,等更多的slave连上来。
repl-diskless-sync-delay 5
#slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置,默认10秒。
# repl-ping-slave-period 10
#复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout,即认为slave离线,清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout,则认为master离线。需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值,不然会经常检测到超时。
# repl-timeout 60
#是否禁止复制tcp链接的tcp nodelay参数,可传递yes或者no。默认是no,即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置,在把数据复制给slave的时候,会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟,但是在数据量传输很大的场景下,建议选择yes。
repl-disable-tcp-nodelay no
#复制缓冲区大小,这是一个环形复制缓冲区,用来保存最新复制的命令。这样在slave离线的时候,不需要完全复制master的数据,如果可以执行部分同步,只需要把缓冲区的部分数据复制给slave,就能恢复正常复制状态。缓冲区的大小越大,slave离线的时间可以更长,复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间,内存会被释放出来,默认1m。
# repl-backlog-size 5mb
#master没有slave一段时间会释放复制缓冲区的内存,repl-backlog-ttl用来设置该时间长度。单位为秒。
# repl-backlog-ttl 3600
#当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。而配置成0,永远不会被选举。
slave-priority 100
#redis提供了可以让master停止写入的方式,如果配置了min-slaves-to-write,健康的slave的个数小于N,mater就禁止写入。master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个slave都一定能接收到master的写操作,但是能避免没有足够健康的slave的时候,master不能写入来避免数据丢失。设置为0是关闭该功能。
# min-slaves-to-write 3
#延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。
# min-slaves-max-lag 10
产考文档:
主从复制
aof和rdb持久化到对比