- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章redis三种高可用方式部署的实现由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
。
概念 。
和mysql的主从复制一样 都是将服务器的数据复制到另一个数据库中 发送的称为master 接受的叫slave 数据为单向传输 只可以主到从 每台redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点.
作用 。
数据冗余 实现了数据的热备份,是持久化之外的一种数据冗余方式 故障切换 当主节点宕机或者出现错误时 由从服务器来提供服务 实现故障切换 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写redis数据时应用连接主节点,读redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高redis服务器的并发量。 基础 给集群和哨兵提供环境 。
主从复制过程 。
1 若启动一个slave机器进程,则它会向master机器发送一个“sync command”命令,请求同步连接.
2 无论是第一次连接还是重新连接,master机器都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作),同时master还会记录修改数据的所有命令并缓存在数据文件中.
3 后台进程完成缓存操作之后,maste机器就会向slave机器发送数据文件,slave端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着master机器就会将修改数据的所有操作一并发送给slave端机器。若slave出现故障导致宕机,则恢复正常后会自动重新连接.
4 master机器收到slave端机器的连接后,将其完整的数据文件发送给slave端机器,如果mater同时收到多个slave发来的同步请求,则master会在后台启动一个进程以保存数据文件,然后将其发送给所有的slave端机器,确保所有的slave端机器都正常.
部署 。
三台服务器 一主俩从 。
先部署redis 每台配置一致 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
systemctl stop firewalld
setenforce 0
yum install -y gcc gcc-c++ make
tar zxvf redis-5.0.7.tar.gz -c /opt/
cd /opt/redis-5.0.7/
make
make prefix=/usr/local/redis install
cd /opt/redis-5.0.7/utils
./install_server.sh
回车四次,之后输入可执行文件路径
please select the redis executable path [] /usr/local/redis/bin/redis-server
ln -s /usr/local/redis/bin/* /usr/local/bin/
|
主节点配置 。
1
2
3
4
5
6
7
8
|
vim
/etc/redis/6379
.conf
bind 0.0.0.0 70行,修改bind 项,0.0.0.0监听所有网段
daemonize
yes
137行,开启守护进程
logfile
/var/log/redis_6379
.log 172行,指定日志文件目录
dir
/var/lib/redis/6379
264行,指定工作目录
appendonly
yes
700行,开启aof持久化功能
/etc/init
.d
/redis_6379
restart
netstat
-natp |
grep
6379 检查端口是否开启
|
从节点配置 。
1
2
3
4
5
6
7
8
9
|
vim
/etc/redis/6379
.conf
bind 0.0.0.0 70行,修改bind 项,0.0.0.0监听所有网卡
daemonize
yes
137行,开启守护进程
logfile
/var/log/redis_6379
.log 172行,指定日志文件目录
dir
/var/lib/redis/6379
264行,指定工作目录
replicaof 192.168.25.4 6379 288行,指定要同步的master节点ip和端口
appendonly
yes
700行,开启aof持久化功能
/etc/init
.d
/redis_6379
restart
|
查看结果 。
在主节点查看日志 。
1
|
tail
-f
/var/log/redis_6379
.log
|
验证 。
1
2
3
4
5
|
# replication
role:master
connected_slaves:2
slave0:ip=192.168.25.6,port=6379,state=online,offset=504,lag=1
slave1:ip=192.168.25.5,port=6379,state=online,offset=504,lag=0
|
。
1 概念 。
是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的 master 并将所有 slave 连接到新的 master。所以整个运行哨兵的集群的数量不得少于3个节点.
2.作用 。
3 组成 。
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的 redis 工作节点是否正常,当 master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 master 的确出现问题,然后会通知哨兵间,然后从 slaves 中选取一个作为新的 master.
主观下线和客观下线 。
主观下线是指哨兵节点会每秒一次的频率向建立了命令节点的实例发送ping命令,如果在 down-after-milliseconds 毫秒内没有做出有效响应包括(pong/loading/masterdown)以外的响应,哨兵就会将该实例在本结构体中的状态标记为 sri_s_down 主观下线 。
客观下线是指当一个哨兵节点发现主节点处于主观下线状态时,就会向其他的哨兵节点发出询问,该节点是否已经主观下线。如果超过配置参数 quorum 个节点认为是主观下线时,该哨兵节点就会将自己维护的结构体中该主节点标记为 sri_o_down 客观下线 。
部署 。
所有的节点都要部署哨兵 。
1
2
3
4
5
6
7
8
9
|
vim
/opt/redis-5
.0.7
/sentinel
.conf
protected-mode no
#17行,关闭保护模式
port 26379
#21行,redis哨兵默认的监听端口
daemonize
yes
#26行,指定sentinel为后台启动
logfile
"/var/log/sentinel.log"
#36行,指定日志存放路径
dir
"/var/lib/redis/6379"
#65行,指定数据库存放路径
sentinel monitor mymaster 192.168.184.10 6379 2
#84行,修改 指定该哨兵节点监控192.168.184.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000
#113行,判定服务器down掉的时间周期,默认30000毫秒(30秒)
sentinel failover-timeout mymaster 180000
#146行,故障节点的最大超时时间为180000(180秒)
|
开启哨兵 。
先开master 后开slave 。
模拟故障 。
查询主节点redis服务节点号 。
杀掉主节点进程 并查看日志 。
1
2
|
kill
-9 62009
tail
-f
/var/log/sentinel
.log
|
查看现在的主节点 现在主节点切换到slave1 。
。
1 概念 。
集群,即redis cluster,是redis 3.0开始引入的分布式存储方案.
集群由多个节点(node)组成,redis的数据分布在这些节点中。集群中的节点分为主节点和从节点:只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制.
2 作用 。
1 数据分区:数据分区(或称数据分片)是集群最核心的功能。 集群将数据分散到多个节点,一方面突破了redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。 redis单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave和bgrewriteaof的fork操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。 2 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务.
3、redis集群的数据分片 。
redis集群引入了哈希槽的概念 redis集群有16384个哈希槽(编号0-16383) 集群的每个节点负责一部分哈希槽 每个key通过crc16校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作 。
#以3个节点组成的集群为例: 节点a包含0到5460号哈希槽 节点b包含5461到10922号哈希槽 节点c包含10923到16383号哈希槽 。
redis集群的主从复制模型 集群中具有a、b、c三个节点,如果节点b失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。 为每个节点添加一个从节点a1、b1、c1整个集群便有三个master节点和三个slave节点组成,在节点b失败后,集群选举b1位为的主节点继续服务。当b和b1都失败后,集群将不可用 。
部署 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
注意6个端口和ip都要不一样。
vim
/etc/redis/6379
.conf
bind 192.168.25.4 70行,修改bind项,监听自己的ip
protected-mode no 89行,修改,关闭保护模式
port 7001 93行,修改,redis监听端口,
daemonize
yes
137行,以独立进程启动
cluster-enabled
yes
833行,取消注释,开启群集功能
cluster-config-
file
nodes-6379.conf 841行,取消注释,群集名称文件设置,无需修改
cluster-node-timeout 15000 847行,取消注释群集超时时间设置
appendonly
yes
700行,修改,开启aof持久化
#重启服务
/etc/init
.d
/redis_6379
restart
#加入集群
redis-cli --cluster create 192.168.25.4:7001 192.168.25.5:7003 192.168.25.6:7005 192.168.25.7:7006 192.168.25.8:7007 192.168.25.9:7008 --cluster-replicas 1
redis-cli -h 192.168.25.4 -p 7001 -c
#加-c参数,节点之间就可以互相跳转
cluster slots
#查看节点的哈希槽编号范围
set
sky x1
cluster keyslot x1
#查看name键的槽编号
|
到此这篇关于redis三种高可用方式部署的实现的文章就介绍到这了,更多相关redis 高可用方式部署内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_49172531/article/details/116568936 。
最后此篇关于redis三种高可用方式部署的实现的文章就讲到这里了,如果你想了解更多关于redis三种高可用方式部署的实现的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何检测当前网络中计算机是否已连接/可用。 当然,它有多种用途,但我主要关心的是我的应用程序使用位于特定计算机中的资源,如果这些资源不可用,它甚至不会尝试连接,而是使用本地资源。 最佳答案 您可以尝试
雅虎建议load scripts at the bottom of an HTML pages出于性能原因。我使用遵守规则的 HTML5 Boilerplate。 这种方法的问题是 jQuery 也是
我有一个场景,我需要只向管理员而不是普通用户展示一个组件。 说, // This component should be rendered for public users.
我有一个数组,比方说 ["a","b","c"],我想把它变成一个对象,它以数组值作为键和一个默认值我可以设置。因此,如果默认值为 true,我希望我的输出为 {a:true, b:true, c:t
我假设在函数中创建一个新的 PS-Drive 会使该驱动器只能在该函数中访问。 如何通过从该函数可访问的 MAIN 调用函数来创建 PS 驱动器? $temproraryPSDriveName =
您会推荐哪些 .net 控制库作为企业必备的? 可以免费/非免费 至少应该包含一个真正强大的Datagrid Ajax 功能 有没有可用的比较? 最佳答案 我用过 Telerik ASP.NET控制之
假设我有一些像这样的 html: Hello World Javascript代码: var fooBar = document.getElementById('fooBar'); fooBar.
开始实现 camera plugin 时出现以下错误在我的 flutter 应用程序上: [VERBOSE-2:dart_error.cc(16)] Unhandled exception:
我想知道应该在哪里正确放置 countA,因为我希望将计数添加到所做的每个按钮中。开头的“count”变量用于制作新按钮,“countA”是我试图声明的计数,但它无法编译。这是我的代码片段:我的问题再
在python帮助文档中我经常看到带有函数名和命名参数的签名行,然后你会看到**kwarg(关键字参数)。 list? 打印到帮助文档字符串: Init signature: list(self, /
我是 UWP 的新手,想知道“Flyout”、“ContextFlyout”和“Popup”之间的区别。另外,我想知道“AppBar”和“CommandBar”之间的区别。我相信这些是容纳菜单或菜单项
我想显示可用的 Wifi 设备列表。这是我的代码,我不明白这里有什么错误: wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); i
这是我的代码: Random = function(name) { this.name = name; this.addSomething = function(a, b) {
我希望我的按钮持续动画直到用户触摸它,这是代码 func animate() { UIView.animateWithDuration(1, animations: { () -> Void
我正在为我正在参加的类(class)制作一个 HTTP 服务器作为项目,一周来我一直在尝试寻找解决方案。我有一个 DataInputStream,我需要等待客户端向我发送 http 请求,由于连接保持
我想创建一个 bash 脚本来检查我的 Linux 服务器中的哪些端口已关闭且未在特定范围(端口范围 (3000-3010))中使用。 打印输出只需1个端口,如果将输出保存为变量或保存在同一个文件中,
我写了一个我认为是最小的自定义设备来测试我对 QOM 和 QEMU 的总体理解。以下是省略注释的相关代码。不幸的是,当我启动 guest 并将我的设备名称作为命令行参数传递时,它无法找到我的设备并退出
调用Opencv函数时,通常会提供一个常量给函数调用,如: im_hsv = cv2.cvtColor(im, cv2.COLOR_BGR2HSV) 虽然我找不到对所有可用常量的引用。 Opencv
C++ 于 1998 年正式标准化,但我们能在多久以前找到一个名为 string 的类,它看起来像 C++2003 中的 std::string预标准 C++ 实现? 我问是因为 CString 作为
是否有一个官方的(或可能没有)git 命令列表,--porcelain 选项可用?或者我应该在 the porcelain commands list 中手动查看它们中的每一个吗? ? 我已经设法用谷
我是一名优秀的程序员,十分优秀!