一、主从模式
在主从复制中,数据库分为两类:主服务器和从从服务器
1.1、特点
- 主服务器可以进行读写操作,当读写操作导致数据变化时自动将数据同步给从数据库;
- 从数据库一般都是只读的,并且接收主数据库同步过来的数据;
- 一个主服务器可以拥有多个从服务器,但是一个从服务器只能对应一个主服务器;
- 从服务器挂了不影响其他从服务器的读和主服务器的读和写,重新启动后会将数据从主服务器同步过来;
- 主服务器挂了以后,不影响从服务器读,但 Redis 不再提供写服务,主服务器重启后 Redis 将重新对外提供写服务;
- 主服务器挂了以后,不会在从服务器节点中重新选一个主服务器;
1.2、工作机制
- 当从服务器启动后,主动向主服务器发送 SYNC 命令。主服务器接收到 SYNC 命令后在后台保存快照(RDB 持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给从服务器。从服务器接收到快照文件和命令后加载快照文件和缓存的执行命令;
- 复制初始化后,主服务器每次接收到的写命令都会同步发送给从服务器,保证主从数据一致性;
1.3、安全设置
当主服务器节点设置密码后:
- 客户端访问主服务器需要密码;
- 启动从服务器需要密码,在配置文件中配置即可;
- 客户端访问从服务器不需要密码;
1.4、缺点
从上面可以看出,主服务器节点在主从模式中唯一,若主服务器节点挂掉,则 Redis 无法对外提供写服务;
1.5、主从模式搭建
环境准备
master节点 192.168.30.128
slave节点 192.168.30.129
slave节点 192.168.30.130
修改配置:192.168.30.128
# vim /usr/local/redis/redis.conf
# 监听 ip,多个 ip 用空格分隔
bind 192.168.30.128
# 允许后台启动
daemonize yes
# 日志路径
logfile "/usr/local/redis/redis.log"
# 数据库备份文件存放目录
dir /data/redis
# slave 连接 master 密码,master 可省略
masterauth 123456
# 设置 master 连接密码,slave 可省略
requirepass 123456
# 在/data/redis/目录生成 appendonly.aof 文件
# 将每一次写操作请求都追加到 appendonly.aof 文件中
appendonly yes
192.168.30.129
bind 192.168.30.129
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /data/redis
replicaof 192.168.30.128 6379
masterauth 123456
requirepass 123456
appendonly yes
192.168.30.130
bind 192.168.30.130
daemonize yes
logfile "/usr/local/redis/redis.log"
dir /data/redis
replicaof 192.168.30.128 6379
masterauth 123456
requirepass 123456
appendonly yes
查看集群状态:主服务器
192.168.30.128:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1
slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1
master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:168
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:168
查看集群状态:从服务器
192.168.30.129:6379> info replication
role:slave
master_host:192.168.30.128
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:196
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196
数据演示
192.168.30.128
192.168.30.128:6379> keys *
(empty list or set)
192.168.30.128:6379> set key1 100
OK
192.168.30.128:6379> set key2 ljh
OK
192.168.30.128:6379> keys *
1) "key1"
2) "key2"
192.168.30.129
192.168.30.129:6379> keys *
1) "key2"
2) "key1"
192.168.30.129:6379> CONFIG GET dir
1) "dir"
2) "/data/redis"
192.168.30.129:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"
192.168.30.129:6379> get key1
"100"
192.168.30.129:6379> get key2
"ljh"
192.168.30.129:6379> set key3 aaa
(error) READONLY You can't write against a read only replica.
192.168.30.130
192.168.30.130:6379> keys *
1) "key2"
2) "key1"
192.168.30.130:6379> CONFIG GET dir
1) "dir"
2) "/data/redis"
192.168.30.130:6379> CONFIG GET dbfilename
1) "dbfilename"
2) "dump.rdb"
192.168.30.130:6379> get key1
"100"
192.168.30.130:6379> get key2
"ljh"
192.168.30.130:6379> set key3 aaa
(error) READONLY You can't write against a read only replica.
可以看到,在主服务器节点写入的数据,很快就同步到从服务器节点上,而且在从服务器节点上无法写入数据
二、哨兵模式
主从模式的弊端就是不具备高可用性,当主服务器挂掉以后,Redis 将不能再对外提供写入操作,因此 Sentinel 应运而生
—未完待续----