Docker(3主3从)Redis集群配置

1.自定义网络

#创建自定义网络
[root@cautious cluster_data]# docker network create --subnet=172.18.0.0/16 redis_network
d7480fae6556e4fc822d241adec57c0b0a7edd7fb2e5559ae44d2cccea5589a0
 
#查看网络
[root@cautious cluster_data]# docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
9b67c8cca365   bridge          bridge    local
e6b812c742a6   host            host      local
5bf35d8be9c2   none            null      local
d7480fae6556   redis_network   bridge    local

#查看网络 redis_network是名字
[root@cautious cluster_data]# docker network inspect redis_network
[
    {
        "Name": "redis_network",
        "Id": "d7480fae6556e4fc822d241adec57c0b0a7edd7fb2e5559ae44d2cccea5589a0",
        "Created": "2024-07-26T17:03:50.957390994+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

2.创建配置文件

for port in $(seq 1 6); \
do \
mkdir -p /home/redis/cluster_data/node-${port}/conf
mkdir -p /home/redis/cluster_data/node-${port}/data
mkdir -p /home/redis/cluster_data/node-${port}/log
touch /home/redis/cluster_data/node-${port}/conf/cluster638${port}.conf
touch /home/redis/cluster_data/node-${port}/log/cluster638${port}.log
chmod 777 /home/redis/cluster_data/node-${port}/log/cluster638${port}.log
cat << EOF >/home/redis/cluster_data/node-${port}/conf/cluster638${port}.conf
port 638${port}
bind 0.0.0.0
protected-mode no
daemonize no
logfile "/etc/redis/logs/cluster638${port}.log"
pidfile /var/run/cluster638${port}.pid
dir /data
dbfilename dump638${port}.rdb
appendonly yes
appendfilename "appendonly638${port}.aof"
requirepass lzf666
masterauth lzf666
cluster-enabled yes
cluster-config-file nodes-638${port}.conf
cluster-node-timeout 5000
cluster-announce-ip 8.130.23.149
cluster-announce-port 638${port}
cluster-announce-bus-port 1638${port}
EOF
done

以端口6381的配置文件进行解析含义

# 集群配置文件的路径:conf存放配置文件  data存放数据  log存放日志
/home/redis/cluster_data/node-1


# 配置文件内容
# 节点端口
port 6381
# 解除只允许本地访问的限制
bind 0.0.0.0
# yes是设置redis后台启动,此处为no,因为守护进程系统会直接关机,容器则会启动就闪退
daemonize no
# 关闭保护模式
protected-mode no

# 日志文件
logfile "/etc/redis/logs/cluster6381.log"
# pid文件
pidfile /var/run/cluster6381.pid

# 数据文件存放的目录
dir /data
# 持久化RDB文件
dbfilename dump6381.rdb
# 允许AOF持久化
appendonly yes
# 持久化AOF文件
appendfilename "appendonly6381.aof"

# 添加访问认证
requirepass lzf666
# 如果主节点开启了访问认证,从节点访问主节点需要认证;此处建议设置与上述一致的密钥
masterauth lzf666

# 集群是否打开 yes打开
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes-6381.conf
# 集群节点连接超时时间
cluster-node-timeout 5000
# 集群节点IP,填写宿主机的IP;若是云服务器上部署,则需指定公网ip
cluster-announce-ip 8.130.23.149
# Redis集群节点映射端口(port)
cluster-announce-port 6381
# Redis集群节点总线端口(port+10000),用于与其它节点通信
cluster-announce-bus-port 16381

3.启动服务         

docker run -d --restart always -p 6381:6381 -p 16381:16381 --name redis6381 \
-v /home/redis/cluster_data/node-1/conf/cluster6381.conf:/etc/redis/cluster6381.conf \
-v /home/redis/cluster_data/node-1/log/cluster6381.log:/etc/redis/logs/cluster6381.log \
-v /home/redis/cluster_data/node-1/data:/data \
--net=redis_network --ip 172.18.0.11 redis:6.0.6 \
redis-server /etc/redis/cluster6381.conf
docker run -d --restart always -p 6382:6382 -p 16382:16382 --name redis6382 \
-v /home/redis/cluster_data/node-2/conf/cluster6382.conf:/etc/redis/cluster6382.conf \
-v /home/redis/cluster_data/node-2/log/cluster6382.log:/etc/redis/logs/cluster6382.log \
-v /home/redis/cluster_data/node-2/data:/data \
--net=redis_network --ip 172.18.0.12 redis:6.0.6 \
redis-server /etc/redis/cluster6382.conf
docker run -d --restart always -p 6383:6383 -p 16383:16383 --name redis6383 \
-v /home/redis/cluster_data/node-3/conf/cluster6383.conf:/etc/redis/cluster6383.conf \
-v /home/redis/cluster_data/node-3/log/cluster6383.log:/etc/redis/logs/cluster6383.log \
-v /home/redis/cluster_data/node-3/data:/data \
--net=redis_network --ip 172.18.0.13 redis:6.0.6 \
redis-server /etc/redis/cluster6383.conf
docker run -d --restart always -p 6384:6384 -p 16384:16384 --name redis6384 \
-v /home/redis/cluster_data/node-4/conf/cluster6384.conf:/etc/redis/cluster6384.conf \
-v /home/redis/cluster_data/node-4/log/cluster6384.log:/etc/redis/logs/cluster6384.log \
-v /home/redis/cluster_data/node-4/data:/data \
--net=redis_network --ip 172.18.0.14 redis:6.0.6 \
redis-server /etc/redis/cluster6384.conf
docker run -d --restart always -p 6385:6385 -p 16385:16385 --name redis6385 \
-v /home/redis/cluster_data/node-5/conf/cluster6385.conf:/etc/redis/cluster6385.conf \
-v /home/redis/cluster_data/node-5/log/cluster6385.log:/etc/redis/logs/cluster6385.log \
-v /home/redis/cluster_data/node-5/data:/data \
--net=redis_network --ip 172.18.0.15 redis:6.0.6 \
redis-server /etc/redis/cluster6385.conf
docker run -d --restart always -p 6386:6386 -p 16386:16386 --name redis6386 \
-v /home/redis/cluster_data/node-6/conf/cluster6386.conf:/etc/redis/cluster6386.conf \
-v /home/redis/cluster_data/node-6/log/cluster6386.log:/etc/redis/logs/cluster6386.log \
-v /home/redis/cluster_data/node-6/data:/data \
--net=redis_network --ip 172.18.0.16 redis:6.0.6 \
redis-server /etc/redis/cluster6386.conf

启动后查看

[root@cautious cluster_data]# docker ps
CONTAINER ID   IMAGE         COMMAND                   CREATED          STATUS          PORTS                                              NAMES
91598452bafa   redis:6.0.6   "docker-entrypoint.s…"   17 seconds ago   Up 17 seconds   0.0.0.0:6386->6379/tcp, 0.0.0.0:16386->16379/tcp   redis6386
3e5f4cc67c61   redis:6.0.6   "docker-entrypoint.s…"   23 seconds ago   Up 23 seconds   0.0.0.0:6385->6379/tcp, 0.0.0.0:16385->16379/tcp   redis6385
1a268eb016e0   redis:6.0.6   "docker-entrypoint.s…"   29 seconds ago   Up 29 seconds   0.0.0.0:6384->6379/tcp, 0.0.0.0:16384->16379/tcp   redis6384
75e6e5cf11bd   redis:6.0.6   "docker-entrypoint.s…"   35 seconds ago   Up 35 seconds   0.0.0.0:6383->6379/tcp, 0.0.0.0:16383->16379/tcp   redis6383
53a37c857494   redis:6.0.6   "docker-entrypoint.s…"   42 seconds ago   Up 41 seconds   0.0.0.0:6382->6379/tcp, 0.0.0.0:16382->16379/tcp   redis6382
2f1eeeeef816   redis:6.0.6   "docker-entrypoint.s…"   47 seconds ago   Up 47 seconds   0.0.0.0:6381->6379/tcp, 0.0.0.0:16381->16379/tcp   redis6381

4.通过redis-cli命令为6台机器构建集群关系

构建主从关系命令,可以选择其中一台机器来设置构建关系

#--cluster-replicas 1  表示为每一个Master创建一个Slave节点
[root@cautious cluster_data]# docker exec -it redis6381 /bin/bash
root@2f1eeeeef816:/data# redis-cli -a lzf666 --cluster create --cluster-replicas 1 172.18.0.11:6381 172.18.0.12:6382 172.18.0.13:6383 172.18.0.14:6384 172.18.0.15:6385 172.18.0.16:6386

 

 

5.链接进入6381作为切入点,查看并检验集群状态  

# 链接进入6381作为切入点,查看并检验集群状态
root@2f1eeeeef816:/data# redis-cli -p 6381 -a lzf666
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> ping
PONG

# 查看当前链接机器的信息
127.0.0.1:6381> info replication
# Replication
role:master         #主机
connected_slaves:1  #从机数量
slave0:ip=172.18.0.15,port=6385,state=online,offset=350,lag=1  #从机信息
master_replid:58639e64c0dde009dc9bd0e2953cec425d6743b5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:350
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:350

# 查看集群环境信息
127.0.0.1:6381> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:498
cluster_stats_messages_pong_sent:491
cluster_stats_messages_sent:989
cluster_stats_messages_ping_received:486
cluster_stats_messages_pong_received:498
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:989
# 查看集群拓扑图
127.0.0.1:6381> cluster nodes
c5b00df547940add230ada41d77dee081009e9be 172.18.0.11:6381@16381 myself,master - 0 1722012470000 1 connected 0-5460
6ba98615ba81ca58d462bab6320eef8b69d1ef6e 172.18.0.13:6383@16383 master - 0 1722012472097 3 connected 10923-16383
eb454d5449246e6e8026014214d4162e116e668b 172.18.0.16:6386@16386 slave 8ba8aafff990ad0ccba9b16a1a5063217061f17b 0 1722012471000 2 connected
8ba8aafff990ad0ccba9b16a1a5063217061f17b 172.18.0.12:6382@16382 master - 0 1722012471000 2 connected 5461-10922
fc1c50c9b62c23f5f86f6e0ad25478ac8f1e4ce2 172.18.0.15:6385@16385 slave c5b00df547940add230ada41d77dee081009e9be 0 1722012471094 1 connected
456732450b5692d2689545f41f6521bee0879d31 172.18.0.14:6384@16384 slave 6ba98615ba81ca58d462bab6320eef8b69d1ef6e 0 1722012471000 3 connected

 6.测试集群

1.对6381新增两个键Key测试,发现报错(一定注意槽位的范围区间,需要==路由到位== )

127.0.0.1:6381> set k1 v1
(error) MOVED 12706 106.15.66.190:6383
127.0.0.1:6381> get k1
(error) MOVED 12706 106.15.66.190:6383

 2.防止路由失效,可以加入参数-c,再次新增两个键Key测试

#先退出客户端,再次链接加入参数-c,优化路由
127.0.0.1:6381> quit
root@2f1eeeeef816:/data# redis-cli -p 6381 -a cm8932 -c
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6381> set k1 v1
-> Redirected to slot [12706] located at 172.18.0.13:6383
OK
172.18.0.13:6383> set k2 v2
-> Redirected to slot [449] located at 172.18.0.11:6381
OK
172.18.0.11:6381> set k3 v3
OK

 3.查看某个键Key该属于对应的槽位值

#cluster keyslot 键名称
172.18.0.11:6381> cluster keyslot k1
(integer) 12706
172.18.0.11:6381> cluster keyslot k2
(integer) 449
172.18.0.11:6381> cluster keyslot k3
(integer) 4576
172.18.0.11:6381> cluster keyslot A
(integer) 6373

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值