redis 主从、sentinel、集群 搭建

redis 主从、sentinel、集群 搭建

编辑:王振威 日期:2018/07/09

==前言:==
1、本文介绍redis 主从、哨兵、集群模式的linux(centos7.2)搭建。

[root@wei-BaiDu redis]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

2、redis版本 【3.2.9】,注意: 【redis 2.6+】 之后才有哨兵模式,但是不稳定,【redis 2.8+】 哨兵版本稳定,可以生产使用,集群 必须是【redis 3.0】以后的版本。

==一、安装redis==

== 1)、环境 ==
这里使用一台百度云,做demo,所有redis启动在一台机器上

== 2)、下载 ==

cd /data/redis/
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar xvf redis-3.2.9.tar.gz
cd redis-3.2.9

== 3)、安装 ==

make install PREFIX=/data/redis/redis-3.2.9

==二、主从复制模式(master-slave)==

==说明:==
redis主从模式搭建,master无序修改配置,只需要修改slave,一个主可以对应多个从,一个从只能有一个主。

==【两种方式】:==

==模式一:==

  • 从库启动时:./redis-server --port 6380 --slaveof 127.0.0.1 6379

==模式二:==

  • slave配置:
cd /data/redis/redis-3.2.9
cp redis.conf redis2.conf
vim redis2.conf(slave)
###修改
port 6380
slaveof 192.168.0.12 6379
  • 启动
 src/redis-server  redis.conf & #master
 src/redis-server  redis2.conf &  #slave
  • 验证:1、master 中 set , 到slave 中去查看,是否可以获取到。
    ./redis-cli -h 127.0.0.1 -p 6379 #连接master
    set key 111
    ./redis-cli -h 127.0.0.1 -p 6380 #连接slave
    get key
  • 验证:2、登陆从数据库6380,命令:config get 'slaveof*'
127.0.0.1:6380> config get 'slaveof*'
1) "slaveof"
2) "127.0.0.1 6379"
  • ps、如果 想要外部访问,master 需要修改redis.conf:
bind 0.0.0.0 #无 ip 都可以访问
  • 额外:登陆 6380 ,执行命令【slaveof no one】 会把自己设为主。

==三、哨兵(sentinel)==

当主数据库遇到异常之后,中断了服务,开发者可以通过手动的方式,选择一个从数据库来升格主数据库,使得系统能够继续提供服务,但是这个过程相对麻烦,并且需要人工介入,【难以】实现自动化。为此,【redis 2.8】中提供了哨兵工具,来实现自动化的系统监控和故障恢复。

哨兵的作用:
- 1)、监视主数据库和从数据库是否正常运行。
- 2)、主数据库出现故障时,自动将从数据库转换为主数据库。
就是监控redis主、从数据库是否正常运行,主出现故障自动将从数据库转换为主数据库,主要功能包括两

搭建【1主2从】:这里为了后续管理方便,我创建新的文件目录,用于区分。

  • 1)cd /data/redis
  • 2)创建文件夹mkdir sentinel && cd sentinel
  • 3)拷贝配置:cp /data/redis/redis-3.2.9/sentinel.conf sentinel.conf
  • 4)创建文件夹mkdir 6001 6002 6003 && cd 6001
  • 5)cp /data/redis/redis-3.2.9/redis.conf redis.conf ( 修改master端口,6001)
  • 6)cp redis.conf ../6002/redis.conf (slave 端口 6002, 修改 slaveof 的地址 127.0.0.1 6001)
  • 7)cp redis.conf ../6003/redis.conf (slave 端口 6003, 修改 slaveof 的地址 127.0.0.1 6001)
  • 8)cd /data/redis/sentinel , 启动【1主2从】
    /data/redis/redis-3.2.9/src/redis-server 6001/redis.conf &
    /data/redis/redis-3.2.9/src/redis-server 6002/redis.conf &
    /data/redis/redis-3.2.9/src/redis-server 6003/redis.conf &
  • 9)配置哨兵的配置vi sentinel cof
## 哨兵端口号
port 26379
## 哨兵程序的日志路径
dir /root/application/program/redis/sentinel/
## sentinel monitor <master-name> <ip> <redis-port> <quorum>设置:
## ----[master-name] 表示要监控的主数据库名字,可以自己取一个。
## ----[ip][redis-port] 表示连接的主机 master ,只要连接上 master, sentinel 就会自动发现从数据库
## ----[quorum] :一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
sentinel monitor mymaster 192.168.0.167 6379 1
## Down-After-Milliseconds 设置:哨兵程序每5秒检测一次Master是否正常
sentinel down-after-milliseconds mymaster 5000
  • 10)启动 /data/redis/redis-3.2.9/src/redis-sentinel sentinel.conf &

==验证:==命令 简单说明:

SENTINEL masters 显示被监控的所有master以及它们的状态.   //用来查看监听的master name
SENTINEL master <master name> 显示指定master的信息和状态;
SENTINEL slaves <master name> 显示指定master的所有slave以及它们的状态;
SENTINEL get-master-addr-by-name <master name> 返回指定master的ip和端口,如果正在进行failover或者failover已经完成,将会显示被提升为master的slave的ip和端口。
SENTINEL reset <pattern> 重置名字匹配该正则表达式的所有的master的状态信息,清楚其之前的状态信息,以及slaves信息。
SENTINEL failover <master name> 强制sentinel执行failover,并且不需要得到其他sentinel的同意。但是failover后会将最新的配置发送给其他sentinel。

ps:那么现在已经搭建好了,哨兵模式的集群,我们客户端如何去连接呢?有人会说这有什么难的,已经知道了主节点的ip地址和端口。但试想一下,如果这样使用客户端,客户端连接Redis Sentinel和主从复制的Redis又有什么区别呢,如果主节点挂掉了,虽然Redis Sentinel可以完成故障转移,但是客户端无法获取这个变化,那么使用Redis Sentinel的意义就不大了,所以各个语言的客户端需要对Redis Sentinel进行显式的支持。【详情已经准备了对应的 demo,这里不做详细介绍】

四、集群

== 1)、配置 ==

  • 1)cd /data/redis
  • 2)mkdir cluster-conf && cd cluster-conf
  • 3)创建集群端口文件夹:mkdir 8001 8002 8003 8004 8005 8006 && cd 8001
    复制配置文件:cp /data/redis/redis-3.2.9/redis.conf ./
    Redis的log及持久化文件建议存储到磁盘空间较大的目录,本次存储路径:/data/redis/redis-cluster/
    修改配置文件:vi redis.conf (8001为例,其他几台机器,修改,只需要修改端口即可)
port 8001
logfile "logfile "/data/redis/cluster-conf/8001/redis.log
dir /data/redis/cluster-conf/8001/ #事先创建好
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
bind 0.0.0.0

cluster 模式,配置上 没有主从的区别。(redis.conf 详细的说明,请查看对应的文档xxxxxxx)
注:如果是跨服务,使用【scp】命令,可以快速完成。
scp -r redis-3.2.9/ root@192.168.0.13:/root/svr/

== 5)、启动 ==

/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8001/redis.conf &
/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8002/redis.conf &
/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8003/redis.conf &
/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8004/redis.conf &
/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8005/redis.conf &
/data/redis/redis-3.2.9/src/redis-server /data/redis/cluster-conf/8006/redis.conf &

== 6)、创建集群 ==
使用 redis-trib.rb 工具

./redis-trib.rb create --replicas 1 192.168.0.11:7001 192.168.0.12:7001 192.168.0.13:7001 192.168.0.11:7002 192.168.0.12:7002 192.168.0.13:7002

以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。
命令的意义如下:

  • 1、给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。
  • 2、选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点(百分比 选举master按先后顺序)。
  • 3、之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。
123

含义如下:
节点ID
IP:端口
标志: master, slave, myself, fail
如果是个从节点, 这里是它的主节点的NODE ID
集群最近一次向节点发送 PING 命令之后, 过去了多长时间还没接到回复。.
节点最近一次返回 PONG 回复的时间。
本节点的网络连接情况
节点目前包含的槽:例如 127.0.0.1:7001 目前包含号码为 5960 至 10921 的哈希槽(master)。

== 7)、验证 ==
集群客户端链接:redis-cli -c -p 8001
查看集群情况:CLUSTER NODES

180.76.175.204:8002> cluster nodes
7198ea2c97c32e11b30c4d7a4383b3ff2fe25a50 192.168.0.2:8002 myself,master - 0 0 2 connected 5461-10922
0290bbe6ecd7eae2222d525620e9ba96ef4e6aa7 180.76.175.204:8003 master - 0 1531050117760 3 connected 10923-16383
ea14b88811148ed1747663a0301f105c23075340 180.76.175.204:8004 master - 0 1531050118761 7 connected 0-5460
236df71afe187041379538a88d67fc86f3cb9830 180.76.175.204:8001 slave ea14b88811148ed1747663a0301f105c23075340 0 1531050118261 7 connected
b7548fb738eddff93758d0f4c60cd80cefa5dcd3 180.76.175.204:8005 slave 7198ea2c97c32e11b30c4d7a4383b3ff2fe25a50 0 1531050117259 5 connected
49076d4e4a2896f56935ed3c667ad91834c30a1d 180.76.175.204:8006 slave 0290bbe6ecd7eae2222d525620e9ba96ef4e6aa7 0 1531050119263 3 connected

== 8)、其他命令 ==
关于集群管理其他命令

cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键

==集群相关操作==

//增加
./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000
//从节点(masterid 和被加的节点)
./redis-trib.rb add-node --slave masterid 192.168.0.11:7002 

//移除
./redis-trib del-node 127.0.0.1:7000 `<node-id>`
关闭服务:./redis-cli -h 192.168.0.11 -p 7001 shutdown
删除:rm -rf /root/svr/redis-cluster/7001/*

== 9)、集群模式遇到的问题==
1、/usr/bin/env: ruby: 没有那个文件或目录

./redis-trib.rb create --replicas 1 192.168.0.11:7001 192.168.0.12:7001 192.168.0.13:7001 192.168.0.11:7002 192.168.0.12:7002 192.168.0.13:7002
/usr/bin/env: ruby: 没有那个文件或目录

解决方案:
ruby没有安装,于是执行:yum install -y ruby
2、还报错

/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
from /usr/local/bin/redis-trib.rb:25:in `<main>'

==【解决方案:】==gem install redis
3、其中 gem install redis命令执行时出现了:
redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持ruby到2.0.0,可gem 安装redis需要最低是2.2.2
==【解决方案:】==(这个过程,会比较久,我在云上1M带宽,花了2个小时)

sudo yum install curl
curl -L get.rvm.io | bash -s stable
source /usr/local/rvm/scripts/rvm
rvm list known
rvm install 2.3.3
rvm use 2.3.3
rvm remove 2.0.0
ruby --version
gem install redis

跟多问题,请百度解决。

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

推荐阅读更多精彩内容

  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 3,958评论 2 27
  • 前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器。楼主是...
    liangzzz阅读 4,247评论 9 152
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,030评论 1 51
  • 看完这些图 ,三国历史你还有什么不明白的吗http://image48.360doc.com/DownloadIm...
    骑马云游阅读 162评论 0 0
  • 当我最后一次想起你 一幅幅有你的画面 在泛黄的老照片 一句句深情的誓言 在写满的明信片 一字一句的呼喊 又扯断了谁...
    楠小枫阅读 167评论 0 2