开发者学堂课程【Redis 数据库入门:Redis_集群_主从模式_哨兵模式_1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/15/detail/58
Redis_集群_主从模式_哨兵模式_1
内容介绍:
一、主从复制的功能
二、主从复制的运行方式
三、主从复制的创建
四、主从复制的问题
Redis 可以多个节点共同展开服务,成为 Redis 集群。Redis 集群分为主从复制Replication、高可用 Sentinel、集群 Cluster 与分布式 twemproxy 四类。
一、主从复制的功能
1、“主”与“从”的含义
提到主从复制,可能会首先想到 master 及多个 slave,而此处的“主从”与分度计算里的“主从”不同,分度计算里的“主”是做调度的,而“从”是真正进行实际操作的。
而 Redis 数据库里的“主从”要指的是一个“主”,以及多个“从”来复制上面的数据。
一个 Redis 服务可有多个该服务的复制品。Redis 服务称为 Master,其他的复制品称为Slaves。
2、各自的功能
只要网络正常连通,Master 都会将自己的数据更新同步给 Slave,保持主从数据之间的同步。
只有 Master 可以执行写命令,而 Slave 只能执行读命令,这是默认的。可用下图表示:
即可以一个主服务器复制一个从服务器,也可以一个主服务器复制A、B、C多个从服务器,但是从服务器只能读命令,主服务器才能写命令。
总之,主从复制里,从服务器分担了读命令的压力,即可以从4个机器上面来读,而写还是原来的一个主服务器。
二、主从复制的运行方式
1、从服务器执行客户端发送的读命令。
读命令有 GET、LARANGE、SMEMMBERS、HGET、ZRANGE 等。客户端可以连接Slave 执行读请求来降低 Master 的读压力。
假设之前如果只有一个主服务器,读写命令都是主服务器来完成,而如果有多个从服务器,可以从不同机器上面来读命令,当然主服务器也可以读命令,它兼具读、写命令的功能。
2、主从复制创建方式
(1)通过 redis-server--slaveof<master-ip><master-port> 配置
redis-server 脚本可以启动 redis 的服务;--slaveof 可以让服务器启动的时作为一个从服务器;<master-ip> 是主服务器的 Ip,<master-port> 是主服务器的端口。这样在服务器启动时候就可以自动创建从服务器。
如:执行 redis-server--port 6380 --slaveof 127.0.0.1 6379
进入服务器配置页面,之前已经配置过环境变量,因此可用直接写 redis-server,编辑启动端口--port 6380,编辑从服务器所从属的主服务器对象的 IP 及端口--slaveof 127.0.0.1 6379,即 redis-server--port 6380 --slaveof 127.0.0.1 6379。
启动页面中显示,启动的 Redis 服务器端口是6380,版本是2.8.18,是64位的服务器,且为单节点模式(in stand alone mode)。
启用后的具体操作可以在日志中查询。首先Connecting to Master 127.0.0.1 6379,即连接端口为6379的主服务器;接下来MASTER <->SLAVE sync started,即同步主从服务器之间的数据;然后Non blocking connect for SYNC fired the event,Master replied to PING,replication can continue… 实现了主从服务器之间通讯,开始数据同步。下面的内容显示同步数据量。
也可以再一个客户端连接进来。执行redis-cli -p 6380(-p 6380为连接的端口,若不写这一端口名,则默认连接到本地)-n(可以设置连接的数据库,不设置则默认为0号数据库)。回车之后则进入6380端口,作为从服务器。该从服务器中已经有了之前从主服务器中。输入 keys,即可发现之前操作的数据仍未丢失。
注意从服务器不能写命令。如执行 set mykey 12,系统报错,显示 READONLY,即从服务器是只读的。
(2)启动一个服务之后,连到该服务中,通过 slaveof 命令将它切换为从服务器。
停掉先前的操作,退出之前的客户端,确认监控端口只有6379,即只有主服务器还在。再次启动 redis-server--port 6380,此时启动的是6380的端口服务,接着我再连接到该端口进去,执行 redis-cli -p 6380,输入 keys *,发现数据已经实现了同步。
再次尝试写入命令 set mykey 123,此时系统显示“ok”。只有主服务器才能写命令,而现在成功写入了命令,说明此时的服务器是主服务器。
①需要将其变为从服务器,输入--slaveof 127.0.0.1 6379接入服务器IP和端口。尝试再次写入命令 set newkey 456,系统报错。因为此时该服务器切换为了从服务器。切换为从服务器之后会同步数据,那 mykey 的数据就不存在了。输入 keys*验证缺失没有 mykey 的数据。因为其作为从服务器会同步主服务器的数据,主服务器没有该数据,自然同步数据后的从服务器也没有该数据。
②我们再尝试将该服务器变回主服务器,输入命令 SLAVEOF NO ONE,表明该服务器不是任何服务器的从服务器,即主服务器。此时又可以往里面去设置新的key。先输入 keys* 查看 mykey 是否存在,结果显示不存在,因为刚刚其作为一个从服务器时从主服务器同步数据时没有 mykey 的数据,相当于刚才设置的 mykey 数据了就不存在了。此时变为主服务器之后又可以重新设置。
(3)配置方式
启动时可以读取通过配置文件作为从服务器。如在 redis-server--port6380 对应的配置文件里写 slaveof??即可以启动起来作为从服务器。
输入 vim 6380.conf,slaveof 127.0.0.1 6379,保存退出。先把该服务停掉,查询端口确认只有6379,输入 redis-server 6380.conf,用该文件来启动,显示为Increased maximum number of open files to 10032(It was originally set to 1024),Creating Server TCP listening socket *:6379:bind:Adress already in use。
此处其默认端口是6379,而此时端口还是只有6379,说明没有成功启动,原因在于6379已经bind。默认的配置文件里面的port端口是6379,即此时应添加一条port 6380,完整的命令如下:
vim 6380.conf
slaveof 127.0.0.1 6379
redis-server 6380.conf
port 6380
此时点击回车即可作为一个 Slave 启动。
三、主从复制的演示
1、redis-server--slaveof<master-ip><master-port>
# redis-server--port 6380 --slaveof 127.0.0.1 6379
# redis-cli -p 6380 -n 0
#测试 Master 和 Slave 的读写
2、SLAVEOF 命令
# 从服务器连接到192.268.56.201的6379 端口
# redis > SLAVEOF 192.268.56.201 6379
# redis > SLAVEOF NO ONE,将服务器重新恢复到 Master,不会丢失已同步数据
# redis > SET n2key S
# redis > get n2key
# redis > keys*
# redis > SLAVEOF 192.268.56.201 6379
# redis > keys*
3、配置方式
# 在 node2 节点安装配置 redis 服务,修改配置文件
# SLAVEOF 192.268.56.201 6379
# 启动服务,观察和node1的同步
# redis > SLAVEOF NO ONE,观察是否可以set、keys*
四、主从复制的问题
1、一个 Master 可以有多个 Slave;
2、Slave 下线,只是读请求的处理性能下降;
3、Master 下线,写请求无法执行;
4、其中一台 Slave 使用 SLAVEOF NO ONE 成为 Master,其他 Slaves 执行 SLAVEOF 命令指向这个新的 Master,并从它获得数据同步;
以上过程是手动的,能够实现自动则需要 Sentine 哨兵,实现故障转移 Failover 操作。
