基于 Redis3.2.4 集群搭建说明

344 阅读11分钟

摘要

用两台虚拟机(ip: 10.60.44.76、ip: 10.60.44.105)共 6 个节点,一台虚拟机 3 个节点,模拟出 3 master、3 salve 环境

  • redis 版本:redis-3.2.4
  • linux 版本:centos6.5(ip: 10.60.44.76)、centos7.0(ip: 10.60.44.105)

注意:

  • 一个 redis 实例就是一个节点
  • linux 最好是都在 root 权限下操作
  • redis-cluster 最小配置是三主三从
  • 关闭防火墙(节点与节点之间通信需要开放指定的端口,单纯为了方便,在生产环境忌用)

centos 6.5

service iptables stop # 关闭命令:
chkconfig iptables off # 永久关闭防火墙
service iptables status # 两个命令同时运行,运行完成后查看防火墙关闭状态 

centos 7.0

systemctl stop firewalld.service # 停止firewall
systemctl disable firewalld.service # 禁止firewall开机启动
firewall-cmd --state # 查看默认防火墙状态(关闭后显示notrunning,开启后显示running)

一、下载安装包

安装包在附件 redis-3.2.4.tar.gz。也可以使用 wget 插件下载

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

二、单点安装部署

单点指的是一个 redis 实例,需要先下载 redis 的源码,接着进行编译、安装,完成通过命令启动该实例

解压、编译、安装

[root@localhost Desktop]# tar zxvf redis-3.2.4.tar.gz
[root@localhost Desktop]# cd redis-3.2.4
[root@localhost redis-3.2.4]# cd src && make install

创建相关目录

# 存放 redis 相关命令文件
[root@localhost src]# mkdir -p /usr/local/redis/bin
# 存放 redis 的配置文件
[root@localhost src]# mkdir -p /usr/local/redis/etc

移动命令、配置文件

# 移动 redis 配置文件(配置文件在解压好的目录)
[root@localhost redis-3.2.4]# mv redis.conf /usr/local/redis/etc
# 移动 redis 命令文件(命令文件在解压好的目录中的 src 目录)
[root@localhost src]# mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel redis-trib.rb /usr/local/redis/bin

启动服务

# 指定配置文件启动 redis
[root@localhost src]# /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

查看状态

# 或者是 netstat -tunpl | grep 6379
ps -ef | grep redis

三、集群搭建部署

创建集群节点文件夹

名为 7031-7033 的文件夹置于 10.60.44.76 的机子中,7034-7036 文件夹置于 10.60.44.105 的机子中

mkdir -p /usr/local/redis-cluster
cd /usr/local/redis-cluster
# 创建各个节点文件夹
mkdir 7031 7032 7033 # IP 为 10.60.44.76 的机子上执行
mkdir 7034 7035 7036 # IP 为 10.60.44.105 的机子上执行

修改、拷贝配置文件

此处以 10.60.44.76 的机子为例,另一台操作一致

cp /usr/local/redis/etc/redis.conf /usr/local/redis-cluster/7031
cd /usr/local/redis-cluster/7031
vi redis.conf 

修改配置文件,范本如下

port 7031     # 绑定端口
bind 本机ip    # 物理 ip:如 10.60.44.76 
dir /usr/local/redis-cluster/7031 # 指定数据存放路径
cluster-enabled yes # 启动集群模式
cluster-config-file redis-7031.conf # 指定集群节点配置文件
daemonize yes # 后台启动
cluster-node-timeout 5000 # 指定集群节点超时时间
appendonly yes # 指定持久化方式

将 7031 的 redis.conf 改完后再拷贝到剩下的 2 个目录(7032、7033)中,再全局替换 redis.conf 中的 7031 为对应的节点编号(7032、7033)即可。同理得 10.60.44.105 机子

移动完后 ip 为 10.60.44.76 的 /usr/local/ 目录结构图如下:(10.60.44.105 同理)

[root@localhost local]# cd /usr/local/ && tree -L 3
.
├── bin
.......
├── redis
│   ├── bin
│   │   ├── mkreleasehdr.sh
│   │   ├── redis-benchmark
│   │   ├── redis-check-aof
│   │   ├── redis-check-rdb
│   │   ├── redis-cli
│   │   ├── redis-sentinel
│   │   ├── redis-server
│   │   └── redis-trib.rb
│   └── etc
│       └── redis.conf
├── redis-cluster
│   ├── 7031
│   │   └── redis.conf
│   ├── 7032
│   │   └── redis.conf
│   └── 7033
│       └── redis.conf
.......
└── src

安装 Ruby 和启动插件

集群的启动需要用到 Ruby 实现的 redis-trib.rb 插件,所以需要先安装 Ruby 环境和其插件,命令如下:

# 步骤一:建议不使用 yum 安装。使用网上自己下载源码的形式安装,版本可以稍微新一点
yum install ruby
# 步骤二:一般不会出错
yum install rubygems
# 步骤三:容易出错,下面有常见解决方案
gem install redis

此步骤需要很多环境,容易出错,附上常见错误解决方法:

错误一:no such file to load -- zlib

进入 ruby 源码文件夹并安装 ruby 自身提供的 zlib 包

[root@localhost ruby-2.3.3]# cd ext/zlib
[root@localhost zlib]# ruby ./extconf.rb
[root@localhost zlib]# make
[root@localhost zlib]# make install

错误二:--with-openssl-include=/usr/local/ssl/include/ --with-openssl-lib=/usr/local/ssl/lib

处理方法同错误一:

[root@localhost ruby-2.3.3]# cd ext/openssl
[root@localhost zlib]# ruby ./extconf.rb
[root@localhost zlib]# make
[root@localhost zlib]# make install

错误三:Unable to require openssl, install OpenSSL and rebuild ruby (preferred) or use non-HTTPS sources

首先查看一下 $openssl version 是不是安装了 OpenSSL

[root@localhost /]# openssl version
OpenSSL 1.0.1e-fips 11 Feb 2013

没有,则新安装一个 OpenSSL,具体教程不展开。如果有,则更换 gem 源的地址:

# 查看 gem 源
[root@localhost /]# gem source
# 删除 https 源 
[root@localhost /]# gem source -r https://rubygems.org/ to remove
# 添加 http 源
[root@localhost /]# gem source -a http://rubygems.org/ to read

开启集群个节点

在两台机子中分别运行下面命令,启动集群中的每个节点

 # 10.60.44.76
for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done
# 10.60.44.105
for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-server /usr/local/redis-cluster/703$i/redis.conf; done 

查看各节点状态

查看节点的开启状态

ps -ef | grep redis-server

结果如下:

### 10.60.44.76
root      18992      1  0 04:37 ?        00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7031 [cluster]              
root      18994      1  0 04:37 ?        00:00:09 /usr/local/redis/bin/redis-server 10.60.44.76:7032 [cluster]              
root      18998      1  0 04:37 ?        00:00:10 /usr/local/redis/bin/redis-server 10.60.44.76:7033 [cluster]              
root      41471  16554  0 05:29 pts/2    00:00:00 grep redis-server
### 10.60.44.105
root      50565      1  0 04:37 ?        00:00:07 /usr/local/redis/bin/redis-server 10.60.44.105:7034 [cluster]
root      50567      1  0 04:37 ?        00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7035 [cluster]
root      50571      1  0 04:37 ?        00:00:08 /usr/local/redis/bin/redis-server 10.60.44.105:7036 [cluster]
root      51273  34592  0 05:29 pts/1    00:00:00 grep --color=auto redis-server

创建集群

每个节点正常开启后,在两台机子任意一台上运行:

/usr/local/redis/bin/redis-trib.rb create --replicas 1 10.60.44.76:7031 10.60.44.76:7032 10.60.44.76:7033 10.60.44.105:7034 10.60.44.105:7035 10.60.44.105:7036

连接集群查看状态

登录客户端,并测试读写(记得要加上 -c 选项,不然会报错)

# 10.60.44.76
/usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 7031
cluster info # 显示集群信息

显示字段 cluster_state:ok 为正常运行状态,说明集群搭建成功

使用 cluster nodes 查看集群各节点的当前状态,可以查看主从节点的分配和连接和情况。如下:

10.60.44.76:7031> cluster nodes
1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498187489957 11 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498187486928 9 connected 5461-10922
37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 slave 396e92e2e8207be6a4a93e29fd16670656477131 0 1498187488947 9 connected
82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498187483893 6 connected
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498187487937 11 connected 0-5460
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 myself,master - 0 0 3 connected 10923-16383

关闭集群

关闭集群需要将节点逐个关闭,可以使用脚本自动完成:

# 10.60.44.76
for((i=1;i<=3;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.76 -p 703$i shutdown; done 
# 10.60.44.105
for((i=4;i<=6;i++)); do /usr/local/redis/bin/redis-cli -c -h 10.60.44.105 -p 703$i shutdown; done 

删除集群文件

每次新创建集群之前需要将自动生成的配置文件和数据库删除,命令如下:

# 10.60.44.76
for((i=1;i<=3;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done
# 10.60.44.105
for((i=4;i<=6;i++)); do rm -f /usr/local/redis-cluster/703$i/dump.rdb /usr/local/redis-cluster/703$i/redis-703$i.conf /usr/local/redis-cluster/703$i/appendonly.aof; done

四、集群操作

当前存在集群节点情况如下:

# 7034(主)- 7032(从)
# 7035(主)- 7033(从)
# 7036(主)- 7031(从)
82326f032fc040d7ed59f87ee9ddd500ad19d704 10.60.44.76:7033 slave 135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 0 1498199288536 6 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199282454 9 connected 5461-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199289546 3 connected 10923-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199285499 11 connected 0-5460
37ecfb611a8201ce2bf40a2bf0ce398704083baf 10.60.44.76:7031 myself,slave 396e92e2e8207be6a4a93e29fd16670656477131 0 0 1 connected
1212605fcb1dd351d07d167c26b368e992c85723 10.60.44.76:7032 slave 1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 0 1498199287523 11 connected

增加一个主节点

在原有的集群之上添加一个新的主节点,需要开启新的节点,接着将此节点添加进集群中并分配槽,详细如下描述:

1. 创建节点需要的相关文件(文件夹、配置文件)

[root@localhost /]# mkdir /usr/local/redis-cluster/7037

2. 拷贝并修改配置文件

将配置文件中的 7036 字符串全部替换为 7037,此处不再累述

[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf  /usr/local/redis-cluster/7037/

3. 启动新创建的节点

[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7037/redis.conf

4. 将新节点添加进已存在集群中成为其中一主节点

# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口
[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7037 10.60.44.105:7034

成功后打印信息如下:

>>> Adding node 10.60.44.105:7037 to cluster 10.60.44.105:7034
>>> Performing Cluster Check (using node 10.60.44.105:7034)
............... 省略
>>> Send CLUSTER MEET to node 10.60.44.105:7037 to make it join the cluster.
[OK] New node added correctly.

5. 查看添加新节点后的集群节点信息

3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498199380639 0 connected
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498199384698 9 connected 5461-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498199381655 3 connected 10923-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498199383685 11 connected 0-5460

6. 给新节点分配哈希槽

[root@localhost /]# /usr/local/redis/bin/redis-trib.rb reshard 10.60.44.105:7037
# 分配多少槽点给新节点
How many slots do you want to move (from 1 to 16384)? 1000
# 哪个是接受节点?(填入新节点的 id)
What is the receiving node ID? 3f2c74e5888907c494b8b728210175144657f218
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
# 从所有主节点中随机选取
Source node #1: all

7. 查看分配槽后的集群节点信息

3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201081749 12 connected 0-332 5461-5794 10923-11255
396e92e2e8207be6a4a93e29fd16670656477131 10.60.44.105:7036 master - 0 1498201080733 9 connected 5795-10922
135173619dfc7bdbef98f5d5f07d6b1fcd6474dc 10.60.44.105:7035 master - 0 1498201082755 3 connected 11256-16383
1baa876789f68ed2e273ab7cb1d4e954fa7fc60c 10.60.44.105:7034 master - 0 1498201078714 11 connected 333-5460

增加一个从节点

在原有的集群之上为其中一个主节点(7037)添加一个新的从节点(7038),需要开启新的从节点,并将此节点添加进集群中,详细如下描述:

1. 创建节点需要的相关文件(文件夹、配置文件)

[root@localhost /]# mkdir /usr/local/redis-cluster/7038

2. 拷贝并修改配置文件

将配置文件中的 7036 字符串,全部替换为 7038,此处不再累述

[root@localhost /]# cp /usr/local/redis-cluster/7036/redis.conf  /usr/local/redis-cluster/7038/

3. 启动新创建的节点

[root@localhost /]# /usr/local/redis/bin/redis-server /usr/local/redis-cluster/7038/redis.conf

4. 将新节点添加进集群中

# 参数一:所要添加的新节点 ip 和端口;参数二:存在的集群中的任意在线节点 ip 和端口
[root@localhost /]# redis-trib.rb add-node 10.60.44.105:7038 10.60.44.105:7034

成功后打印信息如下:

>>> Adding node 10.60.44.105:7038 to cluster 10.60.44.105:7034
>>> Performing Cluster Check (using node 10.60.44.105:7034)
............... 省略
>>> Send CLUSTER MEET to node 10.60.44.105:7038 to make it join the cluster.
[OK] New node added correctly.

5. 查看添加新节点后的集群节点信息

9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 master - 0 1498201399078 0 connected
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255
.......

6. 将端口为 7038 的节点置为 7037 端口的从节点

[root@localhost /]# redis-cli -c -h 10.60.44.105 -p 7038 cluster replicate 3f2c74e5888907c494b8b728210175144657f218

7. 查看设置为从节点后的集群节点信息

9cc99dc2e2721d6712c55e293c21c7f3b9c2f95c 10.60.44.105:7038 slave 3f2c74e5888907c494b8b728210175144657f218 0 1498201731111 12 connected
3f2c74e5888907c494b8b728210175144657f218 10.60.44.105:7037 master - 0 1498201398374 12 connected 0-332 5461-5794 10923-11255
.......

删除一个主节点

删除集群中端口为 7037 的主节点,填入集群中集群中任意节点 ip 端口和所要删除节点的 id。(需要先将所拥有的槽分配到其他的主节点)

[root@localhost /]# usr/local/redis/bin/redis-trib.rb del-node 10.60.44.105:7034 3f2c74e5888907c494b8b728210175144657f218

删除一个从节点

同理得主节点

五、集群测试

模拟 oom(Out Of Meomery)

redis-cli debug oom

模拟宕机

redis-cli debug segfault

模拟 hang

redis-cli -p 6379 DEBUG sleep 30

参考资料:

www.cnblogs.com/hjwublog/p/… blog.csdn.net/cfl20121314… www.cnblogs.com/wuxl360/p/5… www.redis.cn/topics/clus… wiki.jikexueyuan.com/project/all…