【Redis】centos7.9安装redis 3主3从高可用集群模式从零开始手把手教程,纯干货分享
redis集群模式能够实现高可用,自动故障转移,主从自动切换,生产环境中不用哨兵模式就得用集群模式,这篇文章从零开始教大家怎么搭建redis集群模式。
环境准备
运维的环境很关键,不同的Linux操作系统,不同的版本,提供的环境都会有差异,所以写教程的第一步是指明所用的系统版本,这里我们使用从阿里云购买的3台服务器,版本是centos 7.9,redis版本是 6.2.14。
编译Redis6.2.14源码
3台服务器的地址分别是:172.24.39.2, 172.29.149.246, 172.17.6.203,这里使用内网ip因为没有配置阿里云安全组允许6381和6382端口公网访问,ssh端口没有改都是22,用的密钥登录,没有设置密码。
编译源码需要在3台服务器上都执行一遍,命令如下:
cd /usr/local
wget https://download.redis.io/releases/redis-6.2.14.tar.gz
tar -xvzf redis-6.2.14.tar.gz
cd redis-6.2.14
make
cd src/
make install
这里说明一下,我看了一些网上的教程写着编译redis需要安装gcc和g++,但是我操作的时候没有安装也能正常编译运行,我觉得和centos7的版本以及redis的版本有关系,所有这些命令我都是在服务器上实践过才写出来的,都是能保证生产环境可用的。编译完的结果如下,使用 redis-cli --version 查询当前的redis版本。
准备redis.service相关配置
同样需要在3台服务器都执行一遍。redis端口采用 6381和6382,如果你想改端口也是可用的,记得把所有出现端口的地方都改一遍。
准备文件内容:/usr/local/redis-6.2.14/redis1.conf的文件内容如下,/usr/local/redis-6.2.14/redis2.conf的文件内容和redis1.conf除了端口要改成6382,其他是一样的。
cat <<EOF | tee /usr/local/redis-6.2.14/redis1.conf
# /usr/local/redis-6.2.14/redis1.conf
# 设置后台开启
daemonize yes
# 是否启动保护模式,默认yes
protected-mode no
# redis端口
port 6381
# 日志文件
logfile /var/log/redis6381.log
# pid存放未知
pidfile /var/run/6381.pid
#
dir /data/redis/6381
# rbd文件的文件名
dbfilename dump6381.rdb
# 打开aof持久化
appendonly yes
# aof文件名
appendfilename appendonly6381.aof
# redis密码
requirepass 123456
# master密码
masterauth 123456
#开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-6381.conf
#设置集群的超时时间
cluster-node-timeout 5000
EOF
为了方便大家,把/usr/local/redis-6.2.14/redis2.conf文件也写出来算了
cat <<EOF | tee /usr/local/redis-6.2.14/redis2.conf
# 设置后台开启
daemonize yes
# 是否启动保护模式,默认yes
protected-mode no
# redis端口
port 6382
# 日志文件
logfile /var/log/redis6382.log
# pid存放未知
pidfile /var/run/6382.pid
#
dir /data/redis/6382
# rbd文件的文件名
dbfilename dump6382.rdb
# 打开aof持久化
appendonly yes
# aof文件名
appendfilename appendonly6382.aof
# redis密码
requirepass 123456
# master密码
masterauth 123456
#开启集群
cluster-enabled yes
# 集群的配置文件,该文件自动生成
cluster-config-file nodes-6382.conf
#设置集群的超时时间
cluster-node-timeout 5000
EOF
注意配置文件里面的 dir /data/redis/6381 和 dir /data/redis/6382,这两个数据文件夹默认是不存在的,你可用改成你想要的文件夹,如果不存在,你需要手动创建他们。在3台服务器上同时执行下面的命令。
mkdir -p /data/redis/6381
mkdir -p /data/redis/6382
编辑 /etc/systemd/system/redis1.service 文件和 /etc/systemd/system/redis2.service 文件
cat <<EOF | tee /etc/systemd/system/redis1.service
[Unit]
Description=Redis1 6 Server
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis-6.2.14/redis1.conf
ExecStop=/bin/kill -15 $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=10s
LimitNOFILE=1000000
LimitNPROC=1000000
[Install]
WantedBy=multi-user.target
EOF
cat <<EOF | tee /etc/systemd/system/redis2.service
[Unit]
Description=Redis2 6 Server
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server /usr/local/redis-6.2.14/redis2.conf
ExecStop=/bin/kill -15 $MAINPID
ExecReload=/bin/kill -s HUP $MAINPID
Restart=always
RestartSec=10s
LimitNOFILE=1000000
LimitNPROC=1000000
[Install]
WantedBy=multi-user.target
EOF
启动服务,创建redis集群
先在3台服务器上同时执行下面的命令, --now 的意思就是设置开机启动的同时,把服务运行起来。
systemctl enable redis1.service --now
systemctl enable redis2.service --now
在redis1服务器上创建redis集群,命令如下,为什么这里的ip是内网ip呢?因为redis默认监听的是0.0.0.0,然后阿里云安全组没有开放公网6381和6382端口的访问,也不想去改安全组,就用服务器的内网ip创建集群了。
/usr/local/bin/redis-cli -a 123456 --cluster create \
--cluster-yes --cluster-replicas 1 \
172.24.39.2:6381 172.24.39.2:6382 \
172.29.149.246:6381 172.29.149.246:6382 \
172.17.6.203:6381 172.17.6.203:6382
执行成功的结果如下图:
到这里redis集群就创建完成了,可用运行一些集群相关的命令进行测试了
redis6集群测试
在redis1服务器上执行下面的命令,通过集群模式登录redis服务,-c的意思是用集群模式登录,-a的意思是使用指定的密码登录,通过前面的redis1.conf配置文件,我们可以知道集群密码是123456。
redis-cli -c -p 6381 -a 123456
可用看到集群的状态是OK,集群的节点信息也是正常的。
cluster slots的结果如下:
redis集群一些常见的命令如下:
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <master_node_id> :将当前从节点设置为 node_id 指定的master节点的slave节点。只能针对slave节点操作。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键 。
redis6集群扩容增加1个节点
编译安装redis6的步骤和最开始的一样,这里就不重复写了,编译完之后配置文件也是一样的步骤,启动服务也是一样,运行完成后截图如下:
然后添加172.24.39.3:6381为主节点,这里的内网ip是新创建的节点的内网ip,172.24.39.2:6381是集群中存在的一个master节点,这个是语法规则,先输入被添加的节点,再输入已经存在的节点。
redis-cli --cluster add-node 172.24.39.3:6381 172.24.39.2:6381 -a 123456
命令成功运行的截图如上,Cluster nodes可以看到新加的master节点没有分配slots
接下来为新节点分配slots。
redis-cli --cluster reshard 172.24.39.2:6381 -a 123456
为什么是4096呢,因为redis总共16384个slots,4个master节点,正好每个节点4096个slots。如果命令没有报错,这就分配成功了。
现在添加从节点:
redis-cli --cluster add-node 172.24.39.3:6382 172.24.39.2:6381 --cluster-slave -a 123456
命令成功运行,结果如上,现在再通过cluster nodes查看,可用看到4主4从了,新节点的slave指向新节点的master,如果你想错开主从节点,可用通过 cluster replicate命令修改,这里不详细讲了。
redis6集群缩容删除一个节点
删除节点比较简单,只要先调整slots槽位,然后用命令删除节点就行了。
redis-cli --cluster del-node 172.24.39.3:6382 0e6229b5ccd9dd86ad1d03b3ff0ea2bd345d0b46 -a 123456
redis-cli --cluster del-node 172.24.39.3:6381 c0b7ea9b4168632bfc0bf31b86598691bfeaf3a6 -a 123456
可用看到用cluster nodes命令查看节点的时候,已经没有 172.24.39.3 节点了。
为了方便积累和沉淀运维工作中遇到的问题以及踩过的坑,创建了一个知识星球,大家可以在里面向有经验的人提问求助,也欢迎分享你自己踩坑的经验,让他人避免踩同样的坑。
最后附上ansible批量部署脚本:https://down.liusha.com/ansible-redis-cluster.zip,需要注意的是要手动下载redis源码到指定的文件夹,下载地址在文章的开头有写。
全文完。