Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Redis进阶:主从复制

Redis进阶:主从复制

作者头像
云飞扬
发布于 2022-03-24 02:29:28
发布于 2022-03-24 02:29:28
27800
代码可运行
举报
文章被收录于专栏:星汉技术星汉技术
运行总次数:0
代码可运行

Redis进阶:主从复制

1简介

1.1问题及需求

如下图,当前的三个redis节点实例无法做到高可用,一旦有一台redis服务器宕机之后,那么缓存在这台服务器上的数据就不能使用缓存来获取,还会直接访问数据库,访问请求达到一定数量就会产生雪崩。

对于当前的redis集群架构,需要引入高可用的技术。

高可用架构引入主从复制和主从替换的技术,当某一个主节点宕机或通信不可达的时候,从节点自动顶替完成主节点的功能。架构结构如下图:

1.2CAP理论

CAP理论(CAP theorem),又被称作布鲁尔定律(Brewer’s theorem),是分布式集群中的一个重要理论(面试题)。

  • C:consistency(一致性)
  • A:avalibility(可用性)
  • P:partition(分区)-tolenrence to partition(分区容忍度)

随着数据量增长需求,业务的多元化,分布式结构不可或缺。CAP理论是分布式集群中的基础理论之一。

1.2.1分区

一个分布式系统中,多个系统组成的网络本来是互通的,但是可能因为某种原因导致两个或多个节点间的数据通信断开,整个系统的整体被分割成了若干个区域的过程,叫做分布式系统的分区(分区是常态)。一旦分区出现,数据的修改和查询将受到影响,需要考虑数据一致性

1.2.2一致性

数据在某个查看的时间点上保持整体一致。如果在数据修改时,对于查看数据的客户端要求数据一致,则必须加锁,实现整体一致性。在修改时,如果要求数据一致性,客户端将在加锁的时间段内不能访问数据,会导致可用性的降低。

1.2.3可用性

客户端的请求在一定时间段内都有回应。

1.2.4分区容忍度

在分区出现的情况下,如果对数据的一致性要求较高,分区容忍度高。如果在分区出现的情况下,对数据的一致性要求低,分区容忍度低。

1.2.5CAP理论的结论

在分布式集群中,只可能同时满足CAP理论中的2个条件

  • CA--无分区,数据一致性可达。
  • CP--数据一致性要求高的分区状态。
  • AP--数据一致性要求低的分区状态(不加锁,可用性提高)。

分布式集群中的CAP理论可以理解为:分区是常态,要求数据一致性会导致可以用性降低;可用性提高,数据一致性就会降低。

两个CP 和 AP的现实场景:

  • 1.支付:需要第三方平台的数据必须和银行一致(支付宝,银行)。
  • 2.抢票:前台的订单下发,但是后台的数据库数据未必立刻修改。

2主从复制结构

redis中可以提供主从复制的结构,master-slave,可以多级复制,如下图:

根据企业的运维经验:主从结构最多2级主从,每个主节点最多6个从节点,否则会导致主从结构不稳定。

3主从复制搭建步骤

3.1移动目录

将redis主要的文件放入/usr/local/bin目录下,这样就可以在全局下使用redis的命令了,操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 bin]# cd /home/software/redis-6.2.6/src/
[root@lk7 src]# cp redis-server /usr/local/bin/
[root@lk7 src]# cp redis-cli /usr/local/bin/
[root@lk7 src]# cp redis-sentinel /usr/local/bin/
[root@lk7 src]# cp redis-check-aof /usr/local/bin/
[root@lk7 src]# cp redis-check-rdb /usr/local/bin/
[root@lk7 src]# cp redis-benchmark /usr/local/bin/
[root@lk7 src]# cd ..
[root@lk7 redis-6.2.6]# cp redis.conf /usr/local/bin/

3.2准备配置文件

准备主从节点的配置文件:复制redis.conf文件,并改名为需要的文件名。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 redis-6.2.6]# cd /usr/local/bin/
[root@lk7 bin]# cp redis.conf masterslave01.conf
[root@lk7 bin]# cp redis.conf masterslave02.conf
[root@lk7 bin]# cp redis.conf masterslave03.conf
[root@lk7 bin]# ll
总用量 47176
-rw-r--r--. 1 root root   93738 26 18:41 masterslave01.conf
-rw-r--r--. 1 root root   93738 26 18:41 masterslave02.conf
-rw-r--r--. 1 root root   93738 26 18:41 masterslave03.conf
-rwxr-xr-x. 1 root root 4830496 12 14:10 redis-benchmark
-rwxr-xr-x. 1 root root 9521744 12 14:09 redis-check-aof
-rwxr-xr-x. 1 root root 9521744 12 14:09 redis-check-rdb
-rwxr-xr-x. 1 root root 5004832 12 14:08 redis-cli
-rw-r--r--. 1 root root   93738 26 18:39 redis.conf
-rwxr-xr-x. 1 root root 9521744 12 14:08 redis-sentinel
-rwxr-xr-x. 1 root root 9521744 12 14:08 redis-server

3.3编辑配置文件

配置文件需要修改的内容如下:

  • bind:注释掉
  • port:分别将多个redis.conf文件中的端口修改成自己定义的端口号,这里使用6381、6382、6383。
  • protected-mode no
  • daemonize yes
  • pid文件名称根据端口修改。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  75 #bind 127.0.0.1 -::1

  94 protected-mode no

  98 port 6381

 257 daemonize yes

 289 pidfile /var/run/redis_6381.pid

另外两个配置文件按照这个修改即可。

3.4启动redis服务

分别启动对应文件的redis服务,命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
redis-server 文件名

启动服务如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 bin]# redis-server masterslave01.conf 
[root@lk7 bin]# redis-server masterslave02.conf 
[root@lk7 bin]# redis-server masterslave03.conf 
[root@lk7 bin]# 

3.5查看状态信息

首先进入redis客户端,进入客户端的命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看帮助信息
redis-cli --help
# 使用端口登录
redis-cli -p port

登录操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 bin]# redis-cli -p 6381
127.0.0.1:6381> exit
[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> exit
[root@lk7 bin]# redis-cli -p 6383
127.0.0.1:6383> 

使用info命令查看当前客户端信息,此命令查看的是所有信息。

想要单独查看replication信息,可使用如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
128.127.0.0.1:6383> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:399d90db2653e317cd69c504b326a870c2e1fb57
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

3.6配置主从结构

调用客户端命令启动一主两从结构:

主从节点分配:

  • 主节点:6381。
  • 从节点:6382、6383。

主节点不需要配置,只需要配置从节点即可,在从节点客户端执行如下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
slaveof host port(云主机的主节点ip需要使用内网地址)

执行当前节点挂接的主节点ip和端口。

操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6383> slaveof 192.168.106.171 6381
OK
127.0.0.1:6383> exit
[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> slaveof 192.168.106.171 6381
OK
127.0.0.1:6382> 

3.7查看配置信息

挂接完成返回ok查看主节点和从节点的replication变化内容。

6381主节点内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.106.171,port=6382,state=online,offset=182,lag=0
slave1:ip=192.168.106.171,port=6383,state=online,offset=182,lag=0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182
127.0.0.1:6381>

6382、6383从节点内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> slaveof 192.168.106.171 6381
OK
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:280
slave_repl_offset:280
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
127.0.0.1:6382>

[root@lk7 bin]# redis-cli -p 6383
127.0.0.1:6383> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:126
slave_repl_offset:126
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:99
repl_backlog_histlen:28
127.0.0.1:6383> 

4主从复制测试

4.1同步数据测试

首先登录主节点,然后进行如下测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 bin]# redis-cli -p 6381
127.0.0.1:6381> auth 123
OK
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set name xujd
OK
127.0.0.1:6381> keys *
1) "name"
127.0.0.1:6381> get name
"xujd"
127.0.0.1:6381> flushall
OK
127.0.0.1:6381>

127.0.0.1:6382> keys * 
1) "name"
127.0.0.1:6382> get name
"xujd"
127.0.0.1:6382> 

127.0.0.1:6383> keys *
1) "name"
127.0.0.1:6383> get name
"xujd"
127.0.0.1:6383>

4.2测试从节点写数据

在两个从节点都写入东西,操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
127.0.0.1:6382> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6382> 

127.0.0.1:6383> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6383> 

写入都是失败的。

4.3测试主从结构的高可用HA

将主节点宕机查看从节点的状态。操作如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@lk7 ~]# ps -ef | grep redis
root       7091      1  0 20:23 ?        00:00:00 redis-server *:6381
root       7101      1  0 20:23 ?        00:00:00 redis-server *:6382
root       7109      1  0 20:23 ?        00:00:00 redis-server *:6383
root       7185   1691  0 20:24 pts/1    00:00:00 redis-cli -p 6382
root       7277   7238  0 20:26 pts/2    00:00:00 redis-cli -p 6383
root       7605   7331  0 20:32 pts/3    00:00:00 grep --color=auto redis
[root@lk7 ~]# kill -9 7091
[root@lk7 ~]# ps -ef | grep redis
root       7101      1  0 20:23 ?        00:00:00 redis-server *:6382
root       7109      1  0 20:23 ?        00:00:00 redis-server *:6383
root       7185   1691  0 20:24 pts/1    00:00:00 redis-cli -p 6382
root       7277   7238  0 20:26 pts/2    00:00:00 redis-cli -p 6383
root       7629   7331  0 20:32 pts/3    00:00:00 grep --color=auto redis
[root@lk7 ~]# 

127.0.0.1:6382> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:658
slave_repl_offset:658
master_link_down_since_seconds:30
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:658
127.0.0.1:6382>

经过观察发现,主节点宕机,从节点并不会自动顶替主节点工作,高可用测试失败。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022/02/06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PySimpleGUI 进阶| 原来用Python做一个图片查看系统,还能这么简单!
大家好,在昨天的文章中我们已经介绍了为什么以及如何基本使用PySimpleGUI,并且对一些比较常用的元素(element)也有所了解。
刘早起
2020/12/07
2.9K0
虽然圣诞已过 诞气依在 用Python给头像加上圣诞帽 希望还用得上
企鹅号小编
2018/01/04
6470
虽然圣诞已过 诞气依在 用Python给头像加上圣诞帽 希望还用得上
用Python给头像加上圣诞帽或圣诞老人小图标
随着圣诞的到来,想给给自己的头像加上一顶圣诞帽。如果不是头像,就加一个圣诞老人陪伴。
Python疯子
2019/12/26
5050
用Python给头像加上圣诞帽或圣诞老人小图标
头条官方给不了的圣诞帽,Python和OpenCV给你
随着圣诞的到来,大家纷纷@今日头条给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。 用到的工具 OpenCV(毕竟我们主要的内容就是OpenCV...) dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测。) 用到的语言为Python。但是完全可以改成C++版本,时间有限,就不写了。有兴趣的
企鹅号小编
2018/01/30
7090
头条官方给不了的圣诞帽,Python和OpenCV给你
平安夜,Python送你一顶圣诞帽 @微信官方
还有多少耿直boy和我一样在等待微信官方送上一顶圣诞帽? 最后知道真相的我眼泪掉下来 (还蒙在鼓里的同学请在微信最上方的搜索栏自行搜索『圣诞帽』) 好吧,你不给,咱自己来,不就是个帽子嘛。 Pytho
Crossin先生
2018/04/17
8130
平安夜,Python送你一顶圣诞帽 @微信官方
用 Python 给你一个圣诞帽
圣诞将至,虽然咱不过这洋节,但是热闹还是要凑一下的,相信已经有很多圣诞帽相关的周边在流传了,今天咱们就自己动手,给头像增加一个圣诞帽
周萝卜
2022/12/27
3660
用 Python 给你一个圣诞帽
人工智能之头像识别
图像识别是人工智能的一个重要方面,下面通过一个简单列子进行练习: 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。 我们用下面这张图作为我们的测试图片。 用dlib的正脸检测器进行人脸检测,用dlib提供的模型提取人脸的五个关键点。代码如下: #!/usr/bin/python # -*- coding: utf-8
企鹅号小编
2018/01/18
2.7K0
人工智能之头像识别
老板又出难题,气得我写了个自动化软件
日常工作中,领导要求你将一份 Word 文档中的图片存储到一个文件夹内,你可能会一边内心崩溃,一边开始一张张的 另存为。
朱小五
2021/01/20
6160
[1212]Python GUI之PySimpleGUI
最后一个执行后程序会在2s左右自动退出,除了以上的简单的默认函数外,还可以手动设置参数;
周小董
2023/10/10
7300
[1212]Python GUI之PySimpleGUI
「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽
叮叮当,叮叮当,吊儿个郎当,一年一度的圣诞节到咯,我不由的回想起了前两年票圈被圣诞帽支配的恐惧。打开票圈全是各种@官方求帽子的:
coder_koala
2019/12/26
9250
「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽
「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽
叮叮当,叮叮当,吊儿个郎当,一年一度的圣诞节到咯,我不由的回想起了前两年票圈被圣诞帽支配的恐惧。打开票圈全是各种@官方求帽子的:
Javanx
2019/12/26
8971
「圣诞特辑」纯前端实现人脸识别自动佩戴圣诞帽
别@微信团队了,我用Python给自己戴上了圣诞帽!
引言 大家纷纷@官方微信 给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以做到。但是作为一个学习图像处理的技术人,还是觉得我们有必要写一个程序来做这件事情。而且这完全可以作为一个练手的小项目,工作量不大,而且很有意思。 用到的工具 OpenCV(毕竟我们主要的内容就是OpenCV...) dlib(前一篇文章刚说过,dlib的人脸检测比OpenCV更好用,而且dlib有OpenCV没有的关键点检测。) 用到的语言为Python。但是完全可以改成C++版本,时间有限,就不写了。有兴趣的小伙伴可以拿
企鹅号小编
2018/01/23
7080
别@微信团队了,我用Python给自己戴上了圣诞帽!
80行代码自己动手写一个表格拆分与合并小工具(文末附工具下载)
可能是最近加班熬夜太多,这个周末身体不舒服,头痛、冷汗什么的。终于在连着睡了接近2天后,现在慢慢恢复了。
可以叫我才哥
2021/08/05
1.2K0
140行代码自己动手写一个词云制作小工具(文末附工具下载)
继之前出过表格拆分与合并小工具、pdf转word小工具后,今天我们迎来了词云制作小工具。
可以叫我才哥
2021/08/05
9890
不用@微信官方,教你写头像戴圣诞帽的程序
前两天朋友圈里面刷屏的“我想要一个圣诞帽,@微信官方”这个活动你们中招了吗?后来大家都知道这只是一个用了P图工具的小玩笑,但大家纷纷玩得不亦乐乎。现在有许多p图小工具也可以实现“戴圣诞帽”,但作为一个程序猿,其实也可以写一个小程序让自己“戴上圣诞帽”,大家快来看! 驯鹿逃跑了,我还有自己的圣诞老人。 用到的工具 OpenCV dlib 用到的语言为Python 素材准备 首先我们需要准备一个圣诞帽的素材,格式最好为PNG,因为PNG的话我们可以直接用Alpha通道作为掩膜使用。我们用到的圣诞帽如下图:
企鹅号小编
2018/01/25
7770
用Python写软件原来这么简单,一个极易入门的GUI框架
今天给大家介绍一个非常简单的GUI框架--PySimpleGUI,它是一个纯python的GUI框架。使用它可以快速实现GUI程序,代码量相比其他框架减少50%到90%,如果你是一个python新手,想快速写出自己的第一个软件,这个库就是一个绝佳选择。
吾非同
2021/03/25
3.2K0
分析”圣诞帽“代码,入门OpenCV
“ 看过大神冰不语的文章《圣诞节,用Python给自己加顶“圣诞帽”》,文章很棒,但是对于刚入门的我来说,讲解的不够太细,这里做了详细的分析,也分享给大家”
周萝卜
2019/07/17
7260
分析”圣诞帽“代码,入门OpenCV
GUI实战|Python做一个文档图片提取软件
本文将进一步讲解如何用Python提取PDF与Word中图片,并结合之前讲解过的GUI框架PysimpleGUI,做一个多文件图片提取软件,效果如下:
刘早起
2021/01/05
1.5K0
【云+社区年度征文】PySimpleGUI一个建立在tkinter之上更简单但功能强大的GUI
你将会学会一个除了Pyqt5、TK等其它界面编程的Python第三方库,你可以利用它更方便的做出交互的界面。
王荣胜
2020/12/03
4.9K0
用Python制作一个随机抽奖小工具
最近在工作中面向社群玩家组织了一场活动,需要进行随机抽奖,参考之前小明大佬的案例,再结合自己的需求,做了一个简单的随机抽奖小工具。
可以叫我才哥
2021/08/05
2.1K0
推荐阅读
相关推荐
PySimpleGUI 进阶| 原来用Python做一个图片查看系统,还能这么简单!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验