安装

环境:Ubuntu18.04,redis版本:5.0.7-2

直接通过apt安装:

sudo add-apt-repository ppa:chris-lea/redis-server #安装最新版redis
sudo apt update
sudo apt install redis -y #安装redis

或直接下载最新deb安装包,手动安装:

先安装redis-tools,再安装redis-server:

sudo dpkg -i redis-tools_5.0.7-2_amd64.deb
sudo dpkg -i redis-server_5.0.7-2_amd64.deb

安装完成后,通过redis-cli命令看是否能进入redis,以验证是否安装成功:

$ redis-cli
127.0.0.1:6379> 

分布式集群搭建

准备

当然,首先要在搭建集群的所有服务器上安装好redis

这里用6台服务器实现集群搭建,组成3主3从集群模式,服务器的redis信息及主从关系如下:

服务器名称IPredis实例端口主从信息
服务器1192.168.0.1276379主1
服务器2192.168.0.2006379主2
服务器3192.168.0.326379主3
服务器4192.168.0.2026379从1
服务器5192.168.0.266379从2
服务器6192.168.0.236379从3

虽然开始指定了服务器间的主从关系,但主从角色可能会发生变化,比如一台主节点挂掉时,其从节点就会自动转为主节点以保证集群稳定,当原主节点重新上线时,其会变为相应的从节点。

配置

编辑配置文件/etc/redis/redis.conf:

sudo vi /etc/redis/redis.conf

在所有redis服务器上修改以下两项内容:

#bind 127.0.0.1 ::1  #注释掉此行,约在69行位置
protected-mode no #禁用保护模式,约在88行
cluster-enabled yes #将此行的注释去掉,约在832行位置

修改完成后重启所有redis:

sudo /etc/init.d/redis-server restart

然后进入任一服务器的redis,执行创建集群命令:

redis-cli --cluster create 192.168.0.127:2379 192.168.0.200:2379 192.168.0.32:2379 192.168.0.202:2379 192.168.0.26:2379 192.168.0.23:2379 --cluster-replicas 1

创建集群命令中的--cluster-replicas 1表示每个主节点分配一个从节点,若不加该参数,则所有节点都将作为主节点,设置该参数时,要提前计算好服务器数量与主从节点关系,最好保证每个主节点所拥有的从节点数量是一致的。比如这里6台服务器,设置每个主节点都有一个从节点,则3主3从正好分配,redis会自动将前3台服务器作为主节点,后3台作为他们的从节点。

出现确定界面时,输入yes

验证

在服务器1上以集群模式进入redis:

redis-cli -c

然后存储一条数据:

127.0.0.1:6379> set testKey "testValue"
OK

在服务器2上以集群模式进入redis:

redis-cli -c

查询刚在服务器1上存储的数据:

127.0.0.1:6379> get testKey
-> Redirected to slot [5203] located at 192.168.0.127:6379
"testValue"

可以看到,连接自动转移至了服务器1并获取到了数据。

服务器数量较少时集群搭建时的优化方案

方案

若只有服务器数量较少,搭建redis集群时,一般情况下,服务器均为主节点,这时若一台崩溃,则该节点存储的数据将不可访问,可以在一台服务器上运行多个redis实例,以3台服务器为例,3台服务器共启动6个redis,交叉组成3主3从集群模式,如下:

服务器名称IPredis实例端口主从信息
服务器1192.168.0.1276379主1
服务器1192.168.0.1276380从3
服务器2192.168.0.326379主2
服务器2192.168.0.326380从1
服务器3192.168.0.266379主3
服务器3192.168.0.266380从2

这样,当一台服务器挂掉,其上的两个redis节点的数据可以从其他节点得到恢复,可提高集群的容错性,例如当服务器1挂掉时,其6379端口的redis上的数据会在其从节点服务器2的6380端口的redis上得到恢复,其6380端口的redis上的数据会在其主节点服务器3的6379端口的redis上得到恢复。

一台服务器上启动两个redis实例

redis是基于配置文件启动实例的,因此,若要在一台服务器上启动两个实例,相应的需要另一个配置文件和对应的启动脚本,redis安装以后,其默认配置文件为/etc/redis目录下的redis.conf文件,默认端口为6379,默认启动脚本文件为/etc/init.d/redis-server,首先复制一个新配置文件,并赋予用户组为redis

cd /etc/redis
sudo cp redis.conf redis-6380.conf
sudo chown redis:redis redis-6380.conf

然后编辑配置文件:

sudo vi /etc/redis/redis-6380.conf

编辑如下项:

port 6380    #设置redis端口,约在92行位置
pidfile /var/run/redis-6380/redis-server-6380.pid #pid文件路径,约在158行位置
logfile /var/log/redis/redis-server-6380.log #日志文件路径,约在171行位置
dbfilename dump6380.rdb #数据库持久化路径,约在253行位置
cluster-config-file nodes-6380.conf # 集群配置文件存储目录,约在840行位置

然后为新实例复制一个启动脚本:

sudo cp /etc/init.d/redis-server /etc/init.d/redis-server-6380

编辑脚本:

sudo vi /etc/init.d/redis-server-6380

更改脚本中的以下变量定义:

DAEMON_ARGS=/etc/redis/redis-6380.conf #启动时加载的配置文件
DESC=redis-server-6380 #描述
NAME=redis-server-6380 # 名称
RUNDIR=/var/run/redis-6380 # pid文件目录 与配置文件中的pidfile对应
PIDFILE=$RUNDIR/redis-server-6380.pid #pid文件路径

然后启动新的redis实例:

sudo /etc/init.d/redis-server-6380 start

这样,连同原有的一个redis,便有了两个redis,分别查看两个redis实例的运行状态:

sudo /etc/init.d/redis-server-6380 status
sudo /etc/init.d/redis-server status

这样配置后,每个redis便可以单独管理与运行,要进入哪个redis,只需表明端口号即可:

redis-cli -p 2380 -c

6个redis便可以搭建一个3主3从集群,配置同6台单独服务器。

可以将第二个redis实例也加入系统服务:

sudo update-rc.d redis-server-6380 defaults 80

集群管理命令

cluster info #打印集群的信息
cluster nodes #列出集群当前已知的所有节点(node),以及这些节点的相关信息   
节点(node)  
cluster meet <ip> <port> #将ip和port所指定的节点添加到集群当中,让它成为集群的一份子  
cluster forget <node_id> #从集群中移除node_id指定的节点
cluster replicate <node_id> #将当前节点设置为node_id指定的节点的从节点
cluster saveconfig #将节点的配置文件保存到硬盘里面
cluster slaves <node_id> #列出该slave节点的master节点
cluster set-config-epoch #强制设置configEpoch 
槽(slot)  
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) 
键(key)  
cluster keyslot <key> #计算键key应该被放置在哪个槽上  
cluster countkeysinslot <slot> #返回槽slot目前包含的键值对数量 
cluster getkeysinslot <slot> <count> #返回count个slot槽中的键
其它
cluster myid #返回节点的ID
cluster slots #返回节点负责的slot
cluster reset #重置集群,慎用