359 lines
11 KiB
Markdown
359 lines
11 KiB
Markdown
---
|
||
title: "CentOS7 安装 Redis 集群"
|
||
date: 2019-11-29T15:14:29+08:00
|
||
lastmod: 2019-11-29T15:14:29+08:00
|
||
tags: ["redis"]
|
||
categories: ["database"]
|
||
---
|
||
|
||
## 环境
|
||
- 操作系统: CentOS7.7,关闭 firewalld 和 selinux
|
||
- Redis: 5.0.6
|
||
- master 实例
|
||
- 10.0.4.110:6371
|
||
- 10.0.4.110:6372
|
||
- 10.0.4.110:6373
|
||
- slave 实例
|
||
- 10.0.4.111:6371
|
||
- 10.0.4.111:6372
|
||
- 10.0.4.111:6373
|
||
|
||
## 编译 redis server
|
||
- 在 CentOS7.7 测试服务器上下载、编译
|
||
```bash
|
||
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
|
||
tar xzf redis-5.0.6.tar.gz
|
||
cd redis-5.0.6
|
||
make
|
||
```
|
||
- 抽取安装文件
|
||
```bash
|
||
mkdir -p /opt/redis_cluster/{bin,conf}
|
||
cp src/{redis-server,redis-cli,redis-benchmark} /opt/redis_cluster/bin/
|
||
# redis-check-rdb 和 redis-check-aof 与 redis-server 校验值一致,无需复制
|
||
```
|
||
- 创建 /opt/redis_cluster/conf/redis.conf,常用配置如下
|
||
```bash
|
||
bind 0.0.0.0
|
||
protected-mode yes
|
||
tcp-backlog 511
|
||
timeout 3600
|
||
tcp-keepalive 300
|
||
daemonize no
|
||
supervised no
|
||
loglevel notice
|
||
always-show-logo no
|
||
save 900 1
|
||
save 300 10
|
||
save 60 10000
|
||
stop-writes-on-bgsave-error yes
|
||
rdbcompression yes
|
||
rdbchecksum yes
|
||
dbfilename dump.rdb
|
||
#masterauth "123456"
|
||
replica-serve-stale-data yes
|
||
replica-read-only yes
|
||
repl-diskless-sync no
|
||
repl-diskless-sync-delay 5
|
||
repl-disable-tcp-nodelay no
|
||
replica-priority 100
|
||
#requirepass "123456"
|
||
maxclients 10000
|
||
maxmemory 4294967296
|
||
maxmemory-policy volatile-lru
|
||
lazyfree-lazy-eviction no
|
||
lazyfree-lazy-expire no
|
||
lazyfree-lazy-server-del no
|
||
replica-lazy-flush no
|
||
appendonly no
|
||
appendfilename "appendonly.aof"
|
||
appendfsync everysec
|
||
no-appendfsync-on-rewrite no
|
||
auto-aof-rewrite-percentage 100
|
||
auto-aof-rewrite-min-size 64mb
|
||
aof-load-truncated yes
|
||
aof-use-rdb-preamble yes
|
||
lua-time-limit 5000
|
||
cluster-enabled yes
|
||
cluster-node-timeout 5000
|
||
slowlog-log-slower-than 10000
|
||
slowlog-max-len 128
|
||
latency-monitor-threshold 0
|
||
notify-keyspace-events ""
|
||
hash-max-ziplist-entries 512
|
||
hash-max-ziplist-value 64
|
||
list-max-ziplist-size -2
|
||
list-compress-depth 0
|
||
set-max-intset-entries 512
|
||
zset-max-ziplist-entries 128
|
||
zset-max-ziplist-value 64
|
||
hll-sparse-max-bytes 3000
|
||
stream-node-max-bytes 4096
|
||
stream-node-max-entries 100
|
||
activerehashing yes
|
||
client-output-buffer-limit normal 0 0 0
|
||
client-output-buffer-limit replica 256mb 64mb 60
|
||
client-output-buffer-limit pubsub 32mb 8mb 60
|
||
hz 10
|
||
dynamic-hz yes
|
||
aof-rewrite-incremental-fsync yes
|
||
rdb-save-incremental-fsync yes
|
||
```
|
||
- 创建 /opt/redis_cluster/redis@.service,配置如下
|
||
```ini
|
||
[Unit]
|
||
Description=Redis cluster -- node %i
|
||
After=network.target
|
||
|
||
[Service]
|
||
ExecStartPre=/usr/bin/ls -d /var/lib/redis_cluster/%i
|
||
ExecStart=/opt/redis_cluster/bin/redis-server /opt/redis_cluster/conf/redis.conf \
|
||
--daemonize no \
|
||
--port %i \
|
||
--pidfile /var/run/redis_%i.pid \
|
||
--logfile /var/log/redis_cluster/%i.log \
|
||
--dir /var/lib/redis_cluster/%i \
|
||
--cluster-config-file /var/lib/redis_cluster/%i/nodes.conf
|
||
ExecStop=/opt/redis_cluster/bin/redis-cli -h 127.0.0.1 -p %i shutdown
|
||
Restart=on-failure
|
||
RestartSec=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
## 部署
|
||
- 把测试机的 /opt/redis_cluster 目录复制到 10.0.4.110 和 10.0.4.111 上
|
||
```bash
|
||
scp -r /opt/redis_cluster 10.0.4.110:/opt/
|
||
scp -r /opt/redis_cluster 10.0.4.111:/opt/
|
||
```
|
||
- 在 10.0.4.110 和 10.0.4.111 上都执行以下操作
|
||
```bash
|
||
mv /opt/redis_cluster/redis@.service /usr/lib/systemd/system/
|
||
systemctl daemon-reload
|
||
mkdir -p /var/lib/redis_cluster/{6371..6373}
|
||
mkdir -p /var/log/redis_cluster
|
||
```
|
||
- 在 10.0.4.110 和 10.0.4.111 上配置实例开机启动
|
||
```bash
|
||
systemctl enable redis@6371
|
||
systemctl enable redis@6372
|
||
systemctl enable redis@6373
|
||
```
|
||
- 在 10.0.4.110 和 10.0.4.111 上启动全部实例
|
||
```bash
|
||
systemctl start redis@6371
|
||
systemctl start redis@6372
|
||
systemctl start redis@6373
|
||
```
|
||
|
||
## 配置集群
|
||
- 在 10.0.4.110 或 10.0.4.111 上创建集群,指定三个 master 实例
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli \
|
||
--cluster create 10.0.4.110:6371 10.0.4.110:6372 10.0.4.110:6373
|
||
```
|
||
- 输出如下图
|
||

|
||
- 同意配置,输入 "yes",回车后输出如下图
|
||

|
||
- 查看集群当前实例
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli -p 6371 cluster nodes
|
||
```
|
||
- 输出如下图
|
||

|
||
- 添加 slave 实例 10.0.4.111:6371,同步 master 10.0.4.110:6371
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli \
|
||
--cluster add-node 10.0.4.111:6371 10.0.4.110:6371 \
|
||
--cluster-slave \
|
||
--cluster-master-id 5be0edaf74d1eec50bbe675f9698397023a943b7
|
||
# 上述命令中,10.0.4.111:6371 是待添加实例,10.0.4.110:6371 是已存在集群中的任一实例
|
||
# --cluster-slave 指定添加 slave 实例
|
||
# --cluster-master-id 指定 10.0.4.110:6371 的 id,即本次添加实例的 master
|
||
```
|
||
- 输出如下图
|
||

|
||
- 添加 slave 实例 10.0.4.111:6372,同步 master 10.0.4.110:6372
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli \
|
||
--cluster add-node 10.0.4.111:6372 10.0.4.110:6371 \
|
||
--cluster-slave \
|
||
--cluster-master-id 96f2225fdd054d8a16b31726fd1eb0b66c612646
|
||
```
|
||
- 输出如下图
|
||

|
||
- 添加 slave 实例 10.0.4.111:6373,同步 master 10.0.4.110:6373
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli \
|
||
--cluster add-node 10.0.4.111:6373 10.0.4.110:6371 \
|
||
--cluster-slave \
|
||
--cluster-master-id cd60c238e66c8b4a31355bee4610444a47acef86
|
||
```
|
||
- 输出如下图
|
||

|
||
- 查看集群当前实例
|
||
```bash
|
||
/opt/redis_cluster/bin/redis-cli -p 6371 cluster nodes
|
||
```
|
||
- 输出如下图
|
||

|
||
|
||
## Docker 部署
|
||
- 安装 docker-ce,参考[这里](https://www.colben.cn/post/docker/#%E5%AE%89%E8%A3%85)
|
||
- 安装 docker-compose,参考[这里](https://www.colben.cn/post/docker/#Compose)
|
||
- 选择一个较大分区,创建 redis 集群数据目录和日志目录
|
||
```bsah
|
||
mkdir -p redis_cluster/{db,log}/{6371..6376}
|
||
```
|
||
|
||
- 在同级目录下创建 docker-compose.yml 文件,内容如下
|
||
```yml
|
||
version: "3.7"
|
||
|
||
services:
|
||
redis-6371:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6371
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6371
|
||
_CENV_maxmemory: 256MB
|
||
# master 和 slave 实例的密码必须一致,可都为空
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
# master 节点列表
|
||
MASTER_NODES: "127.0.0.1:6371 127.0.0.1:6372 127.0.0.1:6373"
|
||
# slave 节点列表
|
||
# 可以为空,表示没有 slave 节点
|
||
# 不为空时,数量必须与 master 节点数量一致,按顺序依次为 master 节点的从节点
|
||
SLAVE_NODES: "127.0.0.1:6374 127.0.0.1:6375 127.0.0.1:6376"
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6371
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6371
|
||
target: /var/log/redis
|
||
|
||
redis-6372:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6372
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6372
|
||
_CENV_maxmemory: 256MB
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6372
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6372
|
||
target: /var/log/redis
|
||
|
||
redis-6373:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6373
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6373
|
||
_CENV_maxmemory: 256MB
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6373
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6373
|
||
target: /var/log/redis
|
||
|
||
redis-6374:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6374
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6374
|
||
_CENV_maxmemory: 256MB
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6374
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6374
|
||
target: /var/log/redis
|
||
|
||
redis-6375:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6375
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6375
|
||
_CENV_maxmemory: 256MB
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6375
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6375
|
||
target: /var/log/redis
|
||
|
||
redis-6376:
|
||
image: harbor.colben.cn/general/alpine-redis
|
||
container_name: redis-6376
|
||
restart: on-failure
|
||
stop_grace_period: 1m
|
||
privileged: true
|
||
network_mode: "host"
|
||
environment:
|
||
_CENV_cluster-enabled: "yes"
|
||
_CENV_port: 6376
|
||
_CENV_maxmemory: 256MB
|
||
_CENV_masterauth: Pass_1234
|
||
_CENV_requirepass: Pass_1234
|
||
volumes:
|
||
- type: bind
|
||
source: ./redis_cluster/db/6376
|
||
target: /var/lib/redis
|
||
- type: bind
|
||
source: ./redis_cluster/log/6376
|
||
target: /var/log/redis
|
||
```
|
||
|
||
- 启动 redis 集群
|
||
```bash
|
||
docker-compose up -d
|
||
```
|
||
|
||
## 参考
|
||
- [redis 官网](https://redis.io/topics/cluster-tutorial)
|
||
|