我这里是在同一台宿主机上搭建的,宿主机用的是阿里云的服务器。
一、编写一个redis-cluster.tmpl文件
下载一个redis,我下载的版本是5.0.5的,复制里面的redis.conf文件,将它重命名为redis-cluster.tmpl,为了看起来简洁,我删掉了里面的注释部分。
#bind 127.0.0.1
protected-mode no
port ${PORT}
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /data/redis
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
cluster-enabled yes
cluster-config-file nodes-${PORT}.conf
cluster-node-timeout 15000
cluster-announce-ip 120.24.163.90
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
redis-cluster.tmpl中主要注意修改这几个配置为你自己的配置:
#把bind注释掉
#bind 127.0.0.1
protected-mode no
port ${PORT}
daemonize no
dir /data/redis
appendonly yes
#如果是yes,表示启用集群,否则以单例模式启动
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
#你宿主机的ip
cluster-announce-ip 120.24.163.90
cluster-announce-port ${PORT}
#这里'1${PORT}'的意思是,例如端口是7000,一般cluster-announce-bus-port 端口是在port的基础上加1000
cluster-announce-bus-port 1${PORT}
二、开放端口
我的是阿里云服务器,所以开配置安全组,开放7000~7005端口以及17000至17005端口。(这里不知道怎样配置安全组的自行百度,不再展开)
一般配置了就基本是成功了的,如果想要确认一下,可以在别的机器上telnet一下试一下,注意telnet的格式是“telnet ip 端口”,ip和端口之间是空格隔开,不是冒号。
三、新建redis目录,所有命令在当前路径下执行就可以了
三、创建docker内部网络
由于此处所有redis实例运行在同一台宿主机,而redis-cluster之间需要通信,所以需要创建docker network
# 创建docker内部网络
docker network create redis-cluster-net
四、创建 master 和 slave 文件夹并生成配置文件,用于存放配置文件redis.conf以及redis数据
# 创建 master 和 slave 文件夹
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
mkdir -p ./$ms/$port/ && mkdir -p ./$ms/$port/data \
&& PORT=$port envsubst < ./redis-cluster.tmpl > ./$ms/$port/redis.conf;
done;
五、运行docker redis 的 master 和 slave 实例
# 运行docker redis 的 master 和 slave 实例
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
docker run -d -p $port:$port -p 1$port:1$port \
-v $PWD/$ms/$port/redis.conf:/data/redis.conf \
-v $PWD/$ms/$port/data:/data/redis \
--restart always --name redis-$ms-$port --net redis-cluster-net \
redis redis-server /data/redis.conf;
done;
六、组装masters : slaves 节点参数
# 组装masters : slaves 节点参数
matches=""
for port in `seq 7000 7005`; do
ms="master"
if [ $port -ge 7003 ]; then
ms="slave"
fi
matches=$matches$(docker inspect --format '{{(index .NetworkSettings.Networks "redis-cluster-net").IPAddress}}' "redis-$ms-${port}"):${port}" ";
done;
八、安装redis,等会我们需要用redis-cli来创建集群
https://redis.io/download
九、查看每个Redis节点的host
输入 docker network inspect redis-cluster-net命令查看我们上面创建的叫做redis-cluster-net的docker内部网络
十、启动节点
src/redis-cli --cluster create 172.20.0.2:7000 172.20.0.3:7001 172.20.0.4:7002 172.20.0.5:7003 172.20.0.6:7004 172.20.0.7:7005 --cluster-replicas 1
如果redis集群设置了密码则在后面加上 -a,例如
src/redis-cli --cluster create 172.20.0.2:7000 172.20.0.3:7001 172.20.0.4:7002 172.20.0.5:7003 172.20.0.6:7004 172.20.0.7:7005 --cluster-replicas 1 -a passwd123
十一、java代码里配置节点信息
十二、集群搭建好之后我们可以在别的机器上使用redis-cli连上去试试看能不能用