使用docker镜像快速搭建redis集群开发环境

使用docker镜像快速搭建redis集群开发环境

准备镜像 #

docker以及docker-compose的安装以及加速镜像的配置不在此处说明。windows系统上直接安装客户端即可完成docker及docker-compose的安装。在centOS 8中安装docker服务以及docker-compose可以参考下面的文章:

运行如下命令检查docker和docker-compose的安装情况:

 1[xx@CentOS8 ~]$ docker version
 2Client: Docker Engine - Community
 3 Version:           20.10.17
 4 API version:       1.41
 5 Go version:        go1.17.11
 6 Git commit:        100c701
 7 Built:             Mon Jun  6 23:03:11 2022
 8 OS/Arch:           linux/amd64
 9 Context:           default
10 Experimental:      true
11Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
12[xx@CentOS8 ~]$ docker-compose version
13Docker Compose version v2.10.0

centOS 8 通过命令systemctl start docker来运行docker服务。

本次搭建使用的redis 官方镜像,版本7.0.4:

1docker pull redis:7.0.4

创建自定义docker网络模式 #

1docker network create redis-net --subnet 192.168.10.0/24 --gateway=192.168.10.1 --driver bridge

上述命令创建了一个桥接网络,使用192.168.10.0网段。

创建桥接网络后,方便后续在编写docker-compose配置时,为每个redis节点指定ipv4_address

--subnet参数必须要指定,不指定的话,docker默认为其分配一个网段。但此时,docker-compose配置里便不能手动指定ipv4_address了。

编写配置文件 #

为了搭建redis集群,我们需要运行6个redis服务端容器,组成一个最简单的3主3从的集群结构。我们需要自定义redis的配置(服务端口及映射ip)、持久化数据。因此,你需要在“合适的地方”新建一个文件夹,用于容器运行时候的 挂载目录。

此次搭建我在centOS的家目录下新建了redis-cluster目录,作为容器运行的工作目录,目录结构如下:

1|-- redis-cluster
2    |-- docker-compose.yml  
3    |-- redis-cluster.tmp   # redis集群配置文件模板
4    |-- redis-6379             #节点1
5        |-- conf                    # 配置文件目录         
6            |-- redis.conf       # 配置文件
7        |--data                     # redis数据目录
8    |-- .... 以下省略...

redis节点主要配置如下信息:

  • port:节点端口;
  • requirepass:添加访问认证;
  • masterauth:如果主节点开启了访问认证,从节点访问主节点需要认证;
  • protected-mode:保护模式,默认值 yes,即开启。开启保护模式以后,需配置 bind ip 或者设置访问密码;关闭保护模式,外部网络可以直接访问;
  • daemonize:是否以守护线程的方式启动(后台启动),默认 no;
  • appendonly:是否开启 AOF 持久化模式,默认 no;
  • cluster-enabled:是否开启集群模式,默认 no;
  • cluster-config-file:集群节点信息文件;
  • cluster-node-timeout:集群节点连接超时时间;
  • cluster-announce-ip:集群节点 IP,填写宿主机的 IP(通过ifconfig获得),用于宿主机访问redis容器;
  • cluster-announce-port:集群节点映射端口;
  • cluster-announce-bus-port:集群节点总线端口,redis集群节点端口+10000。

可以使用shell命令快速创建节点的配置文件及目录结构,为此,我们需要一个redis.conf的模板文件redis-cluster.tmp,内容如下:

port ${PORT}
cluster-enabled yes
cluster-config-file node-${PORT}.conf
cluster-node-timeout 5000
appendonly yes
daemonize no
protected-mode no
requirepass 123456
masterauth 123456
pidfile /var/run/redis-${PORT}.pid
cluster-announce-ip 10.211.55.3
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}

随即可以通过shell命令,快速创建上述目录结构及配置文件(当前工作目录为redis-cluster):

1for port in `seq 6379 6384`; do \
2  mkdir -p redis-${port}/conf \
3  && PORT=${port} envsubst < redis-cluster.tmp> redis-${port}/conf/redis.conf \
4  && mkdir -p redis-${port}/data;\
5done

编写docker-compose脚本 #

使用docker-compose脚本是YAML风格,可以替代docker run命令,通过配置文件之间启动容器,并且可以更加直观、不易出错地配置容器使用的镜像、网络等内容。

本次搭建的docker-compose.yml脚本内容如下:

  1version: "3.7"
  2
  3x-image:
  4   &default-image
  5        redis:7.0.4
  6
  7networks:
  8  redis-net:
  9    name: redis-net
 10
 11services:
 12  redis-6379:
 13    image: *default-image
 14    container_name: redis-6379
 15    volumes:
 16      - ./redis-6379/conf/redis.conf:/usr/local/etc/redis/redis.conf
 17      - ./redis-6379/data:/data
 18    ports:
 19      - 6379:6379
 20      - 16379:16379
 21    command:
 22      redis-server /usr/local/etc/redis/redis.conf
 23    networks:
 24      redis-net:
 25         ipv4_address: 192.168.10.9
 26
 27  redis-6380:
 28    image: *default-image
 29    container_name: redis-6380
 30    volumes:
 31      - ./redis-6380/conf/redis.conf:/usr/local/etc/redis/redis.conf
 32      - ./redis-6380/data:/data
 33    ports:
 34      - 6380:6380
 35      - 16380:16380
 36    command:
 37      redis-server /usr/local/etc/redis/redis.conf
 38    networks:
 39      redis-net:
 40        ipv4_address: 192.168.10.10
 41
 42  redis-6381:
 43    image: *default-image
 44    container_name: redis-6381
 45    volumes:
 46      - ./redis-6381/conf/redis.conf:/usr/local/etc/redis/redis.conf
 47      - ./redis-6381/data:/data
 48    ports:
 49      - 6381:6381
 50      - 16381:16381
 51    command:
 52      redis-server /usr/local/etc/redis/redis.conf
 53    networks:
 54      redis-net:
 55        ipv4_address: 192.168.10.11
 56
 57  redis-6382:
 58    image: *default-image
 59    container_name: redis-6382
 60    volumes:
 61      - ./redis-6382/conf/redis.conf:/usr/local/etc/redis/redis.conf
 62      - ./redis-6382/data:/data
 63    ports:
 64      - 6382:6382
 65      - 16382:16382
 66    command:
 67      redis-server /usr/local/etc/redis/redis.conf
 68    networks:
 69      redis-net:
 70        ipv4_address: 192.168.10.12
 71
 72  redis-6383:
 73    image: *default-image
 74    container_name: redis-6383
 75    volumes:
 76      - ./redis-6383/conf/redis.conf:/usr/local/etc/redis/redis.conf
 77      - ./redis-6383/data:/data
 78    ports:
 79      - 6383:6383
 80      - 16383:16383
 81    command:
 82      redis-server /usr/local/etc/redis/redis.conf
 83    networks:
 84          redis-net:
 85            ipv4_address: 192.168.10.13
 86
 87  redis-6384:
 88    image: *default-image
 89    container_name: redis-6384
 90    volumes:
 91      - ./redis-6384/conf/redis.conf:/usr/local/etc/redis/redis.conf
 92      - ./redis-6384/data:/data
 93    ports:
 94      - 6384:6384
 95      - 16384:16384
 96    command:
 97      redis-server /usr/local/etc/redis/redis.conf
 98    networks:
 99      redis-net:
100        ipv4_address: 192.168.10.16

运行脚本并创建集群 #

以上工作完成之后,便可以通过docker-compose运行容器。

1docker-compose up -d

-d参数指示后台运行。

若脚本运行无误,即可看到docker已经成功运行6个redis容器,但是此时集群还没有搭建起来。

可以通过docker container ls查看正在运行的容器。

可以通过docker network inspect redis-net查看在文章开头创建的网络信息:

 1[xx@centOS8 ~]$ docker network inspect redis-net
 2[
 3    {
 4        "Name": "redis-net",
 5        "Id": "0a1f6b466e5af068f42f64968ba39b0b6bf08df972b913d1f7060128b015c10f",
 6        "Created": "2022-08-26T09:51:21.510880934+08:00",
 7        "Scope": "local",
 8        "Driver": "bridge",
 9        "EnableIPv6": false,
10        "IPAM": {
11            "Driver": "default",
12            "Options": {},
13            "Config": [
14                {
15                    "Subnet": "192.168.10.0/24",
16                    "Gateway": "192.168.10.1"
17                }
18            ]
19        },
20        "Internal": false,
21        "Attachable": false,
22        "Ingress": false,
23        "ConfigFrom": {
24            "Network": ""
25        },
26        "ConfigOnly": false,
27        "Containers": {
28            "1c89a8b2e1eaf33f4664873b726bdbfce3ebdc9ae4bbdb3e3326db8f3501f57e": {
29                "Name": "redis-6383",
30                "EndpointID": "3f4ad0bec008b14f6799bb341651f18846f5ae468d80296c265424f708079f32",
31                "MacAddress": "02:42:c0:a8:0a:0d",
32                "IPv4Address": "192.168.10.13/24",
33                "IPv6Address": ""
34            },
35            "2a259630bb33d10b274d4ab1a1f50850c445bb299dbbbde55710ae59bc578f68": {
36                "Name": "redis-6379",
37                "EndpointID": "2f57c1a336d8a08606eb9f0d1077da2cdc8e6744a147040b840c78a42ebdc2a3",
38                "MacAddress": "02:42:c0:a8:0a:09",
39                "IPv4Address": "192.168.10.9/24",
40                "IPv6Address": ""
41            },
42            "7ace535271e764554e08c4528a713657002c543f30f183454410f7d4b9e92d9d": {
43                "Name": "redis-6381",
44                "EndpointID": "89507334eef9eb9a907b6f5edeca8aee01fcace9982dc41a1e620c8c0d41113c",
45                "MacAddress": "02:42:c0:a8:0a:0b",
46                "IPv4Address": "192.168.10.11/24",
47                "IPv6Address": ""
48            },
49            "a0f6dc1fe2520f43ad3babdac39b782be7b277bc368138d65593e2bf3a04214c": {
50                "Name": "redis-6380",
51                "EndpointID": "1b0320a540085673eebda450036d386e50eb168d7221e09471bed1074fb685d2",
52                "MacAddress": "02:42:c0:a8:0a:0a",
53                "IPv4Address": "192.168.10.10/24",
54                "IPv6Address": ""
55            },
56            "a2308807a6502efce0a3e316df5c1a261e529b81613d29ef52a045e17eb87b13": {
57                "Name": "redis-6384",
58                "EndpointID": "fab8518518d19e2308eaa309aef8665e708ffa0e37a2e5ba9200a620b04e7108",
59                "MacAddress": "02:42:c0:a8:0a:10",
60                "IPv4Address": "192.168.10.16/24",
61                "IPv6Address": ""
62            },
63            "a42b71abb59b5267dcf77bf592afbe2fefa89191348a796b9b44e08fdf239a49": {
64                "Name": "redis-6382",
65                "EndpointID": "15755c329085da197f7afc5c5e0fbe8ecd1e9cd8fabc83fd3918d82653f7112b",
66                "MacAddress": "02:42:c0:a8:0a:0c",
67                "IPv4Address": "192.168.10.12/24",
68                "IPv6Address": ""
69            }
70        },
71        "Options": {},
72        "Labels": {}
73    }
74]

可以看到,返回的container域列出了刚才运行脚本所创建的容器的详细信息。说明,docker-compose的网络配置生效了。

剩下来的工作就是创建集群了。

运行命令docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6380 -p 6380 -a 123456来查看redis以及集群的状态:

1[xx@centOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6380 -p 6380 -a 123456 set foo bar
2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
3(error) CLUSTERDOWN Hash slot not served
4[xx@centOS8 ~]$

上述命令说明几点信息:

  1. 通过6379实例连接6380实例成功,说明基于之前的网络配置,redis容器之间可以通过容器名相互连接(当然,也可以使用配置的ip地址);
  2. set foo bar命令失败,错误信息显示,集群的槽并没有分配成功

更直观地,可以通过docker exec -it redis-6379 /usr/local/bin/redis-cli -a 123456 --cluster check redis-6379:6379检查集群信息:

 1[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -a 123456 --cluster check redis-6379:6379
 2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
 3redis-6379:6379 (6466d336...) -> 0 keys | 0 slots | 0 slaves.
 4[OK] 0 keys in 1 masters.
 50.00 keys per slot on average.
 6>>> Performing Cluster Check (using node redis-6379:6379)
 7M: 6466d33686f7c629d70d19ad31fe5d77ec3a6879 redis-6379:6379
 8   slots: (0 slots) master
 9[OK] All nodes agree about slots configuration.
10>>> Check for open slots...
11>>> Check slots coverage...
12[ERR] Not all 16384 slots are covered by nodes.

说明,集群确实还没成功搭建。

接下来,我们通过redis-cli --cluster create命令创建集群。

使用docker exec -it redis-6379 bash进入6379节点,其中,redis-6379可以替换成本次搭建中任何其他节点。

执行命令:

1redis-cli -a 123456 --cluster create \
2192.168.10.9:6379 192.168.10.10:6380 192.168.10.11:6381 \
3192.168.10.12:6382 192.168.10.13:6383 192.168.10.14:6384 \
4--cluster-replicas 1

其中指明了6个节点,并且--cluster-replicas 1说明为一主一从的结构,6个节点构成了3主3从的集群架构。

上述命令将产生如下输出:

 1Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
 2>>> Performing hash slots allocation on 6 nodes...
 3Master[0] -> Slots 0 - 5460
 4Master[1] -> Slots 5461 - 10922
 5Master[2] -> Slots 10923 - 16383
 6Adding replica 192.168.10.12:6382 to 192.168.10.9:6379
 7Adding replica 192.168.10.13:6383 to 192.168.10.10:6380
 8Adding replica 192.168.10.14:6384 to 192.168.10.11:6381
 9M: 6466d33686f7c629d70d19ad31fe5d77ec3a6879 192.168.10.9:6379
10   slots:[0-5460] (5461 slots) master
11M: f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f 192.168.10.10:6380
12   slots:[5461-10922] (5462 slots) master
13M: 0321e838b8b9a179612d2c3fa21ff544723598b6 192.168.10.11:6381
14   slots:[10923-16383] (5461 slots) master
15S: 5ec421c294038ff745c0b637bbe426d182ad32cc 192.168.10.12:6382
16   replicates 6466d33686f7c629d70d19ad31fe5d77ec3a6879
17S: 84fbb314009f34ad8a1a2ca19746dc31866d009f 192.168.10.13:6383
18   replicates f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f
19S: c124a8eaafd919015ab618edf8441a7b925d8a2f 192.168.10.14:6384
20   replicates 0321e838b8b9a179612d2c3fa21ff544723598b6
21Can I set the above configuration? (type 'yes' to accept): yes
22>>> Nodes configuration updated
23>>> Assign a different config epoch to each node
24>>> Sending CLUSTER MEET messages to join the cluster
25Waiting for the cluster to join
26..
27>>> Performing Cluster Check (using node 192.168.10.9:6379)
28M: 6466d33686f7c629d70d19ad31fe5d77ec3a6879 192.168.10.9:6379
29   slots:[0-5460] (5461 slots) master
30   1 additional replica(s)
31S: c124a8eaafd919015ab618edf8441a7b925d8a2f 10.211.55.3:6384
32   slots: (0 slots) slave
33   replicates 0321e838b8b9a179612d2c3fa21ff544723598b6
34M: 0321e838b8b9a179612d2c3fa21ff544723598b6 10.211.55.3:6381
35   slots:[10923-16383] (5461 slots) master
36   1 additional replica(s)
37S: 84fbb314009f34ad8a1a2ca19746dc31866d009f 10.211.55.3:6383
38   slots: (0 slots) slave
39   replicates f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f
40S: 5ec421c294038ff745c0b637bbe426d182ad32cc 10.211.55.3:6382
41   slots: (0 slots) slave
42   replicates 6466d33686f7c629d70d19ad31fe5d77ec3a6879
43M: f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f 10.211.55.3:6380
44   slots:[5461-10922] (5462 slots) master
45   1 additional replica(s)
46[OK] All nodes agree about slots configuration.
47>>> Check for open slots...
48>>> Check slots coverage...
49[OK] All 16384 slots covered.

从上述输出可以看到,6379、6380、6381为3个主节点,6382、6383、6384分别设置为它们的从节点。

集群的16384个槽被分配到6379、6380和6381三个主节点上。

至此,集群的搭建工作大抵完成了,还需要做一些验证工作。

验证集群可用性 #

运行docker exec -it redis-6379 /usr/local/bin/redis-cli --cluster check redis-6379:6379 -a 123456查看集群信息:

1[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli --cluster check redis-6379:6379 -a 123456
2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
3redis-6379:6379 (6466d336...) -> 0 keys | 5461 slots | 1 slaves.
410.211.55.3:6381 (0321e838...) -> 0 keys | 5461 slots | 1 slaves.
510.211.55.3:6380 (f8bc3dcb...) -> 0 keys | 5462 slots | 1 slaves.

10.211.55.3 为宿主机ip。

运行docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 cluster nodes查看集群节点信息:

1[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 cluster nodes
2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
36466d33686f7c629d70d19ad31fe5d77ec3a6879 10.211.55.3:6379@16379 myself,master - 0 1661484250000 1 connected 0-5460
4c124a8eaafd919015ab618edf8441a7b925d8a2f 10.211.55.3:6384@16384 slave 0321e838b8b9a179612d2c3fa21ff544723598b6 0 1661484248833 3 connected
50321e838b8b9a179612d2c3fa21ff544723598b6 10.211.55.3:6381@16381 master - 0 1661484250857 3 connected 10923-16383
684fbb314009f34ad8a1a2ca19746dc31866d009f 10.211.55.3:6383@16383 slave f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f 0 1661484250353 2 connected
75ec421c294038ff745c0b637bbe426d182ad32cc 10.211.55.3:6382@16382 slave 6466d33686f7c629d70d19ad31fe5d77ec3a6879 0 1661484249341 1 connected
8f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f 10.211.55.3:6380@16380 master - 0 1661484249000 2 connected 5461-10922

分别运行

docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 info replication

docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6382 -p 6382 -a 123456 info replication

查看单个节点的信息:

 1[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 info replication
 2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
 3# Replication
 4role:master
 5connected_slaves:1
 6slave0:ip=192.168.10.1,port=6382,state=online,offset=2520,lag=1
 7master_failover_state:no-failover
 8master_replid:75b44c0a227fa29a6faf0be53aba63a47e615fa0
 9master_replid2:0000000000000000000000000000000000000000
10master_repl_offset:2534
11second_repl_offset:-1
12repl_backlog_active:1
13repl_backlog_size:1048576
14repl_backlog_first_byte_offset:1
15repl_backlog_histlen:2534
16[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6382 -p 6382 -a 123456 info replication
17Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
18# Replication
19role:slave
20master_host:10.211.55.3
21master_port:6379
22master_link_status:up
23master_last_io_seconds_ago:7
24master_sync_in_progress:0
25slave_read_repl_offset:2814
26slave_repl_offset:2814
27slave_priority:100
28slave_read_only:1
29replica_announced:1
30connected_slaves:0
31master_failover_state:no-failover
32master_replid:75b44c0a227fa29a6faf0be53aba63a47e615fa0
33master_replid2:0000000000000000000000000000000000000000
34master_repl_offset:2814
35second_repl_offset:-1
36repl_backlog_active:1
37repl_backlog_size:1048576
38repl_backlog_first_byte_offset:1
39repl_backlog_histlen:2814

接下来,进入某个节点,进行一些简单的读写操作,

 1[xx@CentOS8 ~]$ docker exec -it redis-6382 bash
 2root@e7c5c96e43c3:/data# redis-cli -c -p 6382 -a 123456
 3Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
 4127.0.0.1:6382> setex foo 1000 bar
 5-> Redirected to slot [12182] located at 10.211.55.3:6381
 6OK
 710.211.55.3:6381> setex hello 1000 redis
 8-> Redirected to slot [866] located at 10.211.55.3:6379
 9OK
1010.211.55.3:6379> set hey 1000 you
11-> Redirected to slot [10667] located at 10.211.55.3:6380
12(error) ERR syntax error
1310.211.55.3:6380> setex hey 1000 you
14OK
1510.211.55.3:6380> get foo
16-> Redirected to slot [12182] located at 10.211.55.3:6381
17"bar"
1810.211.55.3:6381> ttl foo
19(integer) 938
2010.211.55.3:6381> keys *
211) "foo"
2210.211.55.3:6381> get hello
23-> Redirected to slot [866] located at 10.211.55.3:6379
24"redis"
2510.211.55.3:6379> keys *
261) "hello"
2710.211.55.3:6379>

提示:redis-cli -c-c参数指示使用集群模式,上述交互日志可以看出,集群基本上是可用的。

接下来,我们模拟一个主节点下线,看看集群是否能够作出响应。前面说过,6379-->6382、6380-->6383、6381-->6384分别为3对主从节点,此时强制停止6380节点:

docker container stop redis-6380

接下来,使用docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 cluster nodes查看节点信息:

1[xx@CentOS8 ~]$ docker exec -it redis-6379 /usr/local/bin/redis-cli -c -h redis-6379 -p 6379 -a 123456 cluster nodes
2Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
36466d33686f7c629d70d19ad31fe5d77ec3a6879 10.211.55.3:6379@16379 myself,master - 0 1661486336000 1 connected 0-5460
4c124a8eaafd919015ab618edf8441a7b925d8a2f 10.211.55.3:6384@16384 slave 0321e838b8b9a179612d2c3fa21ff544723598b6 0 1661486336865 3 connected
50321e838b8b9a179612d2c3fa21ff544723598b6 10.211.55.3:6381@16381 master - 0 1661486335556 3 connected 10923-16383
684fbb314009f34ad8a1a2ca19746dc31866d009f 10.211.55.3:6383@16383 master - 0 1661486335556 7 connected 5461-10922
75ec421c294038ff745c0b637bbe426d182ad32cc 10.211.55.3:6382@16382 slave 6466d33686f7c629d70d19ad31fe5d77ec3a6879 0 1661486336000 1 connected
8f8bc3dcb0ea4a93733d16c18eba7a92cee8d4a8f 10.211.55.3:6380@16380 master,fail - 1661486269058 1661486267032 2 disconnected

可以看到,6380节点的状态为fail,并且,其从节点6383升级为主节点了,集群状态正常。

 1[parallels@CentOS8 redis-cluster]$ docker exec -it redis-6382 bash
 2root@e7c5c96e43c3:/data# redis-cli -c -h redis-6383 -p 6383 -a 123456
 3Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
 4redis-6383:6383> info replication
 5# Replication
 6role:master
 7connected_slaves:0
 8master_failover_state:no-failover
 9master_replid:7c94538adb23f4c95ea6085af34ca40a6c20ca00
10master_replid2:b6f2d9ac88cd6b4cdb097464ec271a1b96647ed2
11master_repl_offset:5328
12second_repl_offset:5329
13repl_backlog_active:1
14repl_backlog_size:1048576
15repl_backlog_first_byte_offset:1
16repl_backlog_histlen:5328
17redis-6383:6383> keys *
18(empty array)
19redis-6383:6383>

windows WSL主从同步失败的处理办法 #

在windosw上,按照上文思路搭建redis集群的过程中,可能会遇到主从节点同步失败的错误,具体错误信息为:

1Failed trying to load the MASTER synchronization DB from disk: No such file or directory

在这之前,通过docker-compose启动容器的过程中,还可以看到一句警告信息:

1WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

先处理这个警告。由于windows下docker使用WSL,所以这个配置和WSL有关,在C:\Users\<username>下创建.wslconfig文件,写入以下内容:

[wsl2]
kernelCommandLine = "sysctl.vm.overcommit_memory=1"

然后重启wsl和docker:

1wsl --shtdown

此时,docker的启动警告应该消失了。

接着,在所有节点的配置文件中,增加一行配置:

repl-diskless-load on-empty-db  # Use diskless load only when it is completely safe.

此时重新启动所有节点,即可。


本文完

参考 #