一、主从模式

在主从复制中,数据库分为两类:主服务器和从从服务器

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 应运而生

—未完待续----