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
跟多问题,请百度解决。