主从

命名设置:
>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主从、哨兵、集群的更多相关文章

  1. 【Redis学习专题】- Redis主从+哨兵集群部署

    集群版本: redis-4.0.14 集群节点: 节点角色 IP redis-master 10.100.8.21 redis-slave1 10.100.8.22 redis-slave2 10.1 ...

  2. Redis主从&哨兵集群搭建

    主从集群 在搭建主从集群前,我们先把Redis安装起来: #解压Redis压缩包 [root@master lf]# tar -zxvf redis-6.2.1.tar.gz -- #安装gcc [r ...

  3. 三千字介绍Redis主从+哨兵+集群

    一.Redis持久化策略 1.RDB 每隔几分钟或者一段时间会将redis内存中的数据全量的写入到一个文件中去. 优点: 因为他是每隔一段时间的全量备份,代表了每个时间段的数据.所以适合做冷备份. R ...

  4. redis主从、集群、哨兵

    redis的主从.集群.哨兵 参考: https://blog.csdn.net/robertohuang/article/details/70741575 https://blog.csdn.net ...

  5. redis的哨兵集群,redis-cluster

    #主从同步redis主从优先1.保证数据安全,主从机器两份数据一主多从2.读写分离,缓解主库压力主redis,可读可写slave身份,只读   缺点1.手动主从切换假如主库挂了,得手动切换master ...

  6. redis:哨兵集群配置

    最少配置1主2从3哨兵 一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

  7. 走进Redis:哨兵集群

    为什么需要哨兵 在 Redis 的主从库模式中,如果从库发生了故障,用户的操作是可以继续进行的,因为写操作是只在主库中进行的.那么,如果主库发生了故障,用户的操作将会收到影响.这时候可能会需要选择一个 ...

  8. Redis Sentinel哨兵集群

    Redis Sentinel(哨兵集群)是一种高可用的redis部署方案.在集群中的redis-master服务挂掉时,无需人为干预,即可通过哨兵集群的自我调整,实现redis服务的持续可用. 哨兵集 ...

  9. redis的哨兵集群,自动切换主从库

    Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,redis本身或者客户端都没有实现主从切换的功能. 而 ...

  10. Redis高可用-主从,哨兵,集群

    主从复制 Master-Slave主从概念 同时运行多个redis服务端,其中一个作为主(master),其他的一个或多个作为从(slave),主从之间通过网络进行通讯,slave通过复制master ...

随机推荐

  1. 深入理解Android消息机制

    在日常的开发中,Android 的消息机制作为系统运行的根本机制之一,显得十分的重要. 从 Handler 发送消息开始 查看源码,Handler的post.send方法最终都会走到 public f ...

  2. mysql学习笔记11_12(查询)

    1.建表和插入值 创建company数据库 创建 department表 create table department(d_id int(10) primary key not null uniqu ...

  3. Public thanks to Shao Qirui for his contribution to open source software

    Public thanks to Shao Qirui for his contribution to open source softwareShao Qirui is a student, but ...

  4. Spring switch的使用

    首先在html开始标签中引入一个属性 1 xmlns:th="http://www.thymeleaf.org" 示例代码 <div th:switch="${us ...

  5. last 和 lastb 命令

    NAME last - show listing of last logged in users 数据源:/var/log/wtmp 文件 lsstb - show listing of last l ...

  6. docker部署zabbix并设置自动发现规则

      docker部署zabbix比源码安装简单一些,特此记录: 机器准备: zabbix-server: 192.168.0.150 homeserver zabbix-agent: 192.168. ...

  7. 《你必须知道的495个C语言问题》读书笔记之第4-7章:指针

    1. Q:为什么我不能对void *指针进行算术运算? A:因为编译器不知道所值对象的大小,而指针的算法运算总是基于所指对象的大小的. 2. Q:C语言可以“按引用传参”吗? A:不可以.严格来说,C ...

  8. 数据库连接池——C3P0&Druid(快速入门)

    数据库连接池--C3P0&Druid (一) 数据库连接池 每一个事物都有其存在的意义,在初学jdbc的时候,我们建立数据库连接对象后,会对其进行释放,但是数据库连接的建立和关闭是非常消耗资源 ...

  9. 输出重定向之python2和python3的区别

    python语句支持输出重定向到文件里,与shell类似使用“>>”来重定向输出. python2: logfile = open('mylog.txt', 'a') print > ...

  10. jquery 实时监听输入框值变化的完美方案

    只需要同时绑定 oninput 和 onpropertychange 两个事件,但是这并不完美 $('.input-form :input').bind('input propertychange', ...