Redis主从、哨兵、集群
主从
命名设置:
>6380 slaveof 127.0.0.01 6379
slaveof on one
----------配置:
-- 注意一点: 一定开启rdb,不能使用aof
从节点配置:
主节点
正常配置即可
从节点
slaveof 主节点ip 端口
salve-read-only yes
masterauth 主节点密码
------------------------------------------
1、主服务是可以执行数据的读和写操作【rdb文件】
2、从服务只能执行读操作【拷贝主服务上rdb】
第一种: 主服务器和从服务在同一台机器上面
第二种: 主服务器和从服务在不同的机器上面(生成环境下面)
哨兵
1、哨兵的配置文件
sentinel.conf
最小的配置
每一个哨兵都可以去监控多个maser-slaves的主从架构
因为可能你的公司里,为不同的项目,部署了多个master-slaves的redis主从集群
相同的一套哨兵集群,就可以去监控不同的多个redis主从集群
你自己给每个redis主从集群分配一个逻辑的名称
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5
sentinel monitor mymaster 127.0.0.1 6379
类似这种配置,来指定对一个master的监控,给监控的master指定的一个名称,因为后面分布式集群架构里会讲解,可以配置多个master做数据拆分
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1
上面的三个配置,都是针对某个监控的master配置的,给其指定上面分配的名称即可
上面这段配置,就监控了两个master node
这是最小的哨兵配置,如果发生了master-slave故障转移,或者新的哨兵进程加入哨兵集群,那么哨兵会自动更新自己的配置文件
sentinel monitor master-group-name hostname port quorum
quorum的解释如下:
(1)至少多少个哨兵要一致同意,master进程挂掉了,或者slave进程挂掉了,或者要启动一个故障转移操作
(2)quorum是用来识别故障的,真正执行故障转移的时候,还是要在哨兵集群执行选举,选举一个哨兵进程出来执行故障转移操作
(3)假设有5个哨兵,quorum设置了2,那么如果5个哨兵中的2个都认为master挂掉了; 2个哨兵中的一个就会做一个选举,选举一个哨兵出来,执行故障转移; 如果5个哨兵中有3个哨兵都是运行的,那么故障转移就会被允许执行
down-after-milliseconds,超过多少毫秒跟一个redis实例断了连接,哨兵就可能认为这个redis实例挂了
parallel-syncs,新的master别切换之后,同时有多少个slave被切换到去连接新master,重新做同步,数字越低,花费的时间越多
假设你的redis是1个master,4个slave
然后master宕机了,4个slave中有1个切换成了master,剩下3个slave就要挂到新的master上面去
这个时候,如果parallel-syncs是1,那么3个slave,一个一个地挂接到新的master上面去,1个挂接完,而且从新的master sync完数据之后,再挂接下一个
如果parallel-syncs是3,那么一次性就会把所有slave挂接到新的master上去
failover-timeout,执行故障转移的timeout超时时长
2、在eshop-cache03上再部署一个redis
只要安装redis就可以了,不需要去部署redis实例的启动
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar -xzvf tcl8.6.1-src.tar.gz
cd /usr/local/tcl8.6.1/unix/
./configure
make && make install
使用redis-3.2.8.tar.gz
tar -zxvf redis-3.2.8.tar.gz
cd redis-3.2.8
make && make test
make install
2、正式的配置
哨兵默认用26379端口,默认不能跟其他机器在指定端口连通,只能在本地访问
// 在redis的源文件中拷贝sentinel.conf文件
port 26739
daemonize yes
logfile "/usr/local/redis/6381/log/26739.log"
dir /usr/local/redis/6381/data
sentinel monitor mymaster 192.168.3.220 6379 1
sentinel auth-pass mymaster 123
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
port 26739
daemonize yes
dir /usr/local/redis/6380/data
sentinel monitor mymaster 192.168.3.220 6379 1
sentinel auth-pass mymaster 123
sentinel down-after-milliseconds mymaster 30000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1
-- 远程拷贝
scp ./sentinel-26739.conf root@192.168.3.221:/usr/local/redis/6380/
3、启动哨兵进程
在三台机器上,分别启动三个哨兵进程,组成一个集群,观察一下日志的输出
redis-sentinel /etc/sentinal/5000.conf
redis-server /etc/sentinal/5000.conf --sentinel
日志里会显示出来,每个哨兵都能去监控到对应的redis master,并能够自动发现对应的slave
哨兵之间,互相会自动进行发现,用的就是之前说的pub/sub,消息发布和订阅channel消息系统和机制
4、检查哨兵状态
redis-cli -h 192.168.31.187 -p 5000
sentinel master mymaster 查看master状态
SENTINEL slaves mymaster 查看mymaster的slave状态
SENTINEL sentinels mymaster 查看出自己以为的其他sentinel
SENTINEL get-master-addr-by-name mymaster 根据主节点名称获取对应IP地址和端口号
哨兵原理
1、哨兵节点的增加和删除
增加sentinal,会自动发现
删除sentinal的步骤
(1)停止sentinal进程
(2)SENTINEL RESET *,在所有sentinal上执行,清理所有的master状态
(3)SENTINEL MASTER mastername,在所有sentinal上执行,查看所有sentinal对数量是否达成了一致
2、slave的永久下线
让master摘除某个已经下线的slave:SENTINEL RESET mastername,在所有的哨兵上面执行
3、slave切换为Master的优先级
slave->master选举优先级:slave-priority,值越小优先级越高
4、基于哨兵集群架构下的安全认证
每个slave都有可能切换成master,所以每个实例都要配置两个指令
master上启用安全认证,requirepass
master连接口令,masterauth
sentinal,sentinel auth-pass <master-group-name> <pass>
5、容灾演练
通过哨兵看一下当前的master:SENTINEL get-master-addr-by-name mymaster
把master节点kill -9掉,pid文件也删除掉
查看sentinal的日志,是否出现+sdown字样,识别出了master的宕机问题; 然后出现+odown字样,就是指定的quorum哨兵数量,都认为master宕机了
(1)三个哨兵进程都认为master是sdown了
(2)超过quorum指定的哨兵进程都认为sdown之后,就变为odown
(3)哨兵1是被选举为要执行后续的主备切换的那个哨兵
(4)哨兵1去新的master(slave)获取了一个新的config version
(5)尝试执行failover
(6)投票选举出一个slave区切换成master,每隔哨兵都会执行一次投票
(7)让salve,slaveof noone,不让它去做任何节点的slave了; 把slave提拔成master; 旧的master认为不再是master了
(8)哨兵就自动认为之前的187:6379变成了slave了,19:6379变成了master了
(9)哨兵去探查了一下187:6379这个salve的状态,认为它sdown了
所有哨兵选举出了一个,来执行主备切换操作
如果哨兵的majority都存活着,那么就会执行主备切换操作
再通过哨兵看一下master:SENTINEL get-master-addr-by-name mymaster
尝试连接一下新的master
故障恢复,再将旧的master重新启动,查看是否被哨兵自动切换成slave节点
(1)手动杀掉master
(2)哨兵能否执行主备切换,将slave切换为master
(3)哨兵完成主备切换后,新的master能否使用
(4)故障恢复,将旧的master重新启动
(5)哨兵能否自动将旧的master变为slave,挂接到新的master上面去,而且也是可以使用的
6、哨兵的生产环境部署
daemonize yes
logfile /var/log/sentinal/5000
mkdir -p /var/log/sentinal/5000
reids集群
配置如下:
cluster-enable yes
yum install ruby
yum install rubygems
gem install redis (安装ruby访问redis的接口)
解决问题:
https://www.cnblogs.com/PatrickLiu/p/8454579.html
速度慢解决:
https://gems.ruby-china.com/
# 修改密码和配置文件的redis.config一样
vi /usr/local/rvm/gems/ruby-2.5.1/gems/redis-4.0.1/lib/redis/client.rb
cd /usr/local/redis/redis-3.2.8/src下(你的解压目录)
./redis-trib.rb create --replicas 1 192.168.3.220:7001 192.168.3.220:7002 192.168.3.221:7003 192.168.3.221:7004 192.168.3.222:7005 192.168.3.222:7006
1 代表1主1从
2 代表1主2从
-- 问题解决方式:【ERR】can not connect 192.168.3.220:7001(220不允许222IP访问)
添加端口
firewall-cmd --zone=public --add-port=端口号/tcp --permanent
重新加载防火墙规则
firewall-cmd --reload
查看所有放行的端口
firewall-cmd --list-ports
# 修改密码和配置文件的redis.config【masterauth,requirepass】一样
vi /usr/local/rvm/gems/ruby-2.5.1/gems/redis-4.0.1/lib/redis/client.rb
----------------------------------------------------------------
M: dec146703a9f16d4254115bc68ffd867df46a3d2 192.168.3.220:7001
slots:0-5460 (5461 slots) master
S: 26dc40df2fbccd3da7ee4485753dfb4ec4b46b39 192.168.3.220:7002
replicates bc185fe5fd0a2e9ae17eb0fe0f79c90f7ba180fb
M: 2c648ded57ffa25e80408101edef9aa2266f56bd 192.168.3.221:7003
slots:5461-10922 (5462 slots) master
S: 2a6cec38c41406a31d5f05fe207170bc7b25ae20 192.168.3.221:7004
replicates dec146703a9f16d4254115bc68ffd867df46a3d2
M: bc185fe5fd0a2e9ae17eb0fe0f79c90f7ba180fb 192.168.3.222:7005
slots:10923-16383 (5461 slots) master
S: 110ad795a1b0c7b0ee48b5bb5e0e721aeba7f15a 192.168.3.222:7006
replicates 2c648ded57ffa25e80408101edef9aa2266f56bd
2)针对错误信息执行集群修复命令:./redis-trib.rb fix 192.168.3.220:7001
检查集群是正常工作
-c 连接集群节点
./redis-cli -c -p 7001 -a 123 -h 192.168.3.220
添加节点:
1、首先把需要添加的节点启动
创建7006目录,拷贝7000中的redis.conf到7006中,然后修改端口port为7006,修改好后进入7006目录启动这个节点:
redis-server redis.conf
2、执行以下命令,将这个新节点添加到集群中:
redis-trib.rb add-node 192.168.33.130:7006 192.168.33.130:7000
哨兵之间没有发现同伴。
public static void test3() {
//初始化集合,用于装下面的多个主机和端口
HashSet<HostAndPort> nodes = new HashSet<HostAndPort>();
//创建多个主机和端口实例
HostAndPort hostAndPort = new HostAndPort("192.168.3.220", 70001);
HostAndPort hostAndPort1 = new HostAndPort("192.168.3.220", 7002);
HostAndPort hostAndPort2 = new HostAndPort("192.168.3.221", 7003);
HostAndPort hostAndPort3 = new HostAndPort("192.168.3.221", 7004);
HostAndPort hostAndPort4 = new HostAndPort("192.168.3.222", 7005);
HostAndPort hostAndPort5 = new HostAndPort("192.168.3.222", 7006);
//添加多个主机和端口到集合中
nodes.add(hostAndPort);
nodes.add(hostAndPort1);
nodes.add(hostAndPort2);
nodes.add(hostAndPort3);
nodes.add(hostAndPort4);
nodes.add(hostAndPort5);
//创建config
JedisPoolConfig poolConfig = new JedisPoolConfig();
//通过config创建集群实例
/*public JedisCluster(HostAndPort node, int connectionTimeout, int soTimeout,
int maxAttempts, String password, final GenericObjectPoolConfig poolConfig)*/
JedisCluster jedisCluster = new JedisCluster(nodes, 4000,1,1,"123",poolConfig);
//获取集群中的key为name键的值
String str = jedisCluster.get("3faf");
System.out.println(str);
try {
jedisCluster.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Redis主从、哨兵、集群的更多相关文章
- 【Redis学习专题】- Redis主从+哨兵集群部署
集群版本: redis-4.0.14 集群节点: 节点角色 IP redis-master 10.100.8.21 redis-slave1 10.100.8.22 redis-slave2 10.1 ...
- Redis主从&哨兵集群搭建
主从集群 在搭建主从集群前,我们先把Redis安装起来: #解压Redis压缩包 [root@master lf]# tar -zxvf redis-6.2.1.tar.gz -- #安装gcc [r ...
- 三千字介绍Redis主从+哨兵+集群
一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ...
- redis主从、集群、哨兵
redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...
- redis的哨兵集群,redis-cluster
#主从同步redis主从优先1.保证数据安全,主从机器两份数据一主多从2.读写分离,缓解主库压力主redis,可读可写slave身份,只读 缺点1.手动主从切换假如主库挂了,得手动切换master ...
- redis:哨兵集群配置
最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
- 走进Redis:哨兵集群
为什么需要哨兵 在 Redis 的主从库模式中,如果从库发生了故障,用户的操作是可以继续进行的,因为写操作是只在主库中进行的.那么,如果主库发生了故障,用户的操作将会收到影响.这时候可能会需要选择一个 ...
- Redis Sentinel哨兵集群
Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...
- redis的哨兵集群,自动切换主从库
Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能. 而 ...
- Redis高可用-主从,哨兵,集群
主从复制 Master-Slave主从概念 同时运行多个redis服务端,其中一个作为主(master),其他的一个或多个作为从(slave),主从之间通过网络进行通讯,slave通过复制master ...
随机推荐
- jeesite框架前端 tabPage页签刷新功能。
js主动刷新当前页签的js代码 原本想找一下jeesite有没有主动刷新当前页面的内置方法. 官方文档找了一大堆,找都找不到,也可能我这个需求比较少人需要. tab标签页有一个右键刷新页签功能 查看编 ...
- IDEA配置编码
- markdown居中对齐,左对齐,右对齐
Markdown语法本身没有居中,但Markdown中支持基本的HTMl语法,可以使用HTML语法. 居中: <center>居中</center> 左对齐: <p al ...
- python使用socket向客户端发送数据的方法
在使用locust测试长连接的时候,所有的请求全部faillure了,所以想到手动写一个连接脚本测试一下是否能连通 因为centos7自带python2.7所以用python写一个比较方便. #!/u ...
- Want To Become A Web Design Expert? Read This Piece
Want To Become A Web Design Expert? Read This Piece It can be very expensive to hire a web design fi ...
- python一些小知识点is和编码
dic = { "name":["alex", "wusir", "taibai"], 'py9':{ "ti ...
- 洛谷 题解 P2802 【回家】
思路:DFS+剪枝 本题可以用一个字符二维数组来存整个地图,然后在往四个方向进行搜索.注意:当走到家门前要先判断血量!(本人就被坑了) 代码: #include<bits/stdc++.h> ...
- Linux安装jemalloc笔记
前言 最近研究一个工具库需要用 jemalloc 做内存分配器,但在 ubuntu 下安装过程中遇到很多问题,故记下安装过程的笔记,避免以后遇到在这上面浪费时间. 安装过程 环境:VMware Ubu ...
- mysql的binlog安全删除的一种方法
指定过期天数(expire_logs_days) ---适用于单机版mysql! 该参数为全局可动态调整参数,默认值为0,即关闭,取值范围0-99. 1.3.1 参数的查看: mysql> ...
- 小菜鸟之SSM框架
# SSM框架 # **什么是框架** 就是模板,将一些基础性的程序和代码由框架模板提供,然后程序员补充和业务需求相关的代码. # **ssm框架组成** s: springMvc 子框架 代替ser ...