Redis 高级部分

一、主从复制

image.png

Rdis 的主从复制特点

image.png

1. 配置主从

实现方式同样有两种: 命令方式和配置文件方式

命令方式

只需要在从服务器上执行如下命令即可

slaveof  主服务器的IP  端口号

slaveof 命令是异步的,不阻塞。
并且此时,从服务器现有的数据会先被清空,之后再同步主服务器的数据。

停止一台从服务器的复制操作,在此台服务器上执行如下命令

slaveof no   one

配置文件的方式如下

只需要在从服务器上配置即可

修改配置文件
假如主服务器 IP 是: 172.16.153.178
端口是: 6379

# slaveof <masterip> <masterport>
slaveof  172.16.153.178 6379

// 配置此服务器只提供读取操作
slave-read-only yes

之后重启从主机的 Redis 服务

查看主从信息

127.0.0.1:6379> info  replication

二、主从 + Sentinel 哨兵模式

Redis Sentinel是Redis官方的高可用性解决方案。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

  • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将主从复制组合中的其中一个从服务器升级为新的主服务器, 并让其他从服务器指向新的主服务器; 当客户端试图连接失效的主服务器时, Sentinel也会向客户端返回新主服务器的地址, 使得新主服务器代替失效服务器。

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

虽然 Redis 为 Sentinel 生成一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器。

此种模式下,客户端要访问的 服务 IP 不是主节点,而是 sentiner 服务器的 IP。

架构图

image.png

Redis Sentinel 故障转移

image.png

架构的扩展应用

image.png

1. 配置主从

a. 快速生成主节点的配置文件

编译全新文件 /etc/redis/redis-6380.conf, 添加如下内容

port 6380
daemonize yes
protected-mode no
pidfile /var/run/redis-6380.pid
logfile /var/log/redis-6380.log
dir /redis/data/

假如是多个主机实现的,就需要更改为 protected-mode yes
并且添加 bind 0.0.0.0

b. 快速生成从节点的配置文件

[root@s1 ~]# sed 's/6380/6381/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6381.conf
[root@s1 ~]# sed 's/6380/6382/g' /etc/redis/redis-6380.conf > /etc/redis/redis-6382.conf


查看配置文件内容,检验配置结果

[root@s1 ~]# cat /etc/redis/redis-6381.conf
port 6381
daemonize yes
pidfile /var/run/redis-6381.pid
logfile /var/log/redis-6381.log
dir /redis/data/
[root@s1 ~]# cat /etc/redis/redis-6382.conf
port 6382
daemonize yes
pidfile /var/run/redis-6382.pid
logfile /var/log/redis-6382.log
dir /redis/data/
[root@s1 ~]#

c. 配置主从关系

[root@s1 ~]# echo "slaveof  172.16.153.178 6380" >> /etc/redis/redis-6381.conf
[root@s1 ~]# echo "slaveof  172.16.153.178 6380" >> /etc/redis/redis-6382.conf
[root@s1 ~]#


高版本将 slaveof 更换成 replicaof

d. 启动服务,并验证进程

[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6380.conf
[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6381.conf
[root@s1 ~]# /usr/local/bin/redis-server /etc/redis/redis-6382.conf
[root@s1 ~]# ps -ef |grep redis
root       4335      1  0 19:30 ?        00:00:03 /usr/local/bin/redis-server *:6380
root       4490      1  0 20:17 ?        00:00:00 /usr/local/bin/redis-server *:6381
root       4495      1  0 20:17 ?        00:00:00 /usr/local/bin/redis-server *:6382
root       4500   3755  0 20:17 pts/0    00:00:00 grep --color=auto redis
[root@s1 ~]#


假如日志中出现如下警告信息

4668:S 17 Feb 20:28:42.107 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
4668:S 17 Feb 20:28:42.107 # Server initialized
4668:S 17 Feb 20:28:42.108 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
4668:S 17 Feb 20:28:42.108 * DB loaded from disk: 0.000 seconds
4668:S 17 Feb 20:28:42.110 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
解决办法

The TCP backlog...
方法1: 临时设置生效:

shell> sysctl -w net.core.somaxconn=1024

方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行

net.core.somaxconn=1024

然后执行命令

sysctl -p

WARNING overcommit_memory ...

方法1: 临时设置生效:

shell> sysctl -w vm.overcommit_memory=1

方法2: 永久生效:
修改/etc/sysctl.conf文件,增加一行

vm.overcommit_memory=1

然后执行命令

sysctl -p

e. 查看主从复制信息

image.png

2. 配置 sentinel

获取程序

Sentinel 程序可以在编译后的 src 文档中发现, 它是一个命名为 redis-sentinel 的程序。

运行一个 Sentinel 所需的最少配置如下所示:

Redis 源码中包含了一个名为 sentinel.conf 的文件, 这个文件是一个带有详细注释的 Sentinel 配置文件示例。

运行一个 Sentinel 所需的最少配置如下所示:

// 监控一个 Redis 服务器
// 名称为 mymaster ,IP 为 127.0.0.1 端口为 6380
// 最后的 2  是指最少有 2 给 Sentinel 实例同意一台 redis 服务器宕机,才会认为 客观下线。
// sentinel monitor  自定义的主节点名称 主节点的 IP  主节点端口   票数 

sentinel monitor mymaster 127.0.0.1 6380 2

sentinel down-after-milliseconds mymaster 3000

// 180 秒后开始故障自动装换
sentinel failover-timeout mymaster 5000

sentinel parallel-syncs mymaster 1

各个选项的功能如下:

down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。
如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。

不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。

将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

最终的配置文件

sentinel-27000.cn

daemonize yes
port 27000
dir "/tmp"
logfile "27000.log"

sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 5000
sentinel parallel-syncs mymaster 1

哨兵的领导者选举

票数和领导者选举有关系

领导者选举的事件发生,必须满足下面的条件

max(票数, (哨兵的个数 / 2) + 1 ) 个哨兵参加选举

才可以选举出领导者,从而完成故障转移。

比如有 5 个哨兵, 配置的票数是 4

max(4, (5 / 2) + 1)

max(4, 3.5)
4 最大
结果就是需要 4 个哨兵参与选举才可以。

a. 获取并修改配置文件

快速创建三个 sentinel 配置文件
进入到 Redis 源码的目录下,执行如下命令


image.png

修改监听端口

image.png

之后在每个 sentinel 配置文件中添加守护进程方式运行,
并修改dir 配置项的目录,

daemonize yes
dir /redis/data/
logfile  "sentinel-${port}.log"

最后别忘了修改监控的主服务器的 IP 和端口正确的 6380

最终其中一个的配置文件应该是这样的


image.png

b. 启动服务并验证

启动服务的语法:

shell> redis-sentinel   sentinel的配置文件
image.png
image.png

可以使用以下命令查看哨兵的信息

[root@s1 ~]# redis-cli -p 27001 info
...略...
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=3
[root@s1 ~]#


4. 故障演练

停止 Master 节点的服务

[root@s1 ~]# redis-cli -p 6380 shutdown

不断的刷新其中一个 Sentinel 节点的信息,观察最后一行信息的变化

[root@s1 ~]# redis-cli -p 27001 info
...略...
master0:name=mymaster,status=ok,address=127.0.0.1:6382,slaves=2,sentinels=3


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 一、主从复制 Rdis 的主从复制特点 1. 配置主从 实现方式同样有两种: 命令方式和配置文件方式 命令方式 只...
    红衣漫漫阅读 161评论 0 0
  • 一、主从复制 Rdis 的主从复制特点 1. 配置主从 实现方式同样有两种: 命令方式和配置文件方式 命令方式 只...
    你笑的那么美丶阅读 271评论 0 0
  • 一、主从复制 Rdis 的主从复制特点 1. 配置主从 实现方式同样有两种: 命令方式和配置文件方式 命令方式 只...
    Lengfin阅读 138评论 0 0
  • 一、主从复制 Rdis 的主从复制特点 1. 配置主从 实现方式同样有两种: 命令方式和配置文件方式 命令方式 只...
    痕迹xxxyyyyyyY阅读 307评论 0 0
  • 本文将要介绍的哨兵,它基于 Redis 主从复制,主要作用便是解决主节点故障恢复的自动化问题,进一步提高系统的高可...
    java成功之路阅读 2,171评论 0 4