Redis集群环境搭建
Redis主从复制
概念
主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点(master/leader),后者称为从节点(slave/followe);数据的复制是单向的,只能从主节点到从节点,以Master写为主,Slave以读为主。
默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点,但是一个从节点只能有一个主节点。主从复制的作用主要包括:
- 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
- 故障恢复:当主节点出现问题时。可以由从节点提供服务,实现故障的快速恢复,实际上是一种服务的冗余
- 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器的负载,尤其是在写多读少的情况下,通过多个节点分担负载,可以大大提高Redis服务器的并发量
- 高可用:除了上述作用外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础
一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:
- 从结构上,单个Redis服务器发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大
- 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量256G,也不能将所有内存用做Redis的存储服务,一般来说,单台Redis最大使用内存不应该超过20G
一般类似于电商网站上的商品,都是一次上传,无数次浏览的,也就是读多写少。对于这种场景可以使用以下架构设计:
环境配置
# 只配置从库,不用配置主库,因为redis默认每个节点都是master
127.0.0.1:6379> info replication #查看当前库的信息
# Replication
role:master #角色master
connected_slaves:0 #从库数量为0
master_replid:d4486b0339829fff1d75d3b082083753834e3c55
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
复制三个配置文件,然后修改对应的信息
# 79 80 81 对应的是端口号(6379 6380 6381)
[root@VM-4-17-centos redisconfig]# cp redis.conf redis79.conf
[root@VM-4-17-centos redisconfig]# cp redis.conf redis80.conf
[root@VM-4-17-centos redisconfig]# cp redis.conf redis81.conf
[root@VM-4-17-centos redisconfig]# vim redis79.conf
#修改这些东西即可
dbfilename dump6381.rdb #RDB文件名字
logfile "6381.log" 日志文件名
pidfile /var/run/redis_6381.pid pid文件名
port 6381 端口
# 依次启动三个服务后查看redis进程
[root@VM-4-17-centos bin]# redis-server redisconfig/redis81.conf
[root@VM-4-17-centos bin]# ps -ef | grep redis
root 29572 1 0 09:57 ? 00:00:00 redis-server 127.0.0.1:6379
root 29597 1 0 09:57 ? 00:00:00 redis-server 127.0.0.1:6380
root 29630 1 0 09:58 ? 00:00:00 redis-server 127.0.0.1:6381
root 29654 28611 0 09:58 pts/3 00:00:00 grep --color=auto redis
一主二从
默认情 况下,每台Redis服务器都是主节点,一般只要配置从节点即可
# 连接80客户端
[root@VM-4-17-centos bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master #主节点
connected_slaves:0
master_replid:115cb18c414d42087891ba03ae8cb29f55c4af7a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# 用slaveof命令进行配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
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:3
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
# 在主节点中可以查看到从节点
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=0 #从节点的信息
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98
这里的修改是通过命令进行主从节点的配置,服务器重启之后就会失效,一般在实际开发环境都是通过配置文件进行修改。
# 主机可以写,从机只能读不能写,主机中的所有信息和数据都会自动同步到从机
# 主机设置一个key
127.0.0.1:6379> set k1 v1
OK
# 在两个从机都能读到
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6381> get k1
"v1"
# 尝试在从机设置一个key
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.
# 我们现在将主机断掉
127.0.0.1:6379> shutdown
not connected> exit
#然后再查看从机的信息
127.0.0.1:6380> info replication
# Replication
role:slave #还是一个从节点(后面更新哨兵模式的时候会说到)
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1172
master_link_down_since_seconds:95
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1172
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1172
# 将一个从机断掉再重启
127.0.0.1:6380> shutdown
not connected> exit
[root@VM-4-17-centos bin]# redis-server redisconfig/redis80.conf
[root@VM-4-17-centos bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master #又变成了主机,这个是因为我们没有走配置文件
connected_slaves:0
master_replid:b70f9cbf316e5b4ab8e465794538f9051d6d8c56
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# 这个时候我们在79这个台机器上设置一个key
127.0.0.1:6379> set k2 v2
OK
# 80上拿不到,因为这时候它已不是79的从机
127.0.0.1:6380> get k2
(nil)
# 再将80设置为79的从机
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
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:1
master_sync_in_progress:0
slave_repl_offset:192
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fce6232ffa0779d9479f4b13d6ce60e1cb3bd46c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:192
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:179
repl_backlog_histlen:14
127.0.0.1:6380> get k2 #顺利拿到k2的值
"v2"
复制原理
- Slave启动成功连接到Master后会发送一个sync命令
- Master接到命令,后台启动存盘进程,同时收集所有收到的用于修改数据集命令,在后台进程执行完毕之后,Master将传送整个数据文件到Slave,并完成一次全量同步
这里有个复制的概念,全量复制和增量复制
全量复制:slave重启之后将master发送的数据文件加载到内存中
增量复制:Master将新的所有收集到的修改命令依次传给slave(连接到master之后进行的命令传递)
只要是重新连接master,就会进行一次全量复制