【Redis集群实战】Redis 以及 Redis Sentinel 的 Docker部署
Redis 基本说明
这里我是用的是docker。
既然使用docker那么就需要配置两个组件
一个 Redis 一个 Redis Sentinel
我们可以使用 docker-compose 来启动一组 docker
安装 docker-compose
下载 docker-compose 安装包
这里面直接从 github 下载。并且放在了 /usr/local/bin/docker-compose 目录下
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
改变 docker-compose 权限
sudo chmod +x /usr/local/bin/docker-compose
加入环境变量
export PATH="$PATH:/usr/local/bin"
source ~/.bashrc
验证安装
docker-compose --version
出现 以下提示代表安装成功
docker-compose --version
docker-compose 配置说明
version: '3.9'
services:
redis-master:
image: redis:latest
container_name: redis-master
volumes:
- ./redis/master.conf:/usr/local/etc/redis/redis.conf
- ./redis-data:/data
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
ports:
- "6379:6379"
sentinel1:
image: redis:latest
container_name: sentinel1
volumes:
- ./sentinel/sentinel1.conf:/usr/local/etc/redis/sentinel.conf
command: ["redis-sentinel", "/usr/local/etc/redis/sentinel.conf"]
ports:
- "26379:26379"
这里 服务名 sentinel1 和 容器名 一样 有什么区别呢?
同一台服务器,容器名称必须唯一,但是服务名称只需要保证同一个docker-compose中唯一即可。但是需要确保两个docker-compose文件在不同目录中。
参考文章:docker-compose服务名称和容器名称区别
volumes 参数
docker 作为容器,可以理解为一台模拟器,那么我们启动了一个容器,他的接口 他的配置都是在容器里的。我们需要对外进行映射。
一般使用 冒号 【:】 隔开,前面代表真实服务器 ,后面代表容器。
比如端口,前面代表服务器端口,后面代表容器端口。
这里的volumes 就是配置文件映射。前面代表 服务器真实地址,后面代表 容器内的位置。
可以通过换行来配置多个
其他配置
./redis/master.conf
port 6379
bind 0.0.0.0
protected-mode no
appendonly yes
./sentinel/sentinel1.conf
port 26379
bind 0.0.0.0
sentinel monitor redis-master 192.168.1.220 6379 2
sentinel down-after-milliseconds redis-master 5000
sentinel parallel-syncs redis-master 1
sentinel failover-timeout redis-master 10000
启动
docker-compose up -d
使用
docker ps
查看启动情况
排错
我的直接上来就启动错了。是因为配置文件莫名其妙 port 变成了 rt
我们可以使用
docker-compose logs
来看启动日志
sentinel1 | 1:X 20 Nov 2024 06:32:07.561 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. 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.
sentinel1 | 1:X 20 Nov 2024 06:32:07.561 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
sentinel1 | 1:X 20 Nov 2024 06:32:07.561 * Redis version=7.4.1, bits=64, commit=00000000, modified=0, pid=1, just started
sentinel1 | 1:X 20 Nov 2024 06:32:07.561 * Configuration loaded
sentinel1 | 1:X 20 Nov 2024 06:32:07.561 * monotonic clock: POSIX clock_gettime
sentinel1 | 1:X 20 Nov 2024 06:32:07.562 * Running mode=sentinel, port=26379.
sentinel1 | 1:X 20 Nov 2024 06:32:07.562 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
sentinel1 | 1:X 20 Nov 2024 06:32:07.562 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Is a directory
sentinel1 | 1:X 20 Nov 2024 06:32:07.562 * Sentinel ID is 0042b19b706b21ddfce786a6753080d31cb84cad
redis-master |
redis-master | *** FATAL CONFIG FILE ERROR (Redis 7.4.1) ***
redis-master | Reading the configuration file, at line 2
redis-master | >>> 'rt 6379'
redis-master | Bad directive or wrong number of arguments
这里说到了我的配置文件配置错误。
修改后启动成功。
slave 配置
port 6379
bind 0.0.0.0
protected-mode no
slaveof 192.168.1.220 6379 # 这里配置主服务器
appendonly yes
其他配置同上,不过注意自己的配置文件名
使用 redis-cli 检查服务器配置
INFO replication
# Replication
role:master
connected_slaves:1 #连接成功
slave0:ip=192.168.1.221,port=6379,state=online,offset=155,lag=0
master_failover_state:no-failover
master_replid:7f44403bedc3c754e6078de5d33fe5c59068236d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:155
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:154
测试故障转移
在 Virtual Box 关掉网卡后
服务断掉了。
从其他服务器查看信息
可以看到 master服务器变味了 222
> INFO replication
# Replication
role:slave
master_host:192.168.1.222
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:63983
slave_repl_offset:63983
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5ab549112334c05c91c67d129bec1c3e501ef842
master_replid2:7f44403bedc3c754e6078de5d33fe5c59068236d
master_repl_offset:63983
second_repl_offset:40577
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:16
repl_backlog_histlen:63968