redis-cluster手动部署
redis-cluster手动部署
一,目标
解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素

二,环境准备
1,主机名设置
10.1.1.40:redis-master-1
10.1.1.41:redis-master-2
10.1.1.42:redis-master-3
10.1.1.43:redis-slave-1
10.1.1.45:redis-slave-2
10.1.1.46:redis-slave-3
2,环境初始化
yum install -y gcc chrony make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages bash-completion; systemctl enable --now chronyd; chronyc sources -v; hwclock -w; setenforce 0; systemctl disable --now firewalld; sed -Ei.bak 's@(^SELINUX=)(.*)@\1disabled@' /etc/selinux/config ;
3,编译安装redis
#!/bin/bash
#
#********************************************************************
#Author: h
#QQ: 111
#Date: 2021-07-05
#FileName: redis_make_install.sh
#URL: http://www.52panda.net
#Description: The install script
#Copyright (C): 2021 All rights reserved
#********************************************************************
. /etc/init.d/functions
yum -y install gcc jemalloc-devel &> /dev/null || { echo "Check yum configure"; exit 9;}
INSTALL_DIR=/app/redis
VER=5.0.9
PASS=123456
label=
wget http://download.redis.io/releases/redis-$VER.tar.gz &> /dev/null || { echo "download failure check your network";exit 9;}
tar xf redis-$VER.tar.gz;cd redis-$VER/
[ -a INSTALL_DIR ] || mkdir -p $INSTALL_DIR
make PREFIX=${INSTALL_DIR} install &> /dev/null ||{ echo "Error,please manual compilation "; exit 9;}
echo "PATH=${INSTALL_DIR}/bin:\$PATH" >> /etc/profile.d/redis.sh ; . /etc/profile.d/redis.sh
mkdir ${INSTALL_DIR}/{etc,log,data,run}
cp redis.conf ${INSTALL_DIR}/etc/redis.conf
cat >> /lib/systemd/system/redis.service <<-eof
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
eof
#optimization
echo -e "net.core.somaxconn = 1024\nvm.overcommit_memory = 1 " >> /etc/sysctl.conf;sysctl -p &> /dev/null || echo "optimization was failure please check"
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local && chmod +x /etc/rc.d/rc.local
# create user
id redis &> /dev/null && echo "user redis exist " || useradd -r -s /sbin/nologin redis
#config
echo "requirepass $PASS" >> ${INSTALL_DIR}/etc/redis.conf
sed -ri 's@^bind 127.0.0.1@bind 0.0.0.0@' ${INSTALL_DIR}/etc/redis.conf
sed -ri "s@^dir .*@dir ${INSTALL_DIR}/data/@" ${INSTALL_DIR}/etc/redis.conf
sed -ri "s@^logfile ""@logfile ${INSTALL_DIR}/log/redis_$VER.log@" ${INSTALL_DIR}/etc/redis.conf
sed -ri "s@^pidfile.*\.pid@pidfile ${INSTALL_DIR}/run/redis_$VER.pid@" ${INSTALL_DIR}/etc/redis.conf
chown -R redis.redis ${INSTALL_DIR}
systemctl daemon-reload; systemctl enable --now redis && action "Redis start " || { action "Redis start " false;}
三,手动部署cluster步骤
1,启动集群功能在所有节点执行该操作
[root@redis-slave-3 ~]# cd /app/redis/etc/
sed -i.bak -e -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes-6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full-coverage yes/c cluster-require-full-coverage no' redis.conf
# cluster-require-full-coverage no 设置为当一个集群节点挂掉之后集群仍然可以用
#设置开机自动启动
[root@redis-slave-3 ~]# systemctl enable --now redis
#查看端口 16379为集群功能使用的端口
[root@redis-slave-3 ~]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:111 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:16379 0.0.0.0:*
LISTEN 0 511 0.0.0.0:6379 0.0.0.0:*
LISTEN 0 128 [::]:111 [::]:* *:*
LISTEN 0 128 [::]:22 [::]:*
2,执行meet 操作实现相互通信
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster meet 10.1.1.41 6379
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster meet 10.1.1.42 6379
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster meet 10.1.1.43 6379
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster meet 10.1.1.45 6379
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster meet 10.1.1.46 6379
OK
#可以看到所有节点之间可以相互连接通信
[root@redis-master-1 ~]# redis-cli -h 10.1.1.40 -a 123456 --no-auth-warning cluster nodes
4d5c0fecab7c431698c6a0e9e94c12a631b0e556 10.1.1.46:6379@16379 master - 0 1626428178260 5 connected
d7c839b9c007fbf4849271c10b4c69b0df449fee 10.1.1.42:6379@16379 master - 0 1626428177240 0 connected
bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4 10.1.1.40:6379@16379 myself,master - 0 1626428176000 2 connected
930b5b38b2b1d40ca9985b8c0321023e807dc3ac 10.1.1.41:6379@16379 master - 0 1626428176000 1 connected
aeacff4ccf12acc5960d1d2383126fb0ca78a32b 10.1.1.43:6379@16379 master - 0 1626428177000 3 connected
22bad2d94f029a6c42d78d81b1cbb932ad507c52 10.1.1.45:6379@16379 master - 0 1626428178000 4 connected
#查看集群信息
[root@redis-master-1 ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_ping_sent:242
cluster_stats_messages_pong_sent:230
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:477
cluster_stats_messages_ping_received:230
cluster_stats_messages_pong_received:247
cluster_stats_messages_received:477
#没有槽位无法创建值
[root@redis-master-1 ~]# redis-cli -a 123456 --no-auth-warning set name 111
(error) CLUSTERDOWN Hash slot not served
3,手动分配槽位
#分配槽位脚本
#!/bin/bash
#
#********************************************************************
#Author: none
#QQ: none
#Date: 2021-07-16
#FileName: slots.sh
#URL: none
#Description: The test script
#Copyright (C): 2021 All rights reserved
#********************************************************************
host=$1
port=$2
start=$3
end=$4
pass=123456
for slot in `seq ${start} ${end}` ;do
echo "slot:${slot}"
redis-cli -h ${host} -p${port} -a${pass} --no-auth-warning cluster addslots ${slot}
done #为三个master分配槽位,共16364/3=5461.333333333333,平均每个master分配5461个槽位
[root@redis-master-1 ~]# bash slots.sh 10.1.1.40 6379 0 5461
[root@redis-master-1 ~]# bash slots.sh 10.1.1.42 6379 5462 10922
[root@redis-master-1 ~]# bash slots.sh 10.1.1.42 6379 10923 16383
#创建完成之后可以得到下面信息
[root@redis-master-1 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
4d5c0fecab7c431698c6a0e9e94c12a631b0e556 10.1.1.46:6379@16379 master - 0 1626430202638 5 connected
d7c839b9c007fbf4849271c10b4c69b0df449fee 10.1.1.42:6379@16379 master - 0 1626430203000 0 connected 10923-16383
bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4 10.1.1.40:6379@16379 myself,master - 0 1626430197000 2 connected 0-5461
930b5b38b2b1d40ca9985b8c0321023e807dc3ac 10.1.1.41:6379@16379 master - 0 1626430200000 1 connected 5462-10922
aeacff4ccf12acc5960d1d2383126fb0ca78a32b 10.1.1.43:6379@16379 master - 0 1626430203000 3 connected
22bad2d94f029a6c42d78d81b1cbb932ad507c52 10.1.1.45:6379@16379 master - 0 1626430203660 4 connected
[root@redis-master-1 ~]# redis-cli -a 123456 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:2
cluster_stats_messages_ping_sent:2018
cluster_stats_messages_pong_sent:1897
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:3920
cluster_stats_messages_ping_received:1897
cluster_stats_messages_pong_received:2023
cluster_stats_messages_received:3920
4,指定各个节点的主从关
#-h指定主机 使用 cluster nodes查看id replicate 指定前面的主机属于那个主机的从节点
[root@redis-master-1 ~]# redis-cli -h 10.1.1.43 -a 123456 --no-auth-warning cluster replicate bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.45 -a 123456 --no-auth-warning cluster replicate 930b5b38b2b1d40ca9985b8c0321023e807dc3ac
OK
[root@redis-master-1 ~]# redis-cli -h 10.1.1.46 -a 123456 --no-auth-warning cluster replicate d7c839b9c007fbf4849271c10b4c69b0df449fee
OK
[root@redis-master-1 ~]#
[root@redis-master-1 ~]# redis-cli -a 123456 --no-auth-warning cluster nodes
4d5c0fecab7c431698c6a0e9e94c12a631b0e556 10.1.1.46:6379@16379 slave d7c839b9c007fbf4849271c10b4c69b0df449fee 0 1626430966000 5 connected
d7c839b9c007fbf4849271c10b4c69b0df449fee 10.1.1.42:6379@16379 master - 0 1626430967753 0 connected 10923-16383
bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4 10.1.1.40:6379@16379 myself,master - 0 1626430966000 2 connected 0-5461
930b5b38b2b1d40ca9985b8c0321023e807dc3ac 10.1.1.41:6379@16379 master - 0 1626430968000 1 connected 5462-10922
aeacff4ccf12acc5960d1d2383126fb0ca78a32b 10.1.1.43:6379@16379 slave bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4 0 1626430968000 3 connected
22bad2d94f029a6c42d78d81b1cbb932ad507c52 10.1.1.45:6379@16379 slave 930b5b38b2b1d40ca9985b8c0321023e807dc3ac 0 1626430968769 4 connected
#查看主从关系
[root@redis-master-1 ~]# redis-cli -a 123456 -h 10.1.1.41 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.1.1.45,port=6379,state=online,offset=462,lag=0
master_replid:50c40d1354e01f75e5481bcf40c75eef2944fb5a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:462
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:462
[root@redis-master-1 ~]# redis-cli -a 123456 -h 10.1.1.42 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.1.1.46,port=6379,state=online,offset=434,lag=1
master_replid:cac34dcb799ee775cf076670a9f1e9fea01fc105
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
[root@redis-master-1 ~]# redis-cli -a 123456 -h 10.1.1.40 --no-auth-warning info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.1.1.43,port=6379,state=online,offset=546,lag=1
master_replid:9c0ad4b5126757d73159bfda6eadba6ab89bfb88
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:546
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:546
[root@redis-master-1 ~]#
#查看主从节关系及槽位信息
[root@redis-master-1 ~]# redis-cli -a 123456 -h 10.1.1.40 --no-auth-warning cluster slots
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "10.1.1.42"
2) (integer) 6379
3) "d7c839b9c007fbf4849271c10b4c69b0df449fee"
4) 1) "10.1.1.46"
2) (integer) 6379
3) "4d5c0fecab7c431698c6a0e9e94c12a631b0e556"
2) 1) (integer) 0
2) (integer) 5461
3) 1) "10.1.1.40"
2) (integer) 6379
3) "bc1cd7d5bc9def4d1f9cf3c673bbd10ba1c2d6e4"
4) 1) "10.1.1.43"
2) (integer) 6379
3) "aeacff4ccf12acc5960d1d2383126fb0ca78a32b"
3) 1) (integer) 5462
2) (integer) 10922
3) 1) "10.1.1.41"
2) (integer) 6379
3) "930b5b38b2b1d40ca9985b8c0321023e807dc3ac"
4) 1) "10.1.1.45"
2) (integer) 6379
3) "22bad2d94f029a6c42d78d81b1cbb932ad507c52"
5,验证访问
[root@redis-master-1 ~]# redis-cli -c -h 10.1.1.40 -a 123456 --no-auth-warning set name 110
OK
四,基于Redis 4 的 redis cluster 部署
1,

浙公网安备 33010602011771号