使用docker快速搭建redis集群

环境准备

节点名称 ip地址
redis-node1 192.168.130.20
redis-node2 192.168.130.19
redis-node3 192.168.130.21
redis-node4 192.168.130.20
redis-node5 192.168.130.19
redis-node6 192.168.130.21

安装docker

安装redis集群

最小群集至少需要包含三个主节点,这里启动一个包含三个主节点和三个从节点的六个节点群集。这里只有三台机器 我们公用一下。

master节点配置

创建目录(node1、node2、 node3)

mkdir -p /root/redis-cluster/6379/data
mkdir -p /root/redis-cluster/6379/config
mkdir -p /root/redis-cluster/6379/log
touch /root/redis-cluster/6379/log/redis.log  && chmod 777 /root/redis-cluster/6379/log/redis.log 

编写配置文件

cd /root/redis-cluster/6379/config
vi redis.conf

内容如下

#保护模式
protected-mode no

requirepass rs1234

masterauth rs1234

#端口
port 6379

#需要修改为 reids_{port}.pid 的形式
pidfile /var/run/redis_6379.pid 

## 数据目录
dir "/data"

 #开启AOF日志 指定持久化方式
appendonly yes

 #开启集群
cluster-enabled yes

#配置redis自动生成的集群配置文件名。确保同一集群中运行的各redis实例该配置文件不要重名。
cluster-config-file nodes-6379.conf 

#超时时间
cluster-node-timeout 5000 

salve节点配置

创建目录( node4、node5、node6)

mkdir -p /root/redis-cluster/6380/data
mkdir -p /root/redis-cluster/6380/config
mkdir -p /root/redis-cluster/6380/log
touch /root/redis-cluster/6380/log/redis.log && chmod 777 /root/redis-cluster/6380/log/redis.log 

编写配置文件 设置密码

cd /root/redis-cluster/6380/config
vi redis.conf
#保护模式
protected-mode no

requirepass rs1234

masterauth rs1234

#端口
port 6380

#需要修改为 reids_{port}.pid 的形式
pidfile /var/run/redis_6380.pid 


## 数据目录
dir "/data"

 #开启AOF日志 指定持久化方式
appendonly yes

 #开启集群
cluster-enabled yes

#配置redis自动生成的集群配置文件名。确保同一集群中运行的各redis实例该配置文件不要重名。
cluster-config-file nodes-6380.conf 

#超时时间
cluster-node-timeout 5000 

启动所有节点

node1

docker rm -f redis-node1

docker run -d --net=host --privileged=true --name redis-node1 \
-v /root/redis-cluster/6379/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6379/data:/data   \
redis:5.0.4 /etc/redis.conf

node4

docker rm -f redis-node4

docker run -d --net=host --privileged=true --name redis-node4 \
-v /root/redis-cluster/6380/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6380/data:/data   \
redis:5.0.4 /etc/redis.conf

node2

docker rm -f redis-node2

docker run -d --net=host --privileged=true --name redis-node2 \
-v /root/redis-cluster/6379/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6379/data:/data   \
redis:5.0.4 /etc/redis.conf

node5

docker rm -f redis-node5

docker run -d --net=host --privileged=true --name redis-node5 \
-v /root/redis-cluster/6380/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6380/data:/data   \
redis:5.0.4 /etc/redis.conf

node3

docker rm -f redis-node3

docker run -d --net=host --privileged=true --name redis-node3 \
-v /root/redis-cluster/6379/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6379/data:/data   \
redis:5.0.4 /etc/redis.conf

node6

docker rm -f redis-node6

docker run -d --net=host --privileged=true --name redis-node6 \
-v /root/redis-cluster/6380/config/redis.conf:/etc/redis.conf   \
-v /root/redis-cluster/6380/data:/data   \
redis:5.0.4 /etc/redis.conf

创建集群

其中cluster-replicas 1 代表一个master后有几个slave,1代表为1个slave节点,node1~3为master node4~6为slave,ip+port顺序不能乱

docker exec -it redis-node1 sh
redis-cli -a rs1234 --cluster create 192.168.130.20:6379 192.168.130.20:6380 192.168.130.19:6379 192.168.130.19:6380  192.168.130.21:6379 192.168.130.21:6380 --cluster-replicas 1

如果外网要访问 则不能用内网ip

docker exec -it redis-node1 redis-cli  -a rs1234 --cluster create 47.242.209.116:6379 47.242.209.116:6380 47.242.140.195:6379 47.242.140.195:6380  8.210.133.161:6379 8.210.133.161:6380 --cluster-replicas 1

然后再修改node1、node2、node3的/root/redis-cluster/xxxx/data/nodes-6379.conf里的内网ip,再重启node1、node2、node3

输出信息

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.130.19:6380 to 192.168.130.20:6379
Adding replica 192.168.130.21:6380 to 192.168.130.19:6379
Adding replica 192.168.130.20:6380 to 192.168.130.21:6379
M: 50c6ee00e873c8c60d6bdb03b26d132984a1e967 192.168.130.20:6379
   slots:[0-5460] (5461 slots) master
S: 23c0582497bc3b65be14912d46b0a65d364a8c50 192.168.130.20:6380
   replicates 87b956229fb8a24afc35c1d3c382848a7fa33f35
M: af6cbd0b67ce0ceeec22746de8f533015b13798b 192.168.130.19:6379
   slots:[5461-10922] (5462 slots) master
S: 7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 192.168.130.19:6380
   replicates 50c6ee00e873c8c60d6bdb03b26d132984a1e967
M: 87b956229fb8a24afc35c1d3c382848a7fa33f35 192.168.130.21:6379
   slots:[10923-16383] (5461 slots) master
S: 0636fac961529a907b816b0bc0d9bfaaa22c52c0 192.168.130.21:6380
   replicates af6cbd0b67ce0ceeec22746de8f533015b13798b
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 192.168.130.20:6379)
M: 50c6ee00e873c8c60d6bdb03b26d132984a1e967 192.168.130.20:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 0636fac961529a907b816b0bc0d9bfaaa22c52c0 192.168.130.21:6380
   slots: (0 slots) slave
   replicates af6cbd0b67ce0ceeec22746de8f533015b13798b
S: 7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 192.168.130.19:6380
   slots: (0 slots) slave
   replicates 50c6ee00e873c8c60d6bdb03b26d132984a1e967
M: 87b956229fb8a24afc35c1d3c382848a7fa33f35 192.168.130.21:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: af6cbd0b67ce0ceeec22746de8f533015b13798b 192.168.130.19:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 23c0582497bc3b65be14912d46b0a65d364a8c50 192.168.130.20:6380
   slots: (0 slots) slave
   replicates 87b956229fb8a24afc35c1d3c382848a7fa33f35
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered

验证集群

进入node1

docker exec -it redis-node1 /bin/bash
redis-cli -c -a rs1234
127.0.0.1:6379> cluster nodes
0636fac961529a907b816b0bc0d9bfaaa22c52c0 192.168.130.21:6380@16380 slave af6cbd0b67ce0ceeec22746de8f533015b13798b 0 1608289060160 6 connected
7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 192.168.130.19:6380@16380 slave 50c6ee00e873c8c60d6bdb03b26d132984a1e967 0 1608289059661 4 connected
87b956229fb8a24afc35c1d3c382848a7fa33f35 192.168.130.21:6379@16379 master - 0 1608289059159 5 connected 10923-16383
af6cbd0b67ce0ceeec22746de8f533015b13798b 192.168.130.19:6379@16379 master - 0 1608289059000 3 connected 5461-10922
50c6ee00e873c8c60d6bdb03b26d132984a1e967 192.168.130.20:6379@16379 myself,master - 0 1608289059000 1 connected 0-5460
23c0582497bc3b65be14912d46b0a65d364a8c50 192.168.130.20:6380@16380 slave 87b956229fb8a24afc35c1d3c382848a7fa33f35 0 1608289060662 5 connected

数据自动分配到node2,连接也转移到了node2

127.0.0.1:6379> set name kk
-> Redirected to slot [5798] located at 192.168.130.19:6379
OK
192.168.130.19:6379> get name
"kk"

验证主从切换

docker stop redis-node1
docker exec -it redis-node4 /bin/bash
root@kont001ecs:/data# redis-cli -c -a rs1234 -p 6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> clustrer nodes
(error) ERR unknown command `clustrer`, with args beginning with: `nodes`,
127.0.0.1:6380> cluster nodes
0636fac961529a907b816b0bc0d9bfaaa22c52c0 192.168.130.21:6380@16380 slave af6cbd0b67ce0ceeec22746de8f533015b13798b 0 1608291356000 6 connected
7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 192.168.130.19:6380@16380 master - 0 1608291355000 7 connected 0-5460
87b956229fb8a24afc35c1d3c382848a7fa33f35 192.168.130.21:6379@16379 master - 0 1608291356848 5 connected 10923-16383
af6cbd0b67ce0ceeec22746de8f533015b13798b 192.168.130.19:6379@16379 master - 0 1608291355844 3 connected 5461-10922
50c6ee00e873c8c60d6bdb03b26d132984a1e967 192.168.130.20:6379@16379 master,fail - 1608291323928 1608291322000 1 disconnected
23c0582497bc3b65be14912d46b0a65d364a8c50 192.168.130.20:6380@16380 myself,slave 87b956229fb8a24afc35c1d3c382848a7fa33f35 0 1608291355000 2 connected

可以看到node1,fail
可以看到node6,由slave变成了master

重新启动node1,再查看集群状态node1已经变成了slave

docker start redis-node1
docker exec -it redis-node4 /bin/bash
root@kont001ecs:/data# redis-cli -c -a rs1234 -p 6380
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> cluster nodes
0636fac961529a907b816b0bc0d9bfaaa22c52c0 192.168.130.21:6380@16380 slave af6cbd0b67ce0ceeec22746de8f533015b13798b 0 1608291658836 6 connected
7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 192.168.130.19:6380@16380 master - 0 1608291658335 7 connected 0-5460
87b956229fb8a24afc35c1d3c382848a7fa33f35 192.168.130.21:6379@16379 master - 0 1608291658536 5 connected 10923-16383
af6cbd0b67ce0ceeec22746de8f533015b13798b 192.168.130.19:6379@16379 master - 0 1608291659538 3 connected 5461-10922
50c6ee00e873c8c60d6bdb03b26d132984a1e967 192.168.130.20:6379@16379 slave 7ad25bc5ce312e38e18ec8b2bdb09f2fb7e482ef 0 1608291659839 7 connected
23c0582497bc3b65be14912d46b0a65d364a8c50 192.168.130.20:6380@16380 myself,slave 87b956229fb8a24afc35c1d3c382848a7fa33f35 0 1608291659000 2 connected

参考

https://redis.io/topics/cluster-tutorial

猜你喜欢

转载自blog.csdn.net/kk3909/article/details/111937760
今日推荐