redis cluster 集群搭建(踩坑)
我是启动了两台centos7的虚拟机,当然也可以在一台完成
1. 在两台服务器上源码安装redis
cd /usr/local
mkdir redis
wget http://download.redis.io/releases/redis-5.0.5.tar.gz(我使用的是最新版的)
tar xzf redis-5.0.5.tar.gz
cd redis-5.0.5
make
2. 在两台服务器上启动redis服务
cd /usr/local
mkdir redis_cluster
cd redis_cluster
mkdir 7000 7001 7002(在另外一台服务器上创建7003 7004 7005)
// 复制配置文件到每一个目录
cp /usr/local/redis/redis-5.0.5/redis.conf /usr/local/redis_cluster/7000
// 修改配置文件
vim /usr/local/redis_cluster/7000/redis.conf
修改内容如下
daemonize yes // 后台运行
pidfile /var/run/redis_7000.pid
port 7000 // 运行端口号
cluster-enabled yes // 开启集群 把注释#去掉
cluster-config-file nodes_7000.conf // 集群的配置 配置文件首次启动自动生成
cluster-node-timeout 5000 // 请求超时,设置5秒即可
appendonly yes // aof日志开启,有需要就开启,它会每次写操作都记录一条日志
logfile redis_7000.log
bind 192.168.1.112 // 绑定当前服务器的IP,否则的话在集群通信的时候会有问题(ip以自己的情况填写)
dbfilename dump_7000.rdb
appendfilename "appendonly_7000.aof"
3. 修改完成后,启动redis试一下
cd /usr/local/redis_cluster/7000
/usr/local/redis/redis-5.0.5/src/redis-server redis.conf
ps -ef | grep redis // 查看redis是否启动,端口是否正确
4. 复制7000端口的配置文件到7001、7002,并修改配置文件
cd /usr/local/redis_cluster
cp 7000/redis.conf 7001/
vim 7001/redis.conf
// 替换7000为7001
:%s/7000/7001g
5. 编写启动,停止redis的脚本
cd /usr/local/redis_cluster
// 启动脚本
vim start-cluster.sh
// 脚本内容
#!/bin/bash
cd /usr/local/redis_cluster
cd ./7000
/usr/local/redis/redis-5.0.5/src/redis-server redis.conf
cd ../7001
/usr/local/redis/redis-5.0.5/src/redis-server redis.conf
cd ../7002
/usr/local/redis/redis-5.0.5/src/redis-server redis.conf
echo "success"
// 停止脚本
vim stop-cluster.sh
#!/bin/bash
/usr/local/redis/redis-5.0.5/src/redis-cli -c -h 192.168.1.112 -p 7000 shutdown
/usr/local/redis/redis-5.0.5/src/redis-cli -c -h 192.168.1.112 -p 7001 shutdown
/usr/local/redis/redis-5.0.5/src/redis-cli -c -h 192.168.1.112 -p 7002 shutdown
echo "success"
// 给脚本执行权限
chmod a+x start-cluster.sh stop-cluster.sh
6. 以上步骤,在另一台服务器(192.168.1.113)中执行,端口号:7003,7004,7005
7. 执行启动脚本,启动两台服务器的6个redis服务
8. 启动集群
/usr/local/redis/redis-5.0.5/src/redis-cli --cluster create 192.168.1.112:7000 192.168.1.112:7001 192.168.1.112:7002 192.168.1.113:7003 192.168.1.113:7004 192.168.1.113:7005 --cluster-replicas 1
/**
这个命令在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave redis 会打印出一份预想中的配置给你看,
如果你觉得没问题的话, 就可以输入 yes , redis 就会将这份配置应用到集群当中,让各个节点开始互相通讯
**/
之后会输出集群中各个节点的槽位信息
/**
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
....
>>> Performing Cluster Check (using node 192.168.1.113:7000)
M: ca0a0c2f50da44773ab69a75db5c83ae40312377 192.168.1.113:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 5f8d498ff8696fec391fdf77875d980016cac5ee 192.168.1.112:7005
slots: (0 slots) slave
replicates ca0a0c2f50da44773ab69a75db5c83ae40312377
M: ddaf494812a08a49761e12f158980039116c867d 192.168.1.113:7001
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: a07f139436dca2c8131fdac39403bcc7753138ef 192.168.1.112:7003
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 64dad85ba0bb0800e5bd6533f8eacc7988c3aca6 192.168.1.112:7004
slots: (0 slots) slave
replicates ddaf494812a08a49761e12f158980039116c867d
S: 1f43b2b8f4fb730f5cee5ac598862ade42ce257f 192.168.1.113:7002
slots: (0 slots) slave
replicates a07f139436dca2c8131fdac39403bcc7753138ef
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
**/
9. 使用集群
/usr/local/redis/redis-5.0.5/src/redis-cli -c -h 192.168.1.112 -p 7000
redis 192.168.1.112:7000> set foo bar
-> Redirected to slot [12182] located at 192.168.1.112:7002
OK
...
...
至此,一切顺利的话,redis集群就可以使用了
遇到的坑
- 网上很多教程,都使用ruby脚本redis-trib.rb执行集群操作,需要安装ruby环境,gem工具等,但是新版redis-cli中已经集成了集群操作
/usr/local/redis/redis-5.0.5/src/redis-trib.rb create --replicas 1 192.168.1.112:7000 192.168.1.112:7001 192.168.1.112:7002 192.168.1.113:7003 192.168.1.113:7004 192.168.1.113:7005
/**
WARNING: redis-trib.rb is not longer available!
You should use redis-cli instead.
All commands and features belonging to redis-trib.rb have been moved
to redis-cli.
In order to use them you should call redis-cli with the --cluster
option followed by the subcommand name, arguments and options.
Use the following syntax:
redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]
Example:
redis-cli --cluster create 192.168.1.113:7000 192.168.1.113:7001 192.168.1.113:7002 192.168.1.112:7003 192.168.1.112:7004 192.168.1.112:7005 --cluster-replicas 1
To get help about all subcommands, type:
redis-cli --cluster help
**/
- 配置文件中,bind ip,一定要绑定本机的ip地址,如果是127.0.0.1,跨机可能会无法meet
- 两台虚拟机中的redis版本要一致,我就是因为一个5版本,一个3版本,导致无法都meet不了
- 如果使用集群的时候报错
(error) MOVED 11469 192.168.163.249:7002
// 应该是你没有启动集群模式(即缺少了那个"-c"):
redis-cli -c -h yourhost -p yourpost
- redis集群创建的时候,一直卡在Waiting for the cluster to join …上、一直读进度条
机器没有开放redis集群总线端口。
集群总线端口是redis客户端连接的端口+10000。
netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.1.113:17000 0.0.0.0:* LISTEN 21078/redis-server
tcp 0 0 192.168.1.113:17001 0.0.0.0:* LISTEN 21080/redis-server
tcp 0 0 192.168.1.113:17002 0.0.0.0:* LISTEN 21088/redis-server
tcp 0 0 192.168.1.113:7000 0.0.0.0:* LISTEN 21078/redis-server
tcp 0 0 192.168.1.113:7001 0.0.0.0:* LISTEN 21080/redis-server
tcp 0 0 192.168.1.113:7002 0.0.0.0:* LISTEN 21088/redis-server
// 直接关闭防火墙解决问题
systemctl stop firewalld.service
systemctl disable firewalld
- 跨机复制文件
scp -r /usr/local/redis_cluster 192.168.1.113:/usr/local/
然后输入192.168.1.113的密码就可以了