目录:

Redis 主从介绍

主Redis写入数据时,从Redis会通过Redis Sync机制,同步数据,确保数据一致。并且Redis有哨兵(Sentinel)机制,Redis主挂掉会自动帮我们提升从为主,不过哨兵我发现只适用一主多从,不太适合级联模式。


哨兵机制

  1,有了主从,那我们需要对其进行监控,Sentinel会不断地检查你的主服务器和从服务器是否运作正常。某个节点故障后,Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(Progress), 这些进程使用流言协议(Gossip Protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器。

  2,哨兵是个分布式系统,通过配置文件可以多个哨兵合作,以实现它的健壮性:

  • 某个主服务是否正常,需要通过多个哨兵确认,这样可保证误判的低概率。
  • 当哨兵工作的时候,总会有个别哨兵不能正常运行,如个别系统出现故障,所以多个哨兵合作运行,保证了系统的健壮性。
  • 所有的哨兵、redis实例(包括主与从)和客户端相互之间会有交互,这是一个大的分布式系统,在此文档中将由浅入深地介绍哨兵的基础概念,以便更好的理解其基本属性,然后是更复杂的特性,让你理解它是如果精确的工作

Redis 主从配置

  • 环境:一主一从配置,一般来说一个分布式,至少满足2n+1,最小为3个,生产看需求。

  主节点IP:192.168.198.131

  从节点IP:192.168.198.132

  从节点IP:192.168.198.133

  端口使用默认6379(如果是虚拟机测试,一台机器拷贝3个redis目录进行配置启动就可以了)


  • 安装: 节点1 节点2 节点3 全部执行以下命令,不同的地方有标注。

编译redis

cd /usr/local/src/

wget http://download.redis.io/releases/redis-3.0.5.tar.gz

tar zxvf ./redis-3.0.5.tar.gz

cd redis-3.0.5

make

make install

主从配置

  1. 将主从redis配置文件redis.conf中的aemonize no 改为 yes
  2. 从redis配置文件添加slaveof 192.168.198.131 6379 的配置
  3. 主从开启AOF机制 appendoly  yes

cd /usr/local/src/redis-3.0.5

vim redis.conf     #修改以下内容,不是必须的

bind   127.0.0.1 192.168.198.131   #两台主机分别改为自己的IP

logfile  "/usr/local/src/redis-3.0.3/redis.log"

daemonize yes   #启用守护模式

appendonly  yes         #开启aof持久化

slave-read-only yes   #slave 默认就是只读的,这里不用管。

protected-mode no   #protected-mode 是3.2 之后加入的新特性,为了禁止公网访问redis cache,加强redis安全的。根据自己需要配置,它启用的条件,有两个,没有bind IP 以及没有设置访问密码。

#requirepass  "admin.123"    #设置redis登录密码  这个看自己需求可以不要

#masterauth  "admin.123"   #主从认证密码,否则主从不能同步,这个看自己需求可以不要

启用主从模式只有Redis Slave 添加一行,启动服务主从就配置好了。

slaveof 192.168.198.131 6379


  • 启动服务

主redis:

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

从redis:

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

从redis:

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf


  • 检查主从状态

~]# redis-cli -c -h 192.168.198.131 -p 6379
192.168.198.131:6379> info
.......
# Replication   #中间省略了内容,自己可以看看,主要是找到这一段,看主从状态。
role:master
connected_slaves:1
slave0:ip=192.168.198.132,port=6379,state=online,offset=5700675,lag=0
slave0:ip=192.168.198.133,port=6379,state=online,offset=5700676,lag=1
master_repl_offset:5700675
repl_backlog_active:1
repl_backlog_size:10000000
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5707674
.......


测试数据同步

主redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name abc
OK
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>
从redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>

127.0.0.1:6379>
从redis:
[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> get name
"abc"
127.0.0.1:6379>


默认是读写分离的

在从redis:

[root@localhost redis-3.0.5]# src/redis-cli -p 6379
127.0.0.1:6379> set name 123
(error) READONLY You can't write against a read only slave.


Redis Sentinel  配置

首先我们cp一份redis目录这样好区分开来,一台服务器开启多个redis服务也是这样拷贝目录配置端口启动
cp /usr/local/src/redis-3.0.5 /usr/local/src/redis-3.0.5-sentinel1
cd /usr/local/src/redis-3.0.5-sentinel1
vim sentinel.conf   #在redis的跟目录下
port 26379
daemonize yes
protected-mode no   #保护模式如果开启只接受回环地址的ipv4和ipv6地址链接,拒绝外部链接,而且正常应该配置多个哨兵,避免一个哨兵出现独裁情况,如果配置多个哨兵那如果开启也会拒绝其他sentinel的连接。导致哨兵配置无法生效。
logfile "/usr/local/src/redis-3.0.5-sentinel1/sentinel.log"    #指明日志文件
dir "/usr/local/src/redis-3.0.5-sentinel1" ## 哨兵sentinel的工作目录
sentinel monitor mymaster 192.168.198.131 6379 1   #哨兵监控的master,选择新主需要几个哨兵投票
sentinel down-after-milliseconds mymaster 5000   #master或者slave多少时间(默认30秒)不能使用标记为down状态。
sentinel failover-timeout mymaster 18000   #若哨兵在配置值内未能完成故障转移操作,则任务本次故障转移失败。
sentinel auth-pass mymaster redispass   #如果redis配置了密码,那这里必须配置认证,否则不能自动切换
sentinel parallel-syncs mymaster 1 # 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长, 但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态

[root@master redis-3.0.5-sentinel1]# /usr/local/src/redis-3.0.5-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.5-sentinel1/sentinel.conf   #启动服务
如果有下面报错 启动命令后面要加上 --sentinel
*** FATAL CONFIG FILE ERROR ***
Reading the configuration file, at line 6
>>> 'sentinel monitor mymaster 192.168.198.131 6379 1'
sentinel directive while not in sentinel mode

哨兵无需配置slave,只需要指定master,哨兵会自动发现slave

检查哨兵状态:

[root@localhost redis-3.0.5-sentinel1]# ./src/redis-cli -p 26379
127.0.0.1:26379> info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=1
127.0.0.1:26379>

就这样,分布式完成了,启动,然后杀死主redis, 然后就从哨兵中看到了redis的选举新主redis切换了,将现在的主redis的数据进行save保存,然后将现在的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录下dump.rdb (如果是aof持久化则直接拷贝aof文件覆盖原来主热地上的根目录下并重启),然后我们启动杀死的主redis,发现之前的主redis变成了新主的从redis了,就这样整个过程就完成了。

rdb持久化数据同步步骤如下:

1)将现在的主redis的数据进行保存

[root@localhost redis-3.0.5]# src/redis-cli -p 6379
     127.0.0.1:6379> save
     OK
     127.0.0.1:6379>

2)将现在的主redis根目录下dump.rdb文件拷贝覆盖到原来主redis的根目录下dump.rdb

3)启动原来的主redis

[root@localhost redis-3.0.5]# ./src/redis-server  redis.conf

4)info replication命令查看主从复制信息,之前的主redis变成了新主的从redis了


主Redis宕机测试(大概流程如下,自己测试,从redis宕机重启slave重新加入到了主从复制中)

把主redis的进程kill掉,观察sentinel控制台输出信息:
2461:X 18 Jul 08:29:19.276 #   +sdown master mymaster 127.0.0.1 6380【 master服务已经宕机 】
2461:X 18 Jul 08:29:19.276 # +odown master mymaster 127.0.0.1 6380 #quorum 1/1
2461:X 18 Jul 08:29:19.276 # +new-epoch 1
2461:X 18 Jul 08:29:19.276 #   +try-failover master mymaster 127.0.0.1 6380【尝试恢复master】
2461:X 18 Jul 08:29:19.282 # +vote-for-leader 236f14b361fc5a0dc0621cf88823ed6e6252b2f3 1 【 投票选举哨兵leader,现在就一个哨兵所以leader就自己 】
2461:X 18 Jul 08:29:19.282 # +elected-leader master mymaster 127.0.0.1 6380 【选出leader】
2461:X 18 Jul 08:29:19.282 # +failover-state-select-slave master mymaster 127.0.0.1 6380 【选中其中的一个slave当做master】
2461:X 18 Jul 08:29:19.345 #   +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380【选中6381当master】
2461:X 18 Jul 08:29:19.345 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【发送slaveof no one命令】
2461:X 18 Jul 08:29:19.401 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【等待升级master】
2461:X 18 Jul 08:29:20.291 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380 【升级6381为master】
2461:X 18 Jul 08:29:20.291 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.361 * +slave-reconf-sent slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:20.666 * +slave-reconf-inprog slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.694 * +slave-reconf-done slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6380
2461:X 18 Jul 08:29:21.770 #   +failover-end master mymaster 127.0.0.1 6380【 故障恢复完成 】
2461:X 18 Jul 08:29:21.770 #   +switch-master mymaster 127.0.0.1 6380 127.0.0.1 6381【master 从6380切换到6381】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6382 127.0.0.1 6382 @ mymaster 127.0.0.1 6381 【添加6382为6381的从库】
2461:X 18 Jul 08:29:21.771 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【添加6380为6381的从库】
2461:X 18 Jul 08:29:51.828 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 【 发现6380已经宕机,等待6380的恢复 】

查看主从复制信息可以看出,现在6381为master,有一个从库

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6382,state=online,offset=35213,lag=1
master_repl_offset:35346
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:35345
 

把6380恢复

[root@master redis-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-master-slave/6380/redis.conf
观察sentinel控制台输出信息:
2461:X 18 Jul 08:42:35.202 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
2461:X 18 Jul 08:42:45.207 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381

查看主从复制信息:

127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6382,state=online,offset=56432,lag=0
slave1:ip=127.0.0.1,port=6380,state=online,offset=56432,lag=0
master_repl_offset:56432
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56431
 

配置多个哨兵

启动三个哨兵(redis-3.0.3-sentinel1, redis-3.0.3-sentinel2, redis-3.0.3-sentinel3)
cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel2
cp /usr/local/src/redis-3.0.3-sentinel1 /usr/local/src/redis-3.0.3-sentinel3
配置(三个配置基本相似, 就端口号的地方改一下)
vim sentinel.conf   #在redis的跟目录下
port 26379   # 对应第sentinel1
port 26380  # 对应第sentinel2
port 26381  # 对应第sentinel3
 
启动sentinel服务
[root@master redis-3.0.3-sentinel1]# /usr/local/src/redis-3.0.3-sentinel1/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel1/sentinel.conf   #启动服务
[root@master redis-3.0.3-sentinel2]# /usr/local/src/redis-3.0.3-sentinel2/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel2/sentinel.conf   #启动服务
[root@master redis-3.0.3-sentinel3]# /usr/local/src/redis-3.0.3-sentinel3/src/redis-sentinel /usr/local/src/redis-3.0.3-sentinel3/sentinel.conf   #启动服务
多个哨兵配置文件一样,正常情况下要配置奇数哨兵,避免切换时候票数相同,出现竞争,影响线上业务。

 

Redis 主从配置密码以及哨兵的更多相关文章

  1. windows下安装和redis主从配置(通过哨兵控制主从切换)

    首先自己先得了解什么是redis,这里就不详做介绍什么是redis了,这篇文章主要讲的是怎么样配置 redis怎样配置主从关系和哨兵控制主从服务器的配置以及应用,就当是给自己记笔记吧! 1.下载red ...

  2. 通过哨兵机制实现Redis主从配置以及java调用

    Redis版本:3.0.7 操作环境:Linux 一.redis 主从配置的作用是什么 redis主从配置,配置master 只能为写,slave只能为读,在客户端对poolconnect请求时候,, ...

  3. redis主从配置+sentinel哨兵

    redis主从配置+sentinel哨兵 1:编译环境准备 1.1环境确认 Redis是一个开源.支持网络.基于内存.键值对存储数据库,使用ANSI C编写.所以在搭建Redis服务器时需要C语言的编 ...

  4. Redis主从配置详细过程

    Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构.下面楼主简单的进行一下配置. 1.上面安装 ...

  5. redis主从配置及主从切换 转

    redis主从配置及主从切换 转自 http://blog.sina.com.cn/s/blog_67196ddc0101h8v0.html (2014-04-28 17:48:47) 转载▼   分 ...

  6. REDIS主从配置及切换

    最近公司项目也用上了.但有个点没有弄很明白. requirepass只是给CLIENT认证用的,还是同时给从REDIS认证用的?(masterauth) 一般的思路是主服务器不开AOF,从服务器打开A ...

  7. Redis主从配置及通过Keepalived实现Redis自动切换高可用

    Redis主从配置及通过Keepalived实现Redis自动切换高可用 [日期:2014-07-23] 来源:Linux社区  作者:fuquanjun [字体:大 中 小]   一:环境介绍: M ...

  8. Linux中redis主从配置

    假设要在6380开启redis 1.添加配置文件:复制redis.conf为redis_6380.conf 2.修改配置文件:修改redis_6380.conf中port.pidfile 3.防火墙: ...

  9. Redis主从配置和哨兵监控配置——服务器端环境搭建

    一:介绍 公司用到的redis框架,主要分为cluster的缓存集群和sentinel中的哨兵主从.这种的选用方式一般需要更具业务场景来做区分,两种框架的配置图为:右图为哨兵主从框架和cliuster ...

随机推荐

  1. switch表达式可使用的类型

    在java中switch后的表达式的类型只能为以下几种:byte.short.char.int(在Java1.6中是这样),在java1.7后支持了对string的判断.

  2. page内置对象

  3. vuex基础入门

    Vuex简介 vuex的安装和组成介绍 [外链图片转存失败(img-nWQUUuyh-1565273314232)(https://upload-images.jianshu.io/upload_im ...

  4. HTML | CSS | JavaScript 常见错误

    持续更新 超链接鼠标悬浮后的状态 a:hover 拼写 图片文件的路径问题

  5. P2052 [NOI2011]道路修建——树形结构(水题,大佬勿进)

    P2052 [NOI2011]道路修建 这个题其实在dfs里面就可以把事干完的,(我一开始还拿出来求了一把)…… 一条边的贡献就是儿子的大小和n-siz[v]乘上边权: #include<cma ...

  6. mysql 根据日期时间查询数据

    mysql> select * from table1; +----------+------------+-----+---------------------+ | name_new | t ...

  7. OpenFOAM——气泡上升

    计算域的顶部为大气,其余部分为壁面 流体的物性参数为: 首先进行建模操作,任何建模软件均可,本算例采用ICEM直接建模,生成网格,然后利用OpenFOAM下转化网格,划分完成的网格如下: 网格比较密集 ...

  8. 解读 | 你真正理解什么是Cloud Native吗?

    你能做到每周.每天甚至每个钟头向客户发布新特性吗?新加入的开发者能够在他们工作的第一天甚至面试阶段就能部署代码吗?部署新员工的代码后,你能因为确信应用程序运行正常而安然入睡吗?建立快速发布机制,包括支 ...

  9. 日期正则表达式yyyyMMdd

    日期校验yyyyMMdd, 包括闰月等校验. package com.xgcd; import java.util.regex.Matcher; import java.util.regex.Patt ...

  10. /etc/bashrc

    [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\[\e[34;1m\]\u@\[\e[0m\]\[\e[3 ...