使用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 ~]$
上述命令说明几点信息:
- 通过6379实例连接6380实例成功,说明基于之前的网络配置,redis容器之间可以通过容器名相互连接(当然,也可以使用配置的ip地址);
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.
此时重新启动所有节点,即可。
本文完