2、理论知识
主从复制是指将一台Redis服务器的数据复制到其它Redis服务器.前者称之为主节点(master/leader),后者称之为从节点(slave/flower);数据的复制都是单向的,只能从主节点到从节点.Master以写为主,Slave以读为主.默认情况下每台Redis服务器都是主节点.且一个主节点可以有多个从节点或者没有从节点,但一个从节点只能有一个主节点.
3、功能作用
主从复制的作用:
a、数据冗余:主从复制实现数据的热备份,是持久化之外的一种数据冗余方式.
b、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复.实际也是一种服务的冗余.
c、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis的时候应用连接从节点),分担服务器负载;尤其在写少读多的场景下,通过多个节点分担读负载,可以大大提高Redis服务器的并发量.
d、高可用(集群)的基石:除上述作用以外,主从复制还是哨兵模式和集群能够实施的基础,因此主从复制是Redis高可用的基础.
通常工程项目中一台 Redis是万万不能的,原因如下:
a、从结构上,单个Redis服务器会发生单点故障,并且一台服务器需要处理所有的请求负载,压力很大;
b、从容量上,单个Redis服务器内存容量有限,即使一台Redis服务器内存容量为256G, 也不能将所有的内存用作Redis存储内存,通常单台Redis最大使用内存不应该超过20G.
说明:电商网站上的商品,一般都是一次上传,无数次浏览,也就是“读多写少”.
4、配置主从
4.1、编写配置文件
--新建master redis6379.conf文件.
[root@leo-redis626-a redis-6.2.6]# pwd
/usr/local/src/redis-6.2.6
[root@leo-redis626-a redis-6.2.6]# vi redis6379.conf
添加如下内容:
port 6379
#daemonize no
#logfile "6379.log"
dir /redis/data
dbfilename "dump-6379.rdb"
appendfilename "appendonly-6379.aof"
--新建slave1 redis6380.conf文件.
[root@leo-redis626-a redis-6.2.6]# vi redis6380.conf
[root@leo-redis626-a redis-6.2.6]# cat redis6380.conf
port 6380
#daemonize no
#logfile "6380.log"
dir /redis/data
dbfilename "dump-6380.rdb"
appendfilename "appendonly-6380.aof"
slaveof 127.0.0.1 6379
--新建slave2 redis6381.conf文件.
[root@leo-redis626-a redis-6.2.6]# vi redis6381.conf
[root@leo-redis626-a redis-6.2.6]# cat redis6381.conf
port 6381
#daemonize no
#logfile "6381.log"
dir /redis/data
dbfilename "dump-6381.rdb"
appendfilename "appendonly-6381.aof"
slaveof 127.0.0.1 6379
--新建/redis/data目录
[root@leo-redis626-a redis-6.2.6]# mkdir -p /redis/data
4.2、开启redis进程
--启动主从redis进程.
[root@leo-redis626-a redis-6.2.6]# ll redis63*
-rw-r--r--. 1 root root 124 Apr 6 09:22 redis6379.conf
-rw-r--r--. 1 root root 147 Apr 6 09:24 redis6380.conf
-rw-r--r--. 1 root root 147 Apr 6 09:25 redis6381.conf
[root@leo-redis626-a redis-6.2.6]# redis-server redis6379.conf
[root@leo-redis626-a redis-6.2.6]# redis-server redis6380.conf
[root@leo-redis626-a redis-6.2.6]# redis-server redis6381.conf
[root@leo-redis626-a data]# pwd
/redis/data
[root@leo-redis626-a data]# ll
total 12
-rw-r--r--. 1 root root 175 Apr 6 09:33 dump-6379.rdb
-rw-r--r--. 1 root root 175 Apr 6 09:32 dump-6380.rdb
-rw-r--r--. 1 root root 175 Apr 6 09:33 dump-6381.rdb
[root@leo-redis626-a data]# ps -ef|grep redis
avahi 841 1 0 08:32 ? 00:00:00 avahi-daemon: running [leo-redis626-a.local]
root 4376 3460 0 09:31 pts/1 00:00:00 redis-server *:6379
root 4395 4217 0 09:32 pts/2 00:00:00 redis-server *:6380
root 4404 4256 0 09:33 pts/3 00:00:00 redis-server *:6381
root 4420 4290 0 09:34 pts/4 00:00:00 grep --color=auto redis
5、结果验证
5.1、节点信息
--master信息.
[root@leo-redis626-a data]# redis-cli -p 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=224,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=224,lag=1
master_failover_state:no-failover
master_replid:5a9b5f18b18446393fce7c4e09d482607c2917d1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
--slave1信息.
[root@leo-redis626-a data]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:280
slave_repl_offset:280
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5a9b5f18b18446393fce7c4e09d482607c2917d1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
--slave2信息.
[root@leo-redis626-a data]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_read_repl_offset:336
slave_repl_offset:336
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5a9b5f18b18446393fce7c4e09d482607c2917d1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:336
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:57
repl_backlog_histlen:280
5.2、添加键值测试
--主库添加键值.
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set key1 val1
OK
--从库1查询
127.0.0.1:6380> keys *
1) "key1"
127.0.0.1:6380> get key1
"val1"
--从库2查询
127.0.0.1:6381> keys *
1) "key1"
127.0.0.1:6381> get key1
"val1"
说明:如上所示,1主2从环境搭建完成.
6、架构缺点
redis主从复制存在主机Master宕机后,写服务无法使用,此时需要手动切换主从关系.这样会造成一段时间内服务不可用.更多时候应考虑哨兵模式.