一、Redis基础知识
1、概念
Redis是一个开源的、遵循BSD协议的、基于内存的而且目前比较流行的键值数据库(key-value database),是一个非关系型数据库,redis 提供将内存通过网络远程共享的一种服务,提供类似功能的 还有memcached,但相比memcached,redis还提供了易扩展、高性能、具备数据持久性等功能。 Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛。
2、特点
速度快: 10W QPS,基于内存,C语言实现;单线程;持久化;支持多种数据结构;支持多种编程语言;功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能;简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单;主从复制;支持高可用和分布式。
二、Redis源码安装
解压源码包
tar zxf redis-7.4.0.tar.gz
执行编译命令
dnf install initscripts make gcc -y
cd redis-7.4.0/
make && make install
报错提示系统使用的是systemd的初始化方式,解决报错
vim install_server.sh
启动Redis
./install_server.sh
三、配置主从同步
1、主从同步过程
1.1、slave节点发送同步请求到master节点
1.2、slave节点通过master节点的认证开始进行同步
1.3、master节点会开启bgsave进程发送内存rbd到slave节点,在此过程中是异步操作,也就是说 master节点仍然可以进行写入动作
1.4、slave节点收到rdb后首先清空自己的所有数据
1.5、slave节点加载rdb并进行数据恢复
1.6、在master和slave同步过程中master还会开启新的bgsave进程把没有同步的数据进行缓存
1.7、通过自有的replactionfeedslave函数把未通过内存快照发动到slave的数据一条一条写入到 slave中
2、配置master节点
vim /etc/redis/6379.conf
/etc/init.d/redis_6379 restart
复制到其他两台主机
scp -r redis-7.4.0 root@172.25.254.20:/root
scp -r redis-7.4.0 root@172.25.254.30:/root
rsync -al * root@172.25.254.20:/usr/local/bin
rsync -al * root@172.25.254.30:/usr/local/bin
3、配置slave节点
yum install initscripts -y
vim /etc/redis/6379.conf
/etc/init.d/redis_6379 restart
测试:
在mastser节点新建
在slave节点查看
四、Redis的哨兵(高可用)
编辑配置文件
cd redis-7.4.0/
cp sentinel.conf /etc/redis/
vim /etc/redis/sentinel.conf
scp /etc/redis/sentinel.conf root@172.25.254.20:/etc/redis/
scp /etc/redis/sentinel.conf root@172.25.254.30:/etc/redis/
启动服务
redis-sentinel /etc/redis/sentinel.conf
再开一个master节点终端
[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> shutdown
在salve查看
[root@redis-node2 ~]# redis-cli
127.0.0.1:6379> info replications
127.0.0.1:6379> info replication
五、Redis Cluster(无中心化设计)
1、Redis Cluster 工作原理
在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master, 从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受 限于单机的内存大小、并发数量、网卡速率等因素。 redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存 当前节点数据和整个集群状态,每个节点都和其他所有节点连接
2、部署redis cluster
删除源码编译的redis
cd redis-7.4.0/
make uninstall
创建3台cluster
6台redis同时安装
dnf install redis -y
vim /etc/redis/redis.conf
集群主从认证
复制配置文件给其他主机
for i in 20 30 110 120 130; do scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf; done
systemctl enable --now redis
3、创建redis-cluster
redis-cli --cluster create -a 123456 172.25.254.10:6379 172.25.254.20:6379 172.25.254.30:6379 172.25.254.110:6379 172.25.254.120:6379 172.25.254.130:6379 --cluster-replicas 1
查看集群状态
redis-cli -a 123456 --cluster info 172.25.254.10:6379
redis-cli -a 123456 cluster info
写入数据
redis-cli -a 123456
127.0.0.1:6379> set name hao
报错提示可知被分配到20的hash槽位上
4、集群扩容
scp /etc/redis/redis.conf root@172.25.254.50:/etc/redis/redis.conf
scp /etc/redis/redis.conf root@172.25.254.150:/etc/redis/redis.conf
redis-cli -a 123456 --cluster add-node 172.25.254.50:6379 172.25.254.10:6379
redis-cli -a 123456 --cluster check 172.25.254.10:6379
但这时的50没有槽位,不可以存数据
分配槽位
redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
添加salve
redis-cli -a 123456 --cluster add-node 172.25.254.150:6379 172.25.254.10:6379 --cluster-slave --cluster-master-id d80777be39c2f55697310daf69bdc0b6f47eb2f9
5、clsuter集群维护
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相 反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如 果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。
移除要下线主机50的哈希槽位
redis-cli -a 123456 --cluster reshard 172.25.254.10:6379
删除master
redis-cli -a 123456 --cluster del-node 172.25.254.150:6379 1c2bdbf84e07f3abf080e8106d6eb84ce3734bcd
redis-cli -a 123456 --cluster del-node 172.25.254.50:6379 d80777be39c2f55697310daf69bdc0b6f47eb2f9
redis-cli -a 123456 --cluster check 172.25.254.10:6379