概念
-
主从复制只能由主节点复制到从节点的单向复制。
-
主节点以写为主,从节点以读为主。
-
默认情况下所有的redis节点都是主节点,主从模式需要配置。
-
环境配置。只需配置从节点,不需要配置主节点。默认配置就是主节点。
127.0.0.1:6379> info replication # Replication role:master #默认主节点 connected_slaves:0 #从机为0 master_replid:0dc7fba9a3df5f508d9f4721b386b860330bc6c3 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6379>
场景模拟
-
在一台机器上模拟3个redis节点。一主两从 。
-
修改配置文件,下列几个地方
port 6381 pidfile /var/run/redis_6381.pid logfile "6381.log" dbfilename dump6381.rdb #这四个地方,修改为对应的端口号标记 6379,6780,6381
-
启动3个节点
[root@localhost bin]# redis-server /opt/redisconfig/redis79.conf [root@localhost bin]# redis-server /opt/redisconfig/redis80.conf [root@localhost bin]# redis-server /opt/redisconfig/redis81.conf [root@localhost bin]# ps -ef|grep redis root 2253 1 0 21:03 ? 00:00:00 redis-server 127.0.0.1:6379 root 2258 1 0 21:03 ? 00:00:00 redis-server 127.0.0.1:6380 root 2263 1 0 21:03 ? 00:00:00 redis-server 127.0.0.1:6381 root 2268 2130 0 21:03 pts/0 00:00:00 grep --color=auto redis #3个节点启动完成
-
使用命令配置
6379为主节点,6380和6381为从节点
配置从节点
#设置主节点命令 127.0.0.1:6380> SLAVEOF 127.0.0.1 6379 OK 127.0.0.1:6380> info replication # Replication role:slave #自己变为从节点 master_host:127.0.0.1 #主节点ip master_port:6379 #主节点端口 master_link_status:up master_last_io_seconds_ago:2 master_sync_in_progress:0 slave_repl_offset:14 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:148c2238f7a82ed46ef40a2b9d4a7c5f2e1d0fcb 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 127.0.0.1:6380>
6381节点也执行上面的操作。此时,主机6379的信息为
127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 #两个从节点 slave0:ip=127.0.0.1,port=6380,state=online,offset=266,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=266,lag=1 master_replid:148c2238f7a82ed46ef40a2b9d4a7c5f2e1d0fcb master_replid2:0000000000000000000000000000000000000000 master_repl_offset:266 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:266 127.0.0.1:6379>
从命令行设置的主从节点,在节点重启后就会丢失设置。使用配置文 件配置主从节点,可在重启后保存配置。
-
从配置文件配置主从节点,只需修改从节点的配置文件。
replicaof 127.0.0.1 6379 #配置主节点ip和端口号 #masterauth <master-password> 如果主节点有密码需要配置密码
此时的模型为下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/b671fb462bbf47ab86b0f986f04914dc.png#pic_center)
-
主从配置设置好后,只能从主机写,从机不能写。主从都可以读。
在主机写入的信息会自动同步到所有从节点。
#从机写报错 127.0.0.1:6380> set k2 v2 (error) READONLY You can't write against a read only replica. 127.0.0.1:6380>
-
如果此时主机断开,从机的属性还是不变,从机还是默认连接到主机的。此时集群没有写操作。主机重启后集群还是正常工作。
-
如果从机断开,当从机重新启动后会同步到主机写入的所有信息。
-
断开后重新连接的从机会和主机发起一次全量复制,连接中的从机和主机发起增量复制。
-
另外一种串联式的模型为:
此时数据由6379同步到6380,再由6380同步到6381。6380还是从节点,不能写。
-
从节点可以使用命令配置为主节点
#设置不做任何人的从节点 127.0.0.1:6381> SLAVEOF no one OK 127.0.0.1:6381> 127.0.0.1:6381> info replication # Replication role:master #当前为主节点 connected_slaves:0 master_replid:bf2e6cd8ff165a47a950bb94a406f11266f32a06 master_replid2:11e986ffb97209e86125959bd830b7ccce3b503f master_repl_offset:1999 second_repl_offset:2000 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:15 repl_backlog_histlen:1985 127.0.0.1:6381>
-
在没有配置哨兵模式的集群中,如果主节点挂掉,只能手动重启主节点或者设置新的主节点。