主从复制伪集群搭建

这里的伪集群配置的是 1 主 2 从。

1、复制 3 个配置文件,配置文件名分别为 redis-master-6379.confredis-slave-6380.confredis-slave-6381.conf

2、修改三个配置文件的端口号、日志文件和 rdb 文件。

redis-master-6379.conf 需要配置内容如下

pidfile /var/run/redis-slave-6379.pid
port 6379
logfile "redis-master-6379.log"
dbfilename redis-master-6379.rdb

redis-slave-6380.conf 需要配置内容如下

pidfile /var/run/redis-slave-6380.pid
port 6380
logfile "redis-slave-6380.log"
dbfilename redis-slave-6380.rdb

redis-slave-6381.conf 需要配置内容如下

pidfile /var/run/redis-slave-6381.pid
port 6381
logfile "redis-slave-6381.log"
dbfilename redis-slave-6381.rdb

临时配置主从节点

临时配置非常简单,只需要将从节点配置成主节点即可。以下是将 6380 端口的 redis 配置成从节点。

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379

以下是将 6381 端口的 redis 配置成从节点。

127.0.0.1:6381> SLAVEOF 127.0.0.1 6379

如果在从节点,输入这个命令,将会看到 role 是 slaver

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up

如果是在主节点,输入这个命令,可以看到有两台从节点

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=294,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=294,lag=0

永久配置主从节点

永久配置的话,只需将配置一下从节点中的配置文件。配置如下

# replicaof <masterip> <masterport>
replicaof 127.0.0.1 6379

主从节点的一些细节

向主节点写入数据

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> keys *
1) "tel"
2) "age"
3) "k1"
4) "qq"
5) "name"
6) "home"

1、从节点不能写数据,只能读取数据

127.0.0.1:6380> set key1 v1
(error) READONLY You can't write against a read only replica.
127.0.0.1:6380> get k1
"v1"

2、主节点关闭

主节点一旦关闭,那么从节点还是保持原来的模式。但会提示主节点的状态是关闭的。也就是依然不能写数据

127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:down

当主节点一连接上去,此时主节点再写入数据,从节点会立刻将主节点的数据复制过来。

127.0.0.1:6379> set k2 ve
OK
127.0.0.1:6380> get k2
"ve"

3、从节点关闭

从节点一旦关闭,如果只是临时将其配置为从节点,那么当它再次启动时,它就接收不到主节点的数据。因为启动完成之后,它就变成主节点了。

[root@localhost bin]# redis-cli -p 6380
127.0.0.1:6380> get k3
(nil)
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:0

如果我再次将其设置为从节点,它还会将主节点中的数据复制过来吗?当然会将主节点中的数据复制过来。

127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> get k3
"v3"

如果是永久配置的话,再次启动从节点,它就会自动地将主节点中的数据给复制过来了。

从节点变成主节点

要想变成主节点也非常简单,只需输入以下命令。

127.0.0.1:6381> SLAVEOF no one
OK
127.0.0.1:6381> show replication
(error) ERR unknown command `show`, with args beginning with: `replication`,
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover

主从复制原理

Slave 启动成功连接到 master 后会发送—个 sync 同步命令。

Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件到 slave,并完成一次完全同步。

主从复制有分为两种情况

  • 全量复制:而 slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中。

  • 增量复制:Master 继续将新的所有收集到的修改命令依次传给 slave,完成同步。

==只要是重新连接 master,一次完全同步(全量复制)将被自动执行。==