RedHat6 Redis5集群环境搭建
Look:359,By admin Posted On 2021-08-22
前言
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>