环境准备
节点名称 | 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
参考