小鱼儿博客

RedHat6 Redis5集群环境搭建

前言

2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的 redis-cli的方式,是集群的构建方式复杂度大大降低,操作起来感觉容易很多,不用去安装ruby等等相关依赖。

集群中应该至少有三个节点,每个节点有一备份节点,需要6台服务器,官方的安装文件中有搭建伪分布式的工具,以下步骤是在6台 Linux VM服务器上搭建有6个节点的 Redis集群。

正文

安装环境

6台RedHat6.5虚拟机
192.168.56.103
192.168.56.104
192.168.56.105
192.168.56.91
192.168.56.92
192.168.56.93

Redis5.0.13

Redis单节点安装与配置

查看系统是否安装tcl,如果没有安装的需要安装tcl,因为redis安装时需要用到tcl

[dataweb@LVS2 ~]$ rpm -qa | grep tcl
tcl-8.5.7-6.el6.x86_64
#未安装tcl的可以执行安装
[dataweb@LVS2 ~]$ yum install -y tcl

安装redis

#当前用户目录
[dataweb@LVS2 ~]$ cd ~
[dataweb@LVS3 ~]$ wget https://download.redis.io/releases/redis-5.0.13.tar.gz --no-check-certificate
--2021-08-22 23:52:57--  https://download.redis.io/releases/redis-5.0.13.tar.gz
Resolving download.redis.io... 45.60.125.1
Connecting to download.redis.io|45.60.125.1|:443... connected.
WARNING: certificate common name “imperva.com” doesn’t match requested host name “download.redis.io”.
HTTP request sent, awaiting response... 200 OK
Length: 1995566 (1.9M) [application/octet-stream]
Saving to: “redis-5.0.13.tar.gz”

100%[==================================================================================================>] 1,995,566    197K/s   in 9.6s    
2021-08-22 23:53:52 (203 KB/s) - “redis-5.0.13.tar.gz” saved [1995566/1995566]

[dataweb@LVS2 ~]$ tar -zxvf redis-5.0.13.tar.gz
[dataweb@LVS2 ~]$ cd redis-5.0.13 && make
[dataweb@LVS2 ~]$ cd src
#创建安装目录
[dataweb@LVS2 ~]$ mkdir -p /usr/local/redis/bin
[dataweb@LVS2 ~]$ cp redis-server redis-cli ...... /usr/local/redis/bin

编译安装完成后,修改配置文件,将安装目录中的redis.conf文件拷备到/etc/redis/redis_6379.conf

$ cp redis.conf /etc/redis/redis_6379.conf
$ vi /etc/redis/redis_6379.conf

#客户端连接端口
port 6379 

#实例绑定的IP地址
#bind 192.168.56.0

#redis实例数据配置存储位置,安装位置的data目录
dir ./data

#是否以后台进程的方式启动redis实例 
daemonize yes 

#指定该进程pidfile
pidfile /var/run/redis_6379.pid
#开启集群模式
cluster-enabled yes 
#集群中该实例的配置文件,该文件会在data目录下生成nodes.conf
cluster-config-file 
#开启aop日志
appendonly yes
#关闭保护模式 
protected-mode no 
#master开启密码保护
requirepass liuzz
#replica同master交互密码 
masterauth liuzz

启动单节点redis服务

安装完成后,通过脚本启动redis服务

#!/bin/sh
#
# Simple Redis init.d script conceived to work on Linux systems
# as it does use of the /proc filesystem.

### BEGIN INIT INFO
# Provides:     redis_6379
# Default-Start:        2 3 4 5
# Default-Stop:         0 1 6
# Short-Description:    Redis data structure server
# Description:          Redis data structure server. See https://redis.io
### END INIT INFO


REDISPORT=6379
REDISPASS=liuzz
EXEC=bin/redis-server
CLIEXEC=bin/redis-cli

PIDFILE="data/redis_${REDISPORT}.pid"
CONF="etc/redis.conf"

REPLICAS=1

REDISSERVER_PREFIX=192.168.56.
REDISSERVERS=(91 92 93 103 104 105)

case "$1" in
    start)
        if [ -f $PIDFILE ]
        then
                echo "$PIDFILE exists, process is already running or crashed"
        else
                echo "Starting Redis server..."
                $EXEC $CONF
        fi
        ;;
    stop)
        if [ ! -f $PIDFILE ]
        then
                echo "$PIDFILE does not exist, process is not running"
        else
                PID=$(cat $PIDFILE)
                echo "Stopping ..."
                $CLIEXEC -c -p $REDISPORT -a $REDISPASS shutdown nosave
                while [ -x /proc/${PID} ]
                do
                    echo "Waiting for Redis to shutdown ..."
                    sleep 1
                done
                echo "Redis stopped"
        fi
        ;;
	*)
        echo "Please use {start|stop} as first argument"
        ;;
esac

执行启动redis服务

[dataweb@LVS1 redis]$ ./redisd start
Starting Redis server...
[dataweb@LVS1 redis]$ ps -ef|grep redis
dataweb  17018     1  0 Aug22 ?        00:00:24 bin/redis-server *:6379 [cluster]
dataweb  17073 12725  0 00:51 pts/1    00:00:00 grep redis
[dataweb@LVS1 redis]$ 

用同样的方式启动其他机器上的redis服务,并查看服务是否启动正常

启动集群

redis单节点安装配置完成后,启动redis单节点,然后创建集群

[dataweb@LVS3 redis]$ bin/redis-cli --cluster create 192.168.56.103:6379 192.168.56.105:6379 192.168.56.104:6379 192.168.56.91:6379 192.168.56.92:6379 192.168.56.93:6379  --cluster-replicas 1 -a xxxxx 2>/dev/null
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.56.92:6379 to 192.168.56.103:6379
Adding replica 192.168.56.93:6379 to 192.168.56.105:6379
Adding replica 192.168.56.91:6379 to 192.168.56.104:6379
M: 2c3e7e46d7e35c40435cd25e12e67bb6be82b856 192.168.56.103:6379
   slots:[0-5460] (5461 slots) master
M: 5e58c9d15d0db7d5980185ed4e727b7fd66a43fd 192.168.56.105:6379
   slots:[5461-10922] (5462 slots) master
M: 0a701abc91b6651d60f827c77a09f29b0aff6a34 192.168.56.104:6379
   slots:[10923-16383] (5461 slots) master
S: 364a5a9f6e53c0c63455facb24202c6741e67911 192.168.56.91:6379
   replicates 0a701abc91b6651d60f827c77a09f29b0aff6a34
S: a7f168b8b3470326246344f5d6bb9f6432e870a8 192.168.56.92:6379
   replicates 2c3e7e46d7e35c40435cd25e12e67bb6be82b856
S: 32c939476e9a7df97982941d1083e1989790c9c6 192.168.56.93:6379
   replicates 5e58c9d15d0db7d5980185ed4e727b7fd66a43fd
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
..
>>> Performing Cluster Check (using node 192.168.56.103:6379)
M: 2c3e7e46d7e35c40435cd25e12e67bb6be82b856 192.168.56.103:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 5e58c9d15d0db7d5980185ed4e727b7fd66a43fd 192.168.56.105:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: a7f168b8b3470326246344f5d6bb9f6432e870a8 192.168.56.92:6379
   slots: (0 slots) slave
   replicates 2c3e7e46d7e35c40435cd25e12e67bb6be82b856
S: 364a5a9f6e53c0c63455facb24202c6741e67911 192.168.56.91:6379
   slots: (0 slots) slave
   replicates 0a701abc91b6651d60f827c77a09f29b0aff6a34
S: 32c939476e9a7df97982941d1083e1989790c9c6 192.168.56.93:6379
   slots: (0 slots) slave
   replicates 5e58c9d15d0db7d5980185ed4e727b7fd66a43fd
M: 0a701abc91b6651d60f827c77a09f29b0aff6a34 192.168.56.104:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试集群

通过单个节点连接集群,查看集群节点信息

[dataweb@LVS3 redis]$ bin/redis-cli -c -h 192.168.56.103 -p 6379 
192.168.56.103:6379> auth xxxxx
OK
192.168.56.103:6379>

查看集群信息及各节点相关信息

192.168.56.103:6379> 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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:256
cluster_stats_messages_pong_sent:265
cluster_stats_messages_sent:521
cluster_stats_messages_ping_received:260
cluster_stats_messages_pong_received:256
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:521
192.168.56.103:6379> cluster nodes
5e58c9d15d0db7d5980185ed4e727b7fd66a43fd 192.168.56.105:6379@16379 master - 0 1629644801209 2 connected 5461-10922
a7f168b8b3470326246344f5d6bb9f6432e870a8 192.168.56.92:6379@16379 slave 2c3e7e46d7e35c40435cd25e12e67bb6be82b856 0 1629644798185 5 connected
364a5a9f6e53c0c63455facb24202c6741e67911 192.168.56.91:6379@16379 slave 0a701abc91b6651d60f827c77a09f29b0aff6a34 0 1629644798000 4 connected
32c939476e9a7df97982941d1083e1989790c9c6 192.168.56.93:6379@16379 slave 5e58c9d15d0db7d5980185ed4e727b7fd66a43fd 0 1629644799000 6 connected
0a701abc91b6651d60f827c77a09f29b0aff6a34 192.168.56.104:6379@16379 master - 0 1629644800201 3 connected 10923-16383
2c3e7e46d7e35c40435cd25e12e67bb6be82b856 192.168.56.103:6379@16379 myself,master - 0 1629644801000 1 connected 0-5460
192.168.56.103:6379> 

集群服务重新启动与停止

保留原来的数据:
逐个关闭redis实例,再逐个的启动即可。

丢弃原来的数据:
关闭实例,清空实例中数据存放目录的所有内容,然后逐个启动实例,在任意一个实例上执行集群的创建命令即可,本质上就是创建一个新的集群。

问题:

集群模式下,客户端需要通过集群方式连接取数,否则无法取到数据

[root@ocdc02 redis]# bin/redis-cli -h 192.168.56.91 -p 6379 -a xxxxx >/dev/null
192.168.56.91:6379> get "redis"
(error) MOVED 1151 192.168.56.103:6379
192.168.56.91:6379>

客户端通过集群方式连接取数,连接参数加上”-c“

[root@ocdc02 redis]# bin/redis-cli -c -h 192.168.56.91 -p 6379 -a xxxxx >/dev/null
192.168.56.91:6379> get "redis"
-> Redirected to slot [1151] located at 192.168.56.103:6379
"redis"
192.168.56.103:6379>

0

用户头像
  
博客所属
博主:liuzz | 小鱼儿
个人: 属鼠 水瓶座
故乡:河北 秦皇岛
现居:中国 北京
职业:IT码农
主页:http://www.liuzz.com
喜欢: 看海、台球
我的简历:My Resume
联系博主
369264776
jun-yuhong#163.com
说点什么 ×