安装说明 安装选用的Linux版本为CentOS 7
Redis的官网地址:http://redis.io/
单机安装Redis 安装Redis 下载源文件
wget https://download.redis.io/redis-stable.tar.gz
解压到/opt
tar -xzvf redis-stable.tar.gz -C /opt
编译安装
cd /opt/redis-stable make make install
编译遇到Python 3错误 编译时如果遇到Python3报错,需要先安装Python3,当然默认的Python2是不能卸载的。
安装依赖包
yum -y groupinstall "Development tools" yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
下载Python
wget https://www.python.org/ftp/python/3.6.2/Python-3.6.2.tar.xz
新建空文件夹
解压并安装
tar -xvJf Python-3.6.2.tar.xzcd Python-3.6.2 ./configure --prefix=/usr/local/python3 make && make install
最后创建软链接
ln -s /usr/local/python3/bin/python3 /usr/bin/python3ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3
编译错误zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory 编译错误zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
使用下面的命令:
然后再安装
默认会安装在/usr/local/bin
中
配置Redis 配置文件位置在/etc/redis.conf
,使用下面命令编辑
修改配置文件
bind 0.0.0.0 daemonize yes requirepass 123123
其他常见配置,可不修改
prot 6397dir ./ databases 16 maxmemory 512mb logfile "redis.log"
重启redis
sudo systemctl restart redis
Redis主从集群
共包含三个节点,一个主节点,两个从节点。
这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:
IP
PORT
角色
192.168.52.101
7001
master
192.168.52.101
7002
slave
192.168.52.101
7003
slave
准备实例和配置 要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。
1)创建目录
我们创建三个文件夹,名字分别叫7001、7002、7003:
cd /optmkdir 7001 7002 7003
2)修改配置文件
开启RDB(默认开启),关闭AOF(默认关闭)
save 3600 1 save 300 100 save 60 10000 appendonly no
3)拷贝配置文件到每个实例目录
将/etc/redis.conf
文件拷贝到三个目录中
cd /optecho 7001 7002 7003 | xargs -t -n 1 cp /opt/redis-stable/redis.conf
4)修改每个实例的端口、工作目录
修改每个文件夹中的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置修改到自己所在的目录
cd /opt sed -i -e 's/6379/7001/g' -e 's/dir \/var\/lib\/redis/dir \/tmp\/7001\//g' 7001/redis.conf sed -i -e 's/6379/7002/g' -e 's/dir \/var\/lib\/redis/dir \/tmp\/7002\//g' 7002/redis.conf sed -i -e 's/6379/7003/g' -e 's/dir \/var\/lib\/redis/dir \/tmp\/7003\//g' 7003/redis.conf
5)修改每个实例的声明IP
虚拟机本身有多个IP,为了避免混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息
sed -i '1a replica-announce-ip 192.168.52.101' 7001/redis.conf sed -i '1a replica-announce-ip 192.168.52.101' 7002/redis.conf sed -i '1a replica-announce-ip 192.168.52.101' 7003/redis.confprintf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.52.101' {}/redis.conf
启动 为了方便查看日志,可以启动3个ssh窗口,分别启动3个redis实例。启动命令:
cd /opt redis-server 7001/redis.conf redis-server 7002/redis.conf redis-server 7003/redis.conf
开启主从关系 现在三个实例还没有任何关系,要配置主从可以使用replicaof或者slaceof(5.0以前)命令。
有临时和永久两种模式:
注意:在5.0以后新增命令replicaof,与slaveof效果一致。
使用客户端方式:
再打开一个终端,用于客户端连接
redis-cli -p 7002 SLAVEOF 192.168.52.101 7001 redis-cli -p 7003 SLAVEOF 192.168.52.101 7001
当看到7001出现下面提示,即成功。
104351:M 15 Nov 2022 21:57:38.427 * Ready to accept connections 104351:M 15 Nov 2022 21:57:54.722 * Replica 192.168.52.101:7002 asks for synchronization 104351:M 15 Nov 2022 21:57:54.722 * Partial resynchronization not accepted: Replication ID mismatch (Replica asked for 'f05f17dfba099a756e9a2fced1a1444fbc9fb60e' , my replication IDs are 'c33ebaeb03975554c7e534413fbd136b47ab377b' and '0000000000000000000000000000000000000000' ) 104351:M 15 Nov 2022 21:57:54.722 * Replication backlog created, my new replication IDs are '72984f6fa2a4549194b49eba1df261c33d73fdfa' and '0000000000000000000000000000000000000000' 104351:M 15 Nov 2022 21:57:54.722 * Delay next BGSAVE for diskless SYNC 104351:M 15 Nov 2022 21:57:59.299 * Starting BGSAVE for SYNC with target: replicas sockets 104351:M 15 Nov 2022 21:57:59.299 * Background RDB transfer started by pid 104362 104362:C 15 Nov 2022 21:57:59.302 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB 104351:M 15 Nov 2022 21:57:59.302 104351:M 15 Nov 2022 21:57:59.304 * Background RDB transfer terminated with success
出现 Error condition on socket for SYNC: Connection refused 出现 Error condition on socket for SYNC: Connection refused
问题描述
104319:S 15 Nov 2022 21:43:43.662 * Connecting to MASTER 192.168.52.101:7001 104319:S 15 Nov 2022 21:43:43.662 * MASTER <-> REPLICA sync started 104319:S 15 Nov 2022 21:43:43.662
解决方案
修改配置文件中的bind字段
出现 -DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user. 出现 -DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user.
问题描述
Error reply to PING from master: '-DENIED Redis is running in protected mode because protected mode is enabled and no password is set for the default user.'
解决方案1
因为主服务器开启了保护模式或者设置了密码,关闭保护模式
解决方案2
设置密码
CONFIG SET masterauth 123123
测试 使用客户端连接7001,查看主从信息
redis-cli -p 7001 127.0.0.1:7001> INFO replication role:master connected_slaves:2 slave0:ip=192.168.52.101,port=7002,state=online,offset=504,lag=0 slave1:ip=192.168.52.101,port=7003,state=online,offset=504,lag=0 master_failover_state:no-failover master_replid:72984f6fa2a4549194b49eba1df261c33d73fdfa master_replid2:0000000000000000000000000000000000000000 master_repl_offset:504 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:504
在7001中set
一个数据,在其他Redisget
redis-cli -p 7001set num 123 redis-cli -p 7002 get num
当我们在从节点set
时会报错
set num 666 (error) READONLY You can't write against a read only replica.
搭建哨兵集群 这里我们搭建一个三节点形成的Sentinel集群,来监督之前的Redis主从集群。如图:
三个Sentinel实例信息如下:
节点
IP
PORT
s1
192.168.52.101
27001
s2
192.168.52.101
27002
s3
192.168.52.101
27003
准备实例和配置 要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录
创建三个文件夹,名字分别叫s1、s2、s3:
然后我们在s1目录创建一个sentinel.conf
文件,添加以下内容
port 27001 sentinel announce-ip 192.168.52.101 sentinel monitor mymaster 192.168.52.101 7001 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000dir "/opt/s1"
参数解释:
port 27001
:是当前sentinel实例的端口
sentinel monitor mymaster 192.168.52.101 7001 2
:指定主节点信息
mymaster
:主节点名称,自定义,任意写
192.168.150.101 7001
:主节点的ip和端口
2
:选举master时的quorum值
然后将s1/sentinel
文件拷贝到s2、s3两个目录(在/opt
目录执行命令)
cp s1/sentinel.conf s2cp s1/sentinel.conf s3echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
修改s2、s3两个文件夹内的配置文件,将端口分别修改27002、27003:
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf
启动 为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:
redis-sentinel s1/sentinel.conf redis-sentinel s2/sentinel.conf redis-sentinel s3/sentinel.conf
启动后:
测试 测试前请保证redis主从集群已开启,sentinel集群也开启
关闭7001,后来到sentinel窗口,可以看到窗口中有日志
+sdown master mymaster 192.168.52.101 7001 +odown master mymaster 192.168.52.101 7001 +new-epoch 6 +try-failover master mymaster 192.168.52.101 7001 Sentinel new configuration saved on disk +vote-for-leader f8060fe283e55014ffedb8129a3109917856aa72 6 5352ec72f29b4649d332d945d38f45dac88b4784 voted for f8060fe283e55014ffedb8129a3109917856aa72 6 e3fcf15bfe26030bd793a3ebb37394f50e34702c voted for f8060fe283e55014ffedb8129a3109917856aa72 6 +elected-leader master mymaster 192.168.52.101 7001 +failover-state-select-slave master mymaster 192.168.52.101 7001 +selected-slave slave 192.168.52.101:7002 192.168.52.101 7002 @ mymaster 192.168.52.101 7001 +failover-state-send-slaveof-noone slave 192.168.52.101:7002 192.168.52.101 7002 @ mymaster 192.168.52.101 7001 +failover-state-wait-promotion slave 192.168.52.101:7002 192.168.52.101 7002 @ mymaster 192.168.52.101 7001 Sentinel new configuration saved on disk +promoted-slave slave 192.168.52.101:7002 192.168.52.101 7002 @ mymaster 192.168.52.101 7001 +failover-state-reconf-slaves master mymaster 192.168.52.101 7001 +slave-reconf-sent slave 192.168.52.101:7003 192.168.52.101 7003 @ mymaster 192.168.52.101 7001 -odown master mymaster 192.168.52.101 7001 +slave-reconf-inprog slave 192.168.52.101:7003 192.168.52.101 7003 @ mymaster 192.168.52.101 7001 +slave-reconf-done slave 192.168.52.101:7003 192.168.52.101 7003 @ mymaster 192.168.52.101 7001 +failover-end master mymaster 192.168.52.101 7001 +switch-master mymaster 192.168.52.101 7001 192.168.52.101 7002
从日志中可以看到是7002
被选举成为新的master
再次启动7001
,会自动成为slave
搭建分片集群
主从模式、哨兵集群感觉没啥用,就不搭建了,这里直接搭建真·Redis集群
集群结构 分片集群需要的节点数量较多,这里我们搭建了一个最小的分片集群,包含3个master节点,每个master包含一个slave节点,结构如下:
这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:
IP
PORT
角色
192.168.52.101
7001
master
192.168.52.101
7002
master
192.168.52.101
7003
master
192.168.52.101
8001
slave
192.168.52.101
8002
slave
192.168.52.101
8003
slave
准备实例和配置 删除之前的7001、7002、7003这几个目录,重新创建出7001、7002、7003、8001、8002、8003目录:
cd /optrm -rf 7001 7002 7003mkdir 7001 7002 7003 8001 8002 8003
在/tmp下准备一个新的redis.conf文件,内容如下:
port 6379 cluster-enabled yes cluster-config-file /opt/6379/nodes.conf cluster-node-timeout 5000 dir /opt/6379 bind 0.0.0.0 daemonize yes replica-announce-ip 129.168.52.101 protected-mode no databases 1 logfile /opt/6379/run.log
将这个文件拷贝到每个目录下:
cd /optecho 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf
修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:
cd /optprintf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf
启动 因为已经配置了后台启动模式,所以可以直接启动服务:
cd /optprintf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf
通过ps查看状态:
如果要关闭所有进程,可以执行命令
ps -ef | grep redis | awk '{print $2}' | xargs kill
或者(推荐这种方式):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown
创建集群 虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。
我们需要执行命令来创建集群,在Redis5.0之前创建集群比较麻烦,5.0之后集群管理命令都集成到了redis-cli中。
1)Redis5.0之前 Redis5.0之前集群命令都是用redis安装包下的src/redis-trib.rb来实现的。因为redis-trib.rb是有rubby语法编写所以需要安装ruby环境。
yum -y install zlib ruby rubygems gem install redis
然后通过命令来管理集群:
cd /opt/redis-stable/src ./redis-trib.rb create --teplicas 1 192.168.52.101:7001 192.168.52.101:7002 192.168.52.101:7003 192.168.52.101:8001 192.168.52.101:8002 192.168.52.101:8003
2)Redis5.0之后 我们使用的是Redis7.0.5版本,集群管理已经集成到了redis-cli中,格式如下:
redis-cli --cluster create --cluster-replicas 1 192.168.52.101:7001 192.168.52.101:7002 192.168.52.101:7003 192.168.52.101:8001 192.168.52.101:8002 192.168.52.101:8003
命令说明:
redid-cli --cluster
或者./redis-trib.rb
:代表集群操作命令
create
:代表是创建集群
--replicas 1
或者--cluster-replicas 1
:指定集群中每个master的副本个数为1,此时节点总数 / (replicas + 1)
得到的就是master的数量。因此节点列表中的前n个就是master,其他节点都是slave节点,随机分配到不同master
运行后的样子:
这里输入yes
通过命令可以查看集群状态:
redis-cli -p 7001 cluster nodes
测试 使用下面命令连接Redis集群
set一个值
127.0.0.1:7001> set num 123 OK
再set一个值
set a 1 -> Redirected to slot [15495] located at 192.168.52.101:7003 OK 192.168.52.101:7003>
a计算得到的hash值为15495,该值所在的节点为7003
get一个值
192.168.52.101:7003> get a"1"
再get一个值
192.168.52.101:7003> get num -> Redirected to slot [2765] located at 192.168.52.101:7001"123" 192.168.52.101:7001>
可以看到已经切换到7001了