一、前言
redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。
redis从3.0开始支持集群功能。redis集群采用无中心节点方式实现,无需proxy代理,客户端直接与redis集群的每个节点连接,根据同样的hash算法计算出key对应的slot,然后直接在slot对应的redisj节点上执行命令。在redis看来,响应时间是最苛刻的条件,增加一层带来的开销是redis不能接受的。因此,redis实现了客户端对节点的直接访问,为了去中心化,节点之间通过gossip协议交换互相的状态,以及探测新加入的节点信息。redis集群支持动态加入节点,动态迁移slot,以及自动故障转移。
二、 环境准备
以下所有节点均相同操作
1、机器准备
172.8.10.105 siger-data1.test.com 7000、7001端口
172.8.10.106 siger-data2.test.com 7002、7003端口
172.8.10.107 siger-data2.test.com 7004、7005端口
2、关闭防火墙
sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service
sudo systemctl status firewalld.service
3、修改系统内核参数
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
echo "net.core.somaxconn = 512" >> /etc/sysctl.conf
4、下载环境依赖
yum -y install cpp binutils glibc glibc-kernheaders glibc-common glibc-devel gcc make gcc-c++ libstdc++-devel tcl
5、解压安装包
mkdir /usr/local/redis
mv /opt/redis-6.0.6.tar.gz /usr/local/redis/
tar -zxvf redis-6.0.6.tar.gz
6、升级gcc
(默认的只支持redis 6.0.以下,安装6.0.6需要升级gcc)
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash
# 查看版本
gcc -v
三、搭建
1、编译并安装
172.8.10.105:
make PREFIX=/usr/local/redis install
2、创建配置目录
172.8.10.105:
mkdir -p /usr/local/redis/{data,etc,log}
3、分发其他节点
172.8.10.105:
scp -r /usr/local/redis/ root@172.8.10.106:/usr/local
scp -r /usr/local/redis/ root@172.8.10.107:/usr/local
4、修改配置文件
(注意区分ip和端口)
172.8.10.105:
vim /usr/local/redis/etc/7000.conf
vim /usr/local/redis/etc/7001.conf
172.8.10.106:
vim /usr/local/redis/etc/7002.conf
vim /usr/local/redis/etc/7003.conf
172.8.10.107:
vim /usr/local/redis/etc/7004.conf
vim /usr/local/redis/etc/7005.conf
以下是7000.conf,其他7001-7005照样修改
bind 172.8.10.105
protected-mode yes
port 7000
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize yes
supervised no
pidfile /var/run/7000.pid
loglevel notice
logfile "/usr/local/redis/log/7000.log"
databases 16
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename 7000-dump.rdb
rdb-del-sync-files no
dir /usr/local/redis/data/
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
appendonly no
appendfilename "7000-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-config-file 7000.conf
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
jemalloc-bg-thread yes
#安装tree
sudo yum -y install tree
# 查看目录
tree /usr/local/redis/
172.8.10.105:
172.8.10.106:
172.8.10.107:
4、启动各节点
172.8.10.105:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7000.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7001.conf
ps -aux | grep redis
172.8.10.106:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7002.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7003.conf
172.8.10.107:
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7004.conf
/usr/local/redis/bin/redis-server /usr/local/redis/etc/7005.conf
5、创建redis集群
#任意节点:
/usr/local/redis/bin/redis-cli --cluster create 172.8.10.105:7000 172.8.10.105:7001 172.8.10.106:7002 172.8.10.106:7003 172.8.10.107:7004 172.8.10.107:7005 --cluster-replicas 1
#集群启动成功
注:
–cluster-replicas 1:表示希望为集群中的每个主节点创建一个从节点(一主一从)。
–cluster-replicas 2:表示希望为集群中的每个主节点创建两个从节点(一主二从)。
6、验证集群
./redis-cli -c -p 7005 -h 172.8.10.107
四、开机自启
以下所有节点均相同操作
#设置脚本
vim /etc/init.d/redisc
(将redisc_node1、redisc_node2、redisc_node3的内容分别复制在不同的节点/etc/init.d/redisc上)
以下是redisc_node1,其他照样修改
#!/bin/sh
# chkconfig: 2345 80 90
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.
REDISPORT1=7000
REDISPORT2=7001
EXEC=/usr/local/redis/bin/redis-server
CLIEXEC=/usr/local/redis/bin/redis-cli
PIDFILE=/var/run/${REDISPORT1}.pid
CONF1="/usr/local/redis/etc/${REDISPORT1}.conf"
CONF2="/usr/local/redis/etc/${REDISPORT2}.conf"
case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis cluster server..."
$EXEC $CONF1 &
$EXEC $CONF2 &
echo "启动成功..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT1 shutdown
$CLIEXEC -p $REDISPORT2 shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis cluster to shutdown ..."
sleep 1
done
echo "Redis cluster stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac
#设置权限
chmod +x /etc/init.d/redisc
注册为系统服务
chkconfig --add redisc
以后可以使用命令来控制Redis的启动和关闭
启动:service redisc start
关闭:service redisc stop
配置为开机自启动
chkconfig redisc on