一、前言
搭建Redis集群的教程很多,介绍的也很全面,但是大多数 还是使用Ruby脚本的版本,安装Ruby本身也不是一件简单的事情,redis-5.0.0之后已经将 redis-trib.rb 脚本的功能全部集成到 redis-cli之中了,本章基于redis-cli 的 --cluster 来搭建集群,然后还会指出一些细节问题(坑),提醒大家注意,希望可以有所帮助。
二、Ubuntu下的Redis安装
mkdir redis # 创建一个目录
cd redis #进入创建的目录
wget http://download.redis.io/releases/redis-5.0.0.tar.gz #下载新版本Redis
tar -zxvf redis-5.0.0.tar.gz #解压之
cd redis-5.0.0 #进入解压之后的目录
make && make install #编译安装
注意:make && make install 此处经常报错 大概由于 gcc和make工具的版本问题等等,笔者有一个编译安装完成之后的版本,解决不了的话可以留言邮箱,笔者看到后会发送压缩包,直接拷贝到linux下 解压就可以直接使用了。
百度网盘地址:链接:https://pan.baidu.com/s/1-hxqjSb8Zj9lx852EQVHSw 密码:clzt
三、准备配置文件,创建多个 Redis节点
Redis要求 一主一从的搭配至少要 六个节点,形成三对主从,我们需要修改配置文件,然后分别用不同的Redis配置文件启动Redis即可。
mkdir cluster # 用于存放 redis.conf .rdb .aof nodes-xxxx.conf
cd cluster
mkdir 7000 #端口为 7000的配置文件目录 后续还会有 7001等
cp redis.conf 7000 #伪命令 将 redis根目录下的配置文件 拷贝一份到 新建的 7000目录下
nano redis.conf #开始修改配置文件
配置文件主要修改以下部分
daemonize yes # redis后台运行
pidfile /var/run/redis_7000.pid #需要修改为 reids_{port}.pid 的形式
port 7000 #端口
cluster-enabled yes #开启集群
cluster-config-file nodes_7000.conf #集群的配置文件 nodes_{port}.conf的形式
cluster-node-timeout 5000 #超时时间 5s够了
appendonly yes #开启AOF日志
注意:还需要修改如下基目录 将各个Redis节点的 .rdb .aof nodes-xxxx.conf 文件分开存放,不然大家都默认目录会造成错乱
dir ./ #默认当前根目录
dir ./cluster/7000 #将基目录修改为 具体的子目录
注意:多个Redis节点应该位于同一个局域网之中,需要修改 IP绑定
bind 127.0.0.1 #默认绑定本地地址,导致其它地方不可远程访问
bind 172.17.10.89 #修改为局域网中的IP地址,其他节点可通过局域网IP访问
同上,依次创建 7001-7005,将 7000的地方修改掉
四、启动各个Redis节点
在 redis-5.0.0目录下执行命令
redis-server cluster/7000/redis.conf
依次启动各个Redis节点
使用如下命令查看是否启动
ps -ef | grep redis
root 23973 1 0 10:04 ? 00:00:06 redis-server 172.17.10.89:7001 [cluster]
root 23988 1 0 10:04 ? 00:00:06 redis-server 172.17.10.89:7002 [cluster]
root 24007 1 0 10:04 ? 00:00:07 redis-server 172.17.10.89:7003 [cluster]
root 24024 1 0 10:04 ? 00:00:07 redis-server 172.17.10.89:7004 [cluster]
root 24037 1 0 10:04 ? 00:00:07 redis-server 172.17.10.89:7005 [cluster]
root 24062 1 0 10:04 ? 00:00:07 redis-server 172.17.10.89:7006 [cluster]
root 25030 1 0 10:08 ? 00:00:06 redis-server 172.17.10.89:7007 [cluster]
五、使用 reids-cli 搭建 Redis集群
redis-cli --cluster create 172.17.10.89:7000 172.17.10.89:7001 172.17.10.89:7002 172.17.10.89:7003 172.17.10.89:7004 172.17.10.89:7005 --cluster-replicas 1
redis-cli --cluster help #查看操作集群的命令帮助
--cluster-replicas 1 命令的意思: 一主一从配置,六个节点就是 三主三从
使用如下命令创建集群的状态:
redis-cli --cluster check 172.17.10.89:7000 #填写任意节点即可 会带出所有的
六、新增节点
按照 三 中同样的方式新增一个 Redis节点 使用如下命令将其加入集群
redis-cli --cluster add-node {新节点IP}:{新节点端口} {任意集群节点IP}:{对应端口} #添加为主节点
--cluster-slave --cluster-master-id {对应的主节点ID} # 在上一条命令后面加上此行命令将新节点添加为 对应主节点的从节点
若是添加 从节点则立即可用了,添加的是 主节点的话,还需要 reshard 分配 slots
redis-cli --cluster check 172.17.10.89:7000 # 此命令查看 node id
输出:
S: 0762bce8fcb066a56719372456ca9cc253580c49 172.17.10.89:7000
slots: (0 slots) slave
replicates b6052ed88ff21523b6b054ef089d599b730cbc54
S: 55a5f8631302f36ca5ec2434b44e9d7f9185444e 172.17.10.89:7006
slots: (0 slots) slave
replicates bb19633369c2545aa3afec59564b04cef8c8c47b
S: 08d868857a5d1a22bdbd86d29b1b5f7867b3accd 172.17.10.89:7004
slots: (0 slots) slave
replicates b6052ed88ff21523b6b054ef089d599b730cbc54
S: 55e9beb850e4bb56a2238419788479373d22a87d 172.17.10.89:7003
slots: (0 slots) slave
replicates cd45a9b31de0606d968d3a6f66f43da2fae874f2
M: b6052ed88ff21523b6b054ef089d599b730cbc54 172.17.10.89:7005
slots:[0-5460] (5461 slots) master
2 additional replica(s)
M: bb19633369c2545aa3afec59564b04cef8c8c47b 172.17.10.89:7002
slots:[10923-16383] (5461 slots) master
2 additional replica(s)
S: 9b4bc41c00b89f38e25374165aa34b8b0f778697 172.17.10.89:7007
slots: (0 slots) slave
replicates bb19633369c2545aa3afec59564b04cef8c8c47b
M: cd45a9b31de0606d968d3a6f66f43da2fae874f2 172.17.10.89:7001
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
0762bce8fcb066a56719372456ca9cc253580c49 # node id
下面reshard
redis-cli --cluster reshard {新主节点IP}:{新主节点PORT}
之后按照提示操作即可
七、测试集群
redis-cli -c -h {IP} -p {PORT} # -c 表示连接集群节点
进行 读写操作时会根据 key计算出的slot,重新定位到 拥有该slot的节点,执行对应的命令。
只有 Master节点拥有 slot,读写都在 Master 节点进行
redis-cli -c -h 172.17.10.89 -p 7000
172.17.10.89:7000> set hi reids
-> Redirected to slot [16140] located at 172.17.10.89:7002
OK
172.17.10.89:7002> get hi
"reids"