使用Docker部署
准备
- 安装Docker
- 下载Redis镜像:docker pull redis
- 下载Ruby镜像:docker pull ruby
创建
- 新建文件夹:mkdir first-redis-cluster
- 自定义集群中节点通信网络:docker network create redis-net
- 编写脚本create.sh创建集群(本例中使用从7000到7006的7个端口号,最小Redis Cluster集群应包含6个节点,3主3从,实现高可用):
#!/bin/bash
for port in `seq 7000 7006`; do
mkdir -p ./${port}/conf && PORT=${port} envsubst < ./first-redis-cluster.conf > ./${port}/conf/redis.conf && mkdir -p ./${port}/data;
done
逐个修改各端口的 redis.conf 配置文件,主要涉及下列条目(以7000为例):
port 7000
pidfile /var/run/redis_7000.pid
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
requirepass your_redis_password
masterauth master-password
注意:还需隐藏“NETWORK”下“bind”行内容(否则从本机或外部连接node时会出现“Connection refused/reset by peer”报错)。
- 编写脚本start.sh启动各redis container:
#!/bin/bash
for port in `seq 7000 7006`; do
docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /first-redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /first-redis-cluster/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf;
done
- 运行脚本(需先行修改各脚本文件操作权限:chmod -R 777 filename.sh)
./create.sh
./start.sh
- 查看各redis container运行情况:docker ps | grep redis
- 进入容器:docker exec -it container_id sh
- 创建集群:
- <方法一>
redis-cli --cluster create 120.0.0.1:7000 120.0.0.1:7001 120.0.0.1:7002 120.0.0.1:7003 120.0.0.1:7004 120.0.0.1:7005 120.0.0.1:7006 --cluster-replicas 1
- <方法二>
- 进入redis:redis-cli -h 120.0.0.1 -p 7000
120.0.0.1:7000> AUTH your_redis_password OK
- 集群中节点握手,创建集群:
120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7001 OK 120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7002 OK 120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7003 OK 120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7004 OK 120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7005 OK 120.0.0.1:7000> CLUSTER MEET 120.0.0.1 7006 OK 120.0.0.1:7000> CLUSTER INFO cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:7 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:6 cluster_stats_messages_ping_sent:164187 cluster_stats_messages_pong_sent:165404 cluster_stats_messages_sent:329591 cluster_stats_messages_ping_received:165403 cluster_stats_messages_pong_received:164173 cluster_stats_messages_meet_received:1 cluster_stats_messages_fail_received:1 cluster_stats_messages_received:329578
- 编写脚本addSlots.sh为master nodes分配slots:
#!/bin/bash
# node1
n=0
for ((i=n;i<=5461;i++))
do
redis-cli -h 120.0.0.1 -p 7000 -a your_redis_password CLUSTER ADDSLOTS $i
done
# node2
n=5461
for ((i=n;i<=10922;i++))
do
redis-cli -h 120.0.0.1 -p 7001 -a your_redis_password CLUSTER ADDSLOTS $i
done
# node3
n=10923
for ((i=n;i<=16383;i++))
do
redis-cli -h 120.0.0.1 -p 7002 -a your_redis_password CLUSTER ADDSLOTS $i
done
- 编写脚本addSlaves.sh为master nodes分配slaves:
#!/bin/bash
# node1
redis-cli -h 10.200.207.121 -p 7003 -a your_redis_password CLUSTER REPLICATE node_id_node1
redis-cli -h 10.200.207.121 -p 7006 -a your_redis_password CLUSTER REPLICATE node_id_node1
# node2
redis-cli -h 10.200.207.121 -p 7004 -a your_redis_password CLUSTER REPLICATE node_id_node2
# node3
redis-cli -h 10.200.207.121 -p 7005 -a your_redis_password CLUSTER REPLICATE node_id_node3
- 运行脚本,完成集群搭建(需先行修改各脚本文件操作权限:chmod -R 777 filename.sh)
./addSlots.sh
./addSlaves.sh
查看集群中各节点:
120.0.0.1:7000> CLUSTER NODES
node_id_node1 120.0.0.1:7000@17000 myself,master - 0 1613723470603 1 connected 0-5460
node_id_node2 120.0.0.1:7001@17001 master - 0 1613723469600 3 connected 10923-16383
node_id_node3 120.0.0.1:7002@17002 master - 0 1613723469600 6 connected 5461-10922
node_id_node4 120.0.0.1:7003@17003 slave node_id_node1 0 1613723470502 1 connected
node_id_node5 120.0.0.1:7004@17004 slave node_id_node2 0 1613723471104 3 connected
node_id_node6 120.0.0.1:7005@17005 slave node_id_node3 0 1613723469000 6 connected
node_id_node7 120.0.0.1:7006@17006 slave node_id_node1 0 1613723469601 1 connected
手动部署
配置前请确保已在当前环境下正确安装基本工具。
准备
- 创建各端口对应的文件夹(本例中使用从7000到7005的6个端口号)
mkdir 7000 7001 7002 7003 7004 7005
- 修改各端口的 redis.conf 配置文件,主要涉及下列条目:
port 7000
pidfile /var/run/redis_7000.pid
appendonly yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
requirepass your_redis_password
masterauth master-password
注意:还需隐藏“NETWORK”下“bind”行内容(否则从本机或外部连接node时会出现“Connection refused/reset by peer”报错)。
- 拷贝(“cp /root/redis-5.0.8/utils/redis_init_script /etc/init.d/redis_7000”),并修改各节点运行文件“vi /etc/init.d/redis_7000”:
REDISPORT=7000
EXEC=/root/redis-5.0.8/src/redis-server
CLIEXEC=/root/redis-5.0.8/src/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/redis/${REDISPORT}/redis.conf"
- 逐个启动各节点
sudo /etc/init.d/redis_7000 start
创建
查看各节点运行情况
ps -ef | grep redis
各节点连接测试
连接:
/root/redis-5.0.8/src/redis-cli -h 120.0.0.1 -p 7000
测试:
120.0.0.1:7000> AUTH your_redis_password
OK
120.0.0.1:7000> ping
pong
120.0.0.1:7000> keys *
(empty array)
创建集群
/root/redis-5.0.8/src/redis-cli --cluster create 120.0.0.1:7000 120.0.0.1:7001 120.0.0.1:7002 120.0.0.1:7003 120.0.0.1:7004 120.0.0.1:7005 --cluster-replicas 1
查看集群信息
/root/redis-5.0.8/src/redis-cli -h 120.0.0.1 -p 7000 CLUSTER INFO
查看集群各节点信息
/root/redis-5.0.8/src/redis-cli -h 120.0.0.1 -p 7000 CLUSTER NODES