在 CentOS 7.6 环境中搭建 Redis 主从集群,并使用 systemctl 配置集群自启动。
Redis 下载安装
采用源码编译安装的方式,下载源码:
1
| wget http://download.redis.io/releases/redis-5.0.7.tar.gz -P /usr/local/src
|
进入到下载目录,解压下载的源码:
1 2
| cd /usr/local/src/ tar -zxvf redis-5.0.7.tar.gz
|
安装 gcc 编译器,使用 make 编译安装:
1 2 3
| cd redis-5.0.7 yum install gcc-c++ make MALLOC=libc install
|
完成上面步骤之后,Redis 相关 bin 文件就已经安装到 /usr/bin/local/bin
目录下了:
1 2 3 4 5 6
| redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel -> redis-server redis-server
|
启动 Redis 服务器,使用默认的配置文件 /usr/local/src/redis-5.0.7/redis.conf
,也可指定配置文件:
1
| /usr/local/bin/redis-server ./redis.conf
|
使用客户端连接 Redis Server,测试是否启动成功:
1
| /usr/local/bin/redis-cli -h 127.0.0.1 -p 6379 -a password
|
有时候会有中文乱码,要在 redis-cli 后面加上 --raw
。
集群配置
在本地启动多个 Redis Server 实例,使用不同的配置文件,占用不同的端口。
配置多个 Redis Server 实例
在 /usr/local/
下建立 redis-cluster
文件夹,再建子文件夹 7001-7006
以及 700*/data/
:
1 2 3 4 5 6
| mkdir -p /usr/local/redis-cluster/7000/data \ /usr/local/redis-cluster/7001/data \ /usr/local/redis-cluster/7002/data \ /usr/local/redis-cluster/7003/data \ /usr/local/redis-cluster/7004/data \ /usr/local/redis-cluster/7005/data
|
在各实例位置中新建 redis.conf
,并配置如下:
1 2 3 4 5 6 7 8 9
| port 700* bind 0.0.0.0 dir /usr/local/redis-cluster/700*/data/ cluster-enabled yes cluster-config-file nodes-700*.conf cluster-node-timeout 5000 cluster-announce-ip 当前集群IP appendonly yes daemonize yes
|
启动 Server 实例
启动各 Server 实例:
1
| /usr/local/bin/redis-server /usr/local/redis-cluster/700*/redis.conf
|
或使用自定义脚本 /var/tmp/redis-cluster.sh
,一次性启动多个实例:
1 2 3 4 5 6 7
| #!/bin/bash /usr/local/bin/redis-server /usr/local/redis-cluster/7000/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7004/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7005/redis.conf
|
添加执行权限并执行:
1 2
| chmod +x redis-cluster.sh ./redis-cluster.sh
|
查看各实例进程
1 2 3 4 5 6 7
| [root@bbc106 redis-cluster] 6446 1 0 03:13 /usr/local/bin/redis-server 0.0.0.0:7000 [cluster] 6553 1 0 03:14 /usr/local/bin/redis-server 0.0.0.0:7001 [cluster] 6577 1 0 03:14 /usr/local/bin/redis-server 0.0.0.0:7002 [cluster] 6585 1 0 03:14 /usr/local/bin/redis-server 0.0.0.0:7003 [cluster] 6595 1 0 03:14 /usr/local/bin/redis-server 0.0.0.0:7004 [cluster] 6605 1 0 03:14 /usr/local/bin/redis-server 0.0.0.0:7005 [cluster]
|
建立集群
使用 /usr/local/bin/redis-cli
建立集群:
1
| /usr/local/bin/redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
|
看到如下 log:
1 2 3 4 5 6
| >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 ... [OK] All 16384 slots covered.
|
测试集群
客户端连接任一节点,并使用 cluster nodes
或 cluster info
查看集群信息:
1 2
| [root@bbc106 local]# /usr/local/bin/redis-cli -h 127.0.0.1 -p 7000 127.0.0.1:7000> cluster nodes
|
集群信息如下图:
- 119.3.104.4:7000:节点的 IP 和 Port
- master / slave:节点在集群中的角色,主节点 / 从节点
- 0-5460 / 10923-16383:节点分配到的槽数
集群自启动
使用 systemd 配置集群自启动,首先添加 systemd unit service 配置文件 /usr/lib/systemd/system/redis-cluster.service
:
1 2 3 4 5 6 7 8 9 10
| [Unit] Description=Redis 5.0 Cluster Service After=network.target
[Service] Type=forking ExecStart=/usr/local/redis-cluster/redis-cluster.sh
[Install] WantedBy=default.target
|
- Description:描述信息
- After:启动顺序
- Type:进程启动类型
- ExecStart:启动脚本
其中 Redis 进程启动类型和 redis 服务的启动方式有关:
redis.conf |
redis.service |
daemonize no supervised systemd |
Type=notify |
daemonize no supervised no |
Type=exec |
daemonize yes supervised no |
Type=forking |
配置开机启动,首先在 /etc/systemd/system/ 下建立 redis-cluster.service 的软链接:
1
| ln -s /usr/lib/systemd/system/redis-cluster.service
|
重新加载 systemd 服务:
启动 redis 集群服务并设置 开机启动:
1 2
| sudo systemctl start redis-cluster sudo systemctl enable redis-cluster
|
重启服务器测试集群自启动:
参考
https://www.freedesktop.org/software/systemd/man/systemd.service.html
https://gist.github.com/nexdrew/14392032ed6f105474a3
https://gist.github.com/hackedunit/a53f0b5376b3772d278078f686b04d38
(完)