这已经是老话题了,实践…
安装redis
MAC: brew intall redis
创建节点
Redis支持集群最小的单位为6个实例,3个主节点,3个从节点
- 找到redis.conf目录
mkdir /usr/local/redis_cluster
cd /usr/local/redis_cluster
mkdir 7000 7001 7002 7003 7004 7005
- 复制redis.config到集群:
cp redis.conf /usr/local/redis_cluster/7000 cp redis.conf /usr/local/redis_cluster/7001 cp redis.conf /usr/local/redis_cluster/7002 cp redis.conf /usr/local/redis_cluster/7003 cp redis.conf /usr/local/redis_cluster/7004 cp redis.conf /usr/local/redis_cluster/7005
vim /usr/local/redis_cluster/7000
, 修改redis.confport 7000 //端口7000,7002,7003 bind 本机ip //默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群 daemonize yes //redis后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 cluster-enabled yes //开启集群,把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置,配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 15000 //请求超时,默认15秒,可自行设置 appendonly yes //aof日志开启,有需要就开启,它会每次写操作都记录一条日志
- 启动redis:
redis-server /usr/local/redis_cluster/7000/redis.conf redis-server /usr/local/redis_cluster/7001/redis.conf redis-server /usr/local/redis_cluster/7002/redis.conf redis-server /usr/local/redis_cluster/7003/redis.conf redis-server /usr/local/redis_cluster/7004/redis.conf redis-server /usr/local/redis_cluster/7005/redis.conf
- 检查所有启动的redis:
ps -ef | grep redis 510 88153 1 0 10:29AM ?? 0:02.43 redis-server 127.0.0.1:7000 [cluster] 510 88157 1 0 10:29AM ?? 0:02.45 redis-server 127.0.0.1:7001 [cluster] 510 88160 1 0 10:29AM ?? 0:02.44 redis-server 127.0.0.1:7003 [cluster] 510 88163 1 0 10:29AM ?? 0:02.44 redis-server 127.0.0.1:7002 [cluster] 510 88166 1 0 10:29AM ?? 0:02.43 redis-server 127.0.0.1:7004 [cluster] 510 88170 1 0 10:29AM ?? 0:02.46 redis-server 127.0.0.1:7005 [cluster]
准备集群运行环境,安装ruby & redis gem
brew intall ruby
gem install redis
搭建集群
- 将 github上redis源码 中的
src/redis-trib.rb
下载下来 - 启动集群
> redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7000 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7003 to 127.0.0.1:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003 replicates b736c44b26ccd082db034cf2c15c5f096b723da3 S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004 replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005 replicates 0f7e82858c0c5d97e84f879355c23296c762164d Can I set the above configuration? (type 'yes' to accept): yes >>> 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 127.0.0.1:7000) M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005 slots: (0 slots) slave replicates 0f7e82858c0c5d97e84f879355c23296c762164d M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003 slots: (0 slots) slave replicates b736c44b26ccd082db034cf2c15c5f096b723da3 S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004 slots: (0 slots) slave replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
检查集群是否运行正常
> redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> set test abc
-> Redirected to slot [6918] located at 127.0.0.1:7001
OK
127.0.0.1:7001>
redis-cli -h 127.0.0.1 -c -p 7005
127.0.0.1:7005> get test
-> Redirected to slot [6918] located at 127.0.0.1:7001
"abc"
127.0.0.1:7001>
redis-trib 集群工具
redis-trib.rb 还提供很多功能
> redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
> redis-trib.rb check 127.0.0.1:7005
>>> Performing Cluster Check (using node 127.0.0.1:7005)
S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005
slots: (0 slots) slave
replicates 0f7e82858c0c5d97e84f879355c23296c762164d
M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004
slots: (0 slots) slave
replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63
S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003
slots: (0 slots) slave
replicates b736c44b26ccd082db034cf2c15c5f096b723da3
M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002
slots:10923-16383 (5461 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.
redis集群的关闭与启动
touch ~/bin/redis-start-all
vim ~/bin/redis-all
加入内容
#!/bin/sh
redisAllStop(){
echo "stopping all redis..."
pkill -9 redis
echo "stopped all redis"
}
redisAllStart() {
echo "starting all redis..."
redis-server /usr/local/redis_cluster/7000/redis.conf
echo "started redis 127.0.0.1:7000"
redis-server /usr/local/redis_cluster/7001/redis.conf
echo "started redis 127.0.0.1:7001"
redis-server /usr/local/redis_cluster/7002/redis.conf
echo "started redis 127.0.0.1:7002"
redis-server /usr/local/redis_cluster/7003/redis.conf
echo "started redis 127.0.0.1:7003"
redis-server /usr/local/redis_cluster/7004/redis.conf
echo "started redis 127.0.0.1:7004"
redis-server /usr/local/redis_cluster/7005/redis.conf
echo "started redis 127.0.0.1:7005"
}
if [ -n $1 ]&&[ "$1" == "stop" ]
then
redisAllStop
exit
fi
if [ -n $1 ]&&[ "$1" == "start" ]
then
redisAllStart
exit
fi
redis-all start
开启集群,redis-all stop
关闭集群
多台node上redis集群
这个例子都是在一台node上搭建的,如果你需要在多个node上搭建,只需要把redis.config里面bind
的本机ip变成所有node可以通讯的ip, 然后在每台node上启动对应的redis实例,最后在其中一台node上通过redis-trib create
来创建集群就可以了