一、redis单实例安装
- 下载安装
cd /data/program/redis
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar -zxvf redis-6.0.9.tar.gz
- 安装gcc依赖
Redis是C语言编写的,编译需要GCC。
Redis6.x.x版本支持了多线程,需要gcc的版本大于4.9,但是CentOS7的默认版本是4.8.5。
查看gcc的版本:
gcc -v
#提示 -bash: gcc: command not found
yum install gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
- 编译安装
cd redis-6.0.9/src
make install
安装成功的结果是src目录下面出现服务端和客户端的脚本
redis-server
redis-cli
redis-sentinel
- 修改配置文件
默认的配置文件是/data/program/redis/redis-6.0.9/redis.conf
后台启动,不然窗口一关服务就挂了
#守护线程启动(后台启动)
daemonize yes
下面一行必须改成 bind 0.0.0.0,否则只能在本机访问
bind 127.0.0.1 -> bind 0.0.0.0
如果需要密码访问,取消requirepass的注释,在外网(比如阿里云)这个必须要配置!
requirepass yourpassword
- 使用指定配置文件启动Redis
/data/program/redis/redis-6.0.9/src/redis-server /data/program/redis/redis-6.0.9/redis.conf
查看端口是否启动成功:
netstat -an|grep 6379
- 进入客户端
/data/program/redis/redis-6.0.9/src/redis-cli
- 停止redis(在客户端中)
redis> shutdown
- 配置别名的步骤
vim ~/.bashrc
添加两行:
alias redis='/data/program/redis/redis-6.0.9/src/redis-server /data/program/redis/redis-6.0.9/redis.conf'
alias rcli='/data/program/redis/redis-6.0.9/src/redis-cli'
编译生效:
source ~/.bashrc
这样就可以用redis启动服务,rcli进入客户端了
- Redis可视化客户端
redis-desktop-manager
二、Redis6.0.9一主二从Sentinel
开启哨兵模式,至少需要3个Sentinel实例(奇数个,否则无法选举Leader)。
本例通过3个Sentinel实例监控3个Redis服务(1主2从)。
IP地址 节点角色&端口
192.168.184.45 Master:6379 / Sentinel : 26379
192.168.184.46 Slave :6379 / Sentinel : 26379
192.168.184.47 Slave :6379 / Sentinel : 26379
网络结构图:
- 修改redis.conf
在46,47的redis.conf配置中找到注释的这一行
# replicaof <masterip> <masterport>
replicaof 192.168.184.45 6379
- 在45、46、47创建sentinel配置文件(单例安装后根目录下默认有sentinel.conf,可以先备份默认的配置)
cd /usr/local/soft/redis-6.0.9
mkdir logs
mkdir rdbs
mkdir sentinel-tmp
cp sentinel.conf sentinel.conf.bak
>sentinel.conf
vim sentinel.conf
sentinel.conf配置文件内容,三台机器相同
daemonize yes
port 26379
protected-mode no
dir "/usr/local/soft/redis-6.0.9/sentinel-tmp"
sentinel monitor redis-master 192.168.184.45 6379 2
sentinel down-after-milliseconds redis-master 30000
sentinel failover-timeout redis-master 180000
sentinel parallel-syncs redis-master 1
配置 | 作用 |
---|---|
protected-mode | 是否允许外部网络访问,yes不允许 |
dir | sentinel的工作目录 |
sentinel monitor | sentinel监控的redis主节点 |
down-after-milliseconds(毫秒) | master宕机多久,才会被Sentinel主观认为下线 |
sentinel failover-timeout(毫秒) | 1 同一个sentinel对同一个master两次failover之间的间隔时间。2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。3.当想要取消一个正在进行的failover所需要的时间。 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。 |
parallel-syncs | 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。 |
- 在3台机器上分别启动Redis和Sentinel
cd /data/program/redis/redis-6.0.9/src
./redis-server ../redis.conf
./redis-sentinel ../sentinel.conf
哨兵节点的另一种启动方式:
./redis-server ../sentinel.conf --sentinel
- 在3台机器上查看集群状态:
$ /data/program/redis/redis-6.0.9/src/redis-cli
redis> info replication
主节点显示:
从节点显示:
从节点执行set报错
5. 模拟master宕机
redis>shutdown
主节点变成192.168.184.47
注意看sentinel.conf里面的redis-master被修改了,变成了当前的master端口
sentinel monitor redis-master 192.168.184.47 6379 2
再次启动原master节点 192.168.184.45,发现它成为当前master 192.168.184.47的从节点
三、Redis Cluster集群(3主3从伪集群)
为了节省机器,我们直接把6个Redis实例安装在同一台机器上(3主3从),只是使用不同的端口号。
机器IP 192.168.99.112
可以跟单机的redis安装在同一台机器上,因为数据目录不同,没有影响。
cd /data/program/redis/redis-6.0.9
mkdir redis-cluster
cd redis-cluster
mkdir 7291 7292 7293 7294 7295 7296
复制redis配置文件到7291目录
cp /data/program/redis/redis-6.0.9/redis.conf /data/program/redis/redis-6.0.9/redis-cluster/7291
修改7291的redis.conf配置文件,内容:
cd /data/program/redis/redis-6.0.9/redis-cluster/7291
>redis.conf
vim redis.conf
port 7291
daemonize yes
protected-mode no
dir /data/program/redis/redis-6.0.9/redis-cluster/7291/
cluster-enabled yes
cluster-config-file nodes-7291.conf
cluster-node-timeout 5000
appendonly yes
pidfile /var/run/redis_7291.pid
把7291下的redis.conf复制到其他5个目录。
cd /data/program/redis/redis-6.0.9/redis-cluster/7291
cp redis.conf ../7292
cp redis.conf ../7293
cp redis.conf ../7294
cp redis.conf ../7295
cp redis.conf ../7296
批量替换内容
cd /data/program/redis/redis-6.0.9/redis-cluster
sed -i 's/7291/7292/g' 7292/redis.conf
sed -i 's/7291/7293/g' 7293/redis.conf
sed -i 's/7291/7294/g' 7294/redis.conf
sed -i 's/7291/7295/g' 7295/redis.conf
sed -i 's/7291/7296/g' 7296/redis.conf
启动6个Redis节点
cd /data/program/redis/redis-6.0.9
./src/redis-server redis-cluster/7291/redis.conf
./src/redis-server redis-cluster/7292/redis.conf
./src/redis-server redis-cluster/7293/redis.conf
./src/redis-server redis-cluster/7294/redis.conf
./src/redis-server redis-cluster/7295/redis.conf
./src/redis-server redis-cluster/7296/redis.conf
是否启动了6个进程
ps -ef|grep redis
创建集群
cd /data/program/redis/redis-6.0.9/src/
redis-cli --cluster create 192.168.99.112:7291 192.168.99.112:7292 192.168.99.112:7293 192.168.99.112:7294 192.168.99.112:7295 192.168.99.112:7296 --cluster-replicas 1
Redis会给出一个预计的方案,对6个节点分配3主3从,如果认为没有问题,输入yes确认
重置集群的方式是在每个节点上个执行cluster reset,然后重新创建集群。
连接到客户端
redis-cli -p 7291
redis-cli -p 7292
redis-cli -p 7293
新增节点如何重新分片:
一个新节点add-node加入集群后,是没有slots的。
redis-cli --cluster reshard 目标节点(IP端口)
这时会要求你输入分配的槽位,生成reshard计划,确定就会迁移数据
集群命令:
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点(node),以及这些节点的相关信息。
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点(保证空槽道)。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽slot命令:
cluster addslots [slot …] :将一个或多个槽(slot)指派(assign)给当前节点。
cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入(import)或者迁移(migrate)。
键命令:
cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键