redis-主从复制

目录

我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
个人博客:
笔者微信:zhanghe15069028807,非诚勿扰。

redis-主从复制

1、常用操作

//关闭redis
127.0.0.1:6379>shtudown
//也可以关闭这样
redis-cli –a cba-123 shutdown 
//看主从的状态
127.0.0.1:6379> info replication
127.0.0.1:6379> info      #查看CPU,内存的占用信息
127.0.0.1:6379> info cpu   #单独看CPU
127.0.0.1:6379> info memory  
127.0.0.1:6379> info server  #看服务器的信息
127.0.0.1:6379> CLIENT LIST  #查看会话情况
127.0.0.1:6379> dbsize      #查看一共有多少个键值
(integer) 15 
127.0.0.1:6379> FLUSHALL  #清空所有的数据
OK
127.0.0.1:6379> keys *
127.0.0.1:6379> select 1  #相当于进入1号数据库,默认在0号库里面
OK
127.0.0.1:6379[1]> FLUSHDB   #清空当前库
OK

127.0.0.1:6379[1]> MONITOR    #监控操作,双窗口
OK
1578293892.356860 [0 127.0.0.1:36996] "set" "b" "a"

2、主从复制原理

我们在应用redis的时候要么是主从的架构,要么是集群的架构,因为redis单机多用户访问性能并不是很好,通过主从和集群可以弥补。

主从复制基于RDB快照访问的持久化,也就是说必须开始RDB持久化之后才能做主从复制。

1、从服务器向主服务器发送SYNC命令
2、主收到SYNC的主会调用BGSAVE命令,创建一个RDB文件,并缓冲区记录接下来执行的所有写命令。
3、当主服务器执行完BGSAVE命令时,它会向服务器发送RDB文件,而从服务器则会接收并载入这个文件
4、主服务器将缓冲区储存的所有写命令发送给从服务器执行。

无论是mysql还是redis在主从复制的时候都有一致性问题,怎样解决解决?mysql是通过半同步复制来降低这种情况,redis解决呢?其实也差不多,就是当一个键值向主存储时,“主”会同时同步到“从”,“从”也存储成功之后,主才会把存储成功的结果返回给客户端。

3、主从复制操作(一主两从)

mkdir /nosql/6380 -p
vim /nosql/6380/redis.conf
port 6380
daemonize yes
pidfile /nosql/6380/redis.pid
loglevel notice
logfile "/nosql/6380/redis.log"
dbfilename dump.rdb
dir /nosql/6380
protected-mode no


mkdir /nosql/6381 -p
vim /nosql/6381/redis.conf
port 6381
daemonize yes
pidfile /nosql/6381/redis.pid
loglevel notice
logfile "/nosql/6381/redis.log"
dbfilename dump.rdb
dir /nosql/6381
protected-mode no


mkdir /nosql/6382 -p
vim /nosql/6382/redis.conf
port 6382
daemonize yes
pidfile /nosql/6382/redis.pid
loglevel notice
logfile "/nosql/6382redis.log"
dbfilename dump.rdb
dir /nosql/6382
protected-mode no

[ ~]# redis-server /nosql/6380/redis.conf 
[ ~]# redis-server /nosql/6381/redis.conf 
[ ~]#redis-server /nosql/6382/redis.conf

//ss -tnlp 查看一下端口侦听,是否正常

我们打算让6380成为主,6381和6382成为从,怎么做呢?其实很简单,只要在6381和6382上告诉6380是主就好了。

[ ~]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> exit
[ ~]# redis-cli -p 6382
127.0.0.1:6382> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6382> exit

127.0.0.1:6382> info replication   #查看主从状态
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:up

[ ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=295,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=295,lag=1

主从切换,我们把主给关了,然后让另一个实例成为主,如下所示:

127.0.0.1:6380> shutdown
not connected> exit

[ ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6380
master_link_status:down  #显示master已经挂了

//清空一下配置,然后宣告要成为主
127.0.0.1:6381> SLAVEOF no one
OK
//变成主了
127.0.0.1:6381> info replication
# Replication
role:master  成主了

//在6382上将主的指向由6380换为6381
127.0.0.1:6382> SLAVEOF no one  #清空一下
OK
127.0.0.1:6382> SLAVEOF 127.0.0.1 6381   #重新连接
OK
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:up

缺点是不够智能,还要我们手工进行切换,所以又有了下一个功能“哨兵”。

4、redis高可用-sentinel

redis的高可用与keepalive不一样,keepalived的高可用是从数据通信领域借过来的的VRRP协议,而redis这里是通过自带的软件而实现的,这个软件叫做“sentinel(哨兵)”,它可以实现当主挂了之后,某个从会自动切换为主,无需人工进行干预。

复位到原始环境:6380为主,6381和6382为从,我们通过主就可以找到从是哪两台主机,如下所示:

127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=4021,lag=1
slave1:ip=127.0.0.1,port=6382,state=online,offset=4021,lag=1

创建centinel的配置文件并启动实例

[ ~]# mkdir /nosql/26380
[ ~]# cd /nosql/26380
[ 26380]# vim sentinel.conf
port 26380
dir "/nosql/26380"
sentinel monitor mymaster 127.0.0.1 6380 1   #告诉centinel主是:6380,mymaster是名字,可自定义
sentinel down-after-milliseconds mymaster 5000

//启动
[ 26380]# redis-sentinel /nosql/26380/sentinel.conf &
27889:X 07 Jan 10:49:46.401 # +monitor master mymaster 127.0.0.1 6380 quorum 1
27889:X 07 Jan 10:49:46.402 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
27889:X 07 Jan 10:49:46.403 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380

那mymaster名字后面的1是什么意思呢?意为只要一个哨兵认为主挂了之后,就会切换。

结果就当6380这个实例down了之后,哨兵会自动在6381和6382这两台主机里面选出一台出来当主,然后把剩下的一台指向变化成新的主。