redis-主从复制
Posted 张贺贺
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
[root@redis ~]# redis-server /nosql/6380/redis.conf
[root@redis ~]# redis-server /nosql/6381/redis.conf
[root@redis ~]#redis-server /nosql/6382/redis.conf
//ss -tnlp 查看一下端口侦听,是否正常
我们打算让6380成为主,6381和6382成为从,怎么做呢?其实很简单,只要在6381和6382上告诉6380是主就好了。
[root@NFS ~]# redis-cli -p 6381
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380
OK
127.0.0.1:6381> exit
[root@NFS ~]# 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
[root@NFS ~]# 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
[root@NFS ~]# 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的配置文件并启动实例
[root@NFS ~]# mkdir /nosql/26380
[root@NFS ~]# cd /nosql/26380
[root@NFS 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
//启动
[root@NFS 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这两台主机里面选出一台出来当主,然后把剩下的一台指向变化成新的主。
以上是关于redis-主从复制的主要内容,如果未能解决你的问题,请参考以下文章