【Redis—15】Redis集群(容灾)

一、相关命令

启动redis指定配置文件:./redis-server redis.conf

进入客户端需指定端口:./redis-cli -p 6380

不配置启动默认都是主master

info replication 查看redis服务器所处角色

 

二、主从复制

通过持久化功能,Redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现故障,比如硬盘坏了,也会导致数据丢失。

为了避免单点故障,我们需要将数据复制多份部署在多台不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。

那么这就要求当一台服务器上的数据更新后,自动将更新的数据同步到其他服务器上,那该怎么实现呢?

1、如何实现集群

Redis提供了复制(replication)功能来自动实现多台redis服务器的数据同步

redis一主多从架构

 

我们可以通过部署多台redis,并在配置文件中指定这几台redis之间的主从关系,

主负责写入数据,同时把写入的数据实时同步到从机器,这种模式叫做主从复制,即master/slave,并且redis默认master用于写,slave用于读,向slave写数据会导致错误

 

实现方式:(都是基于配置文件)

方式1:修改配置文件,启动时,服务器读取配置文件,并自动成为指定服务器的从服务器,从而构成主从复制的关系

主服务器配置文件修改:

  • 主服务器(master)
include /usr/local/redis/redis.conf  #导入原始配置文件
daemonize yes                        #redis后台运行
port 6380                            #端口
pidfile /var/run/redis_6380.pid      #生成的pid文件
logfile 6380.log                     #生成的日志
dbfilename dump6380.rdb              #持久化文件
  • 从服务器(slave)
include /usr/local/redis/redis.conf 
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
logfile 6381.log
dbfilename dump6381.rdb
slaveof 127.0.0.1 6380  #指向主服务器

 

关闭之前的redis服务,使用pkill redis

我们模拟一主两从的主从结构:

首先复制一份redis.conf文件命名为redis6380.conf,将配置文件置空(使用重定向)

[root@VM_0_10_centos redis]# cp redis.conf redis6380.conf
[root@VM_0_10_centos redis]# > redis6380.conf 

然后使用vim编辑新的配置文件,将主服务器的配置粘贴进去,保存:

[root@VM_0_10_centos redis]# vim redis6380.conf 
[root@VM_0_10_centos redis]# cat redis6380.conf 

include /usr/local/redis/redis.conf 
daemonize yes
port 6380
pidfile /var/run/redis_6380.pid
logfile 6380.log
dbfilename dump6380.rdb
[root@VM_0_10_centos redis]# 

再拷贝两个配置文件,作为从服务器配置文件:

[root@VM_0_10_centos redis]# cp redis6380.conf redis6381.conf
[root@VM_0_10_centos redis]# cp redis6380.conf redis6382.conf
[root@VM_0_10_centos redis]# ls
bin       nohup.out    redis6380.conf  redis6382.conf  redis.conf    tomcat
dump.rdb  redis-5.0.3  redis6381.conf  redis-cli       redis-server

修改配置:

[root@VM_0_10_centos redis]# vim redis6381.conf 
[root@VM_0_10_centos redis]# cat redis6381.conf 

include /usr/local/redis/redis.conf 
daemonize yes
port 6381
pidfile /var/run/redis_6381.pid
logfile 6381.log
dbfilename dump6381.rdb
slaveof 127.0.0.1 6380

[root@VM_0_10_centos redis]# vim redis6382.conf 
[root@VM_0_10_centos redis]# cat redis6382.conf 

include /usr/local/redis/redis.conf 
daemonize yes
port 6382
pidfile /var/run/redis_6382.pid
logfile 6382.log
dbfilename dump6382.rdb
slaveof 127.0.0.1 6380

启动服务器:

[root@VM_0_10_centos redis]# ./redis-server redis6380.conf 
[root@VM_0_10_centos redis]# ./redis-server redis6381.conf 
[root@VM_0_10_centos redis]# ./redis-server redis6382.conf 

[root@VM_0_10_centos redis]# ps -ef | grep redis #查看进程,确定3个redis已启动
root      3924     1  0 22:20 ?        00:00:00 ./redis-server *:6380
root      3957     1  0 22:20 ?        00:00:00 ./redis-server *:6381
root      3965     1  0 22:20 ?        00:00:00 ./redis-server *:6382
root      3991 21175  0 22:21 pts/0    00:00:00 grep --color=auto redis

使用客户端登陆(要指定端口):

[root@VM_0_10_centos redis]# redis-cli -p 6380 #主
127.0.0.1:6380> 

[root@VM_0_10_centos ~]# redis-cli -p 6381 #从
127.0.0.1:6381> 

[root@VM_0_10_centos ~]# redis-cli -p 6382 #从
127.0.0.1:6382> 

使用xhsell开三个窗口分别连接3个redis

查看主从:info replication

通过主服务器写入数据:

127.0.0.1:6380> set k1 1
OK
127.0.0.1:6380> set k2 v2
OK

通过从服务器获取数据:

#从服务器1
127.0.0.1:6381> get k1
"1"
127.0.0.1:6381> get k2
"v2"

#从服务器2
127.0.0.1:6382> get k1
"1"
127.0.0.1:6382> get k2
"v2"

这样也达成了读写分离。

 

方式2: ./redis-server --slaveof <master-ip> <master-port>,在启动redis时指定当前服务成为某个主Redis服务的从Slave(剩下基本一样)

 

 

 

三、容灾处理

当Master服务出现故障,需手动将slave中的一个提升为master, 剩下的slave挂至新的master上(冷处理)

slaveof no one,将一台slave服务器提升为Master (提升某slave为master)

slaveof 127.0.0.1 6381 (将slave挂至新的master上)

首先将主关闭,模拟主服务器出现故障

127.0.0.1:6380> shutdown
not connected> exit
[root@VM_0_10_centos redis]# ps -ef | grep redis  #可见6380进程已经停止
root      3957     1  0 Jan03 ?        00:00:02 ./redis-server *:6381
root      3965     1  0 Jan03 ?        00:00:02 ./redis-server *:6382
root      4238  3262  0 Jan03 pts/1    00:00:00 redis-cli -p 6381
root      4247  3285  0 Jan03 pts/2    00:00:00 redis-cli -p 6382
[root@VM_0_10_centos redis]# 

然后使用命令升级从服务器为主服务器

127.0.0.1:6382> slaveof no one
OK

127.0.0.1:6382> info replication
# Replication
role:master     #可以看到6382已经升级为主服务器
connected_slaves:0   #但是他没有从服务器
master_replid:6c71b61fa26f3046d4a8002a6c89828ebafcd821
master_replid2:48b23a67c33f247e29ce45213ccc89ed0c0d1758
master_repl_offset:3892
second_repl_offset:3893
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3892
127.0.0.1:6382> 

将另一台从服务器挂在新的主服务器上:

#从服务器
127.0.0.1:6381> slaveof 127.0.0.1 6382
OK

#主服务器
127.0.0.1:6382> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=3892,lag=0
master_replid:6c71b61fa26f3046d4a8002a6c89828ebafcd821
master_replid2:48b23a67c33f247e29ce45213ccc89ed0c0d1758
master_repl_offset:3892
second_repl_offset:3893
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3892
127.0.0.1:6382> 

四、总结

1、一个master可以有多个slave

2、slave下线,读请求的处理性能下降

3、master下线,写请求无法执行

4、当master发生故障,需手动将其中一台slave使用slaveof no one命令提升为master,其它slave执行slaveof命令指向这个新的master,从新的master处同步数据

5、主从复制模式的故障转移需要手动操作,要实现自动化处理,这就需要Sentinel哨兵,实现故障自动转移

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值