一.redis主从
在同一台机器上部署主从:
主上的配置
配置文件:
/etc/redis.conf
关于和主从有关的具体配置
bind 127.0.0.1
port 6379
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis_6379.log"
dir /data/redis
从上的配置
配置文件:
cp /etc/redis.conf /etc/redis2.conf
具体需要更改的配置:
port 6380
pidfile /var/run/redis_6380.pid
logfile "/var/log/redis_6380.log"
dir /data/redis2
还需要增加一行(指定主):
replicaof 127.0.0.1 6379 #我的redis是5以上
或者
Slaveof 127.0.0.1 6379 #5以下的
然后,创建从的数据目录:
mkdir /data/redis2
启动主从:
redis-server /etc/redis.conf
redis-server /etc/redis2.conf
查看:
netstat -lnpt |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6669/redis-server 1
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 10022/redis-server
进入从redis:
redis-cli -h 127.0.0.1 -p 6380
关于主从的补充:
如果主上配置了密码:
requirepass ligen #ligen是密码
那么从上也需要进行相应的配置:
masterauth ligen #后面是密码
从上默认只读:
replica-read-only yes
redis主从事先不用同步,设置之后自动同步。
二.redis集群
redis集群是从3.0之后才支持的架构,官方称之为cluster。
redis集群有什么用?
一个redis,数据量大的话太过于臃肿,超过设备读写能力将会十分缓慢,而且单一设备不安全,容易导致丢失。
什么是redis集群?
redis集群是有多个redis节点组成。每个redis节点有主从redis构成,其中主只有一个,从可以有多个,而且从一般只做备份。多个redis节点共享数据,所有的redis数据集合才是完整的。
redis集群的特点:
它不支持同时处理多个键,当并发量很高的时候,同时创建键值会降低性能且导致不可预测是行为。redis集群根据算法均匀把键均匀的分布在各个节点上。支持在线增加、删除节点。客户端可以连任何一个节点进行读写。
redis集群配置搭建:
环境准备,准备三台机器,每台机器两个节点一主一从(需要把前面的Slaveof 127.0.0.1 6379 从配置删除),总共6个redis节点:
192.168.247.160:6379 master
192.168.247.160:6380 slave
192.168.247.170:6379 master
192.168.247.170:6380 slave
192.168.247.180:6379 master
192.168.247.180:6380 slave
额外用一台机器用来集群搭建好之后的增加和删除节点:
192.168.247.160:6381 master
192.168.247.160:6382 slave
环境准备好后,开始集群配置:
其中两台的配置如下,其他改端口和文件名就可以:
bind 192.168.247.160
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
dir /var/redis_6379
appendonly yes
#开启集群
cluster-enabled yes
#集群的配置文件,首次启动会自动创建
cluster-config-file nodes-6379.conf
#集群节点连接超时时间,15秒
cluster-node-timeout 15000
bind 192.168.247.160
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
dir /var/redis_6380
appendonly yes
#开启集群
cluster-enabled yes
#集群的配置文件,首次启动会自动创建
cluster-config-file nodes-6380.conf
#集群节点连接超时时间,15秒
cluster-node-timeout 15000
如果开启了firewalld,所有机器都需要增加如下规则:
firewall-cmd --permanent --add-port 6379-6380/tcp
firewall-cmd --permanent --add-port 16379-16380/tcp
firewall-cmd --reload
构建集群:
redis-cli --cluster create 192.168.247.160:6379 192.168.247.160:6380 192.168.247.170:6379 192.168.247.170:6380 192.168.247.180:6379 192.168.247.180:6380 --cluster-replicas 1
显示:
注意:如果提示如下错误
则是由于上次redis集群没有配置成功,生成了每个节点的配置文件和db的备份文件,所以才会产生这个错误。
所以办法就是删除redis数据目录文件。
redis集群增加节点
增加主节点192.168.247.160:6381 master
首先配置好配置文件:
bind 192.168.247.160
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
dir /data/redis_6381
appendonly yes
#开启集群
cluster-enabled yes
#集群的配置文件,首次启动会自动创建
cluster-config-file nodes-6381.conf
#集群节点连接超时时间,15秒
cluster-node-timeout 15000
创建目录:
mkdir /data/redis_6381
启动:
redis-server /etc/redis3.conf
将6381增加到集群中:
redis-cli --cluster add-node 192.168.247.160:6381 192.168.247.160:6380
#命令格式:6381 为要添加的节点
#6380 为已经存在的节点
#此时该节点只是作为主节点添加到了集群中,但是没有进行分片,是不可存储数据的,如果要存储数据,需要进行分片操作。
给6381节点分配槽:
redis-cli --cluster reshard 192.168.247.160:6381
查看节点:
为6381添加从节点
配置配置文件,跟之前类似,只需要修改端口和文件名就行。
启动之后,执行:
redis-cli --cluster add-node 192.168.247.160:6382 192.168.247.160:6381 --cluster-slave --cluster-master-id cb03a50941a8818e2f7bf4acfbbc68c4dbaf97e8
#添加从且指定主
#cb03a50941a8818e2f7bf4acfbbc68c4dbaf97e8 是master的id
redis集群操作
连接集群:
可以在任何一个节点上去连接集群,创建键值redis将根据算法分到主节点上
redis-cli -c -h 192.168.247.160 -p 6380
说明:在创建key的过程中,它会把不同的key分配到不同的slot中,即使我们登录到了129:6380,但在写入数据时,它会选择其他节点。
查看集群情况:
redis-cli --cluster check 192.168.247.180:6379 #任意节点都可以查看
删除集群节点:
redis-cli --cluster del-node 192.168.247.160:6382 88e3937e0e468ef8417ce47ad6e5aa5cfeb29b42
#这里必须是没有槽的节点,所以必须先移除槽,否则报错 被删除的node重启后,依然记得集群中的其它节点,这是需要执行cluster forget nodeid来忘记其它节点
删除主节点:
首先要归还槽,过程和分配槽类似,只不过是归还:
redis-cli --cluster reshard 192.168.247.160:6381
删除主节点,和删除从一样:
redis-cli --cluster del-node 192.168.247.160:6381 cb03a50941a8818e2f7bf4acfbbc68c4dbaf97e8