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这两台主机里面选出一台出来当主,然后把剩下的一台指向变化成新的主。