NoSQL——redis集群——主从同步/复制


前言

redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster

在Redis中,实现高可用的技术主要包括持久化、主从复制、哨兵和集群,下而分别说明它们的作用,以及解决了什么样的问题
① 主从复制 主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,
以及对于读操作的负载均衡和简单的故障恢复。
缺陷:故障恢复无法自动化:写操作无法负载均衡:存储能力受到单机的限制。
② 哨兵
在主从复制的基础上,哨兵实现了自动化的故障恢复。
缺陷:写操作无法负载均衡:存储能力受到单机的限制。
③ 集群
通过集群,Redis解决了写操作无法负载均衡,以及存储能力受到单机限制的问题,实现了较为完善的高可用方案。

这里先介绍一下主从同步/复制。


一、Redis群集

① redis是一个开源的kevvalue存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群 redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;

② 为了实现集群的高可用,即判新节点是否健康(能否正常使用), redis-cluster有一个投票容错机制:
如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法:
- 判新集群是否正常:
- 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了
的方法
那么为什么任意一个节点挂了(没有从节点)这个集群就挂了:

PS:
因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。
当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
示例(三个节点) :
- 节点A覆盖0-5460;
- 节点B覆盖5461-10922;
- 节点C覆盖10923-16383
即:每个节点有5460个哈希槽
新增一个节点:
- 节占A覆盖1365-5460
- 节占B覆盖6827-10922
- 节点C覆盖12288-16383
- 节点D覆盖0-1364.5461-6826.10923-12287
即:每个节点有4095个哈希槽
综上所述,每个Redis集群理论上最多可以有16384个节点

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。

二、Redis模式介绍

1. 主从模式

通过持久化功能,redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中的数据保存到硬盘上,重启会从硬猛上加载数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也公导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务,为此,redis提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。

在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据(slave)。主数据可以进行读写操作,当写操做导致数据变化时自动将数据同步给数据库,而从数据库一般是只读的,并接收主数据同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

扫描二维码关注公众号,回复: 13465757 查看本文章

2. 主从复制流程

① 若启动一个Slave机器进程,则它会向Master机器发送一个"sync_command"命令,请求同步连接

② 无论是第一次连接还是重新连接,Master机器都会启动一个后台进程,将数据快照(RDB)保存到
数据文件中(执行rdb操作),同时Master还会记录修改数据的所有命令并缓存在数据文件中。

③ 后台进程完成缓存操作之后,Master机器就会向Slave机器发送数据文件,Slave端机器将数据
文件保存到硬盘上,然后将其加载到内存中,接着Master机器就会将修改数据的所有操作一并发送给Slave端机器。若Slave出现故障导致宕机,则恢复正常后会自动重新连接。

④ Master机器收到slave端机器的连接后,将其完整的数据文件发送给Slave端机几器,如果Mater同时收到多个slave发来的
同步请求则Master会在后台启动一个进程以保存数据文件,然后将其发送给所有的Slave端机器,确保所有的Slave端机器都正常。

3. 搭建Redis主从复制

节点名 IP地址
master 192.168.237.123
slave1 192.168.226.124
slave2 192.168.226.125

①安装Redis
三台服务器都需要安装

#按需求关闭安全策略
systemctl stop firewalld
systemctl disable firewalld
setenforce 0

yum -y install gcc gcc-c++ make

cd /opt
wget -P /opt http://download.redis.io/releases/redis-5.0.9.tar.gz
tar -zxvf redis-5.0.9.tar.gz

cd redis-5.0.9
make && make PREFIX=/usr/local/redis install 
#Redis源码包中直接提供了makefile文件 直接执行make与make install命令进行安装

cd /opt/redis-5.0.9/utils/
./install_server.sh   

#回车,直到出现以下选项,手动修改为“/usr/local/redis/bin/redis-server”
Please select the redis executable path [/usr/local/bin/redis-server] /usr/local/redis/bin/redis-server

ln -s /usr/local/redis/bin/* /usr/local/bin/

#检查服务状态
ss -natp | grep "redis"

② 修改Redis配置文件

Master节点

vim /etc/redis/6379.conf

bind 0.0.0.0                        
#70行,修改监听地址为 0.0.0.0
daemonize yes                       
#137行,开启守护进程
logfile /var/1og/redis_6379.1og    
#172行,指定日志文件目录
dir /var/lib/redis/6379             
#264行,指定工作目录
appendonly yes                      
#700行,开启 AOF 持久化功能

/etc/init.d/redis_6379 restart
#重启服务使配置生效

Slave1/2节点

vim /etc/redis/6379.conf

bind 0.0.0.0                        
#70行,修改监听地址为 0.0.0.0
daemonize yes                       
#137行,开启守护进程
logfile /var/log/redis_6379.log   
#172行,指定日志文件目录
dir /var/lib/redis/6379             
#264行,指定工作目录
replicaof 192.168.237.123 6379       
#288行,指定要同步的 Master 节点 IP 和端口
appendonly yes                      
#700行,开启 AOF 持久化功能

/etc/init.d/redis_6379 restart
#重启服务使配置生效

③ 验证主从效果

主节点输入
tail -f /var/log/redis_6379.log

redis-cli info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.237.125,port=6379,state=online,offset=28,lag=1
slave1:ip=192.168.237.124,port=6379,state=online,offset=28,lag=1
#master启动时生成的40位16进制的随机字符串,用来标识master节点
master_replid:0a1c276e72f872fc6db0e2d9171d874014a7000d		
#切换主从的时候master节点标识会有更改
master_replid2:0000000000000000000000000000000000000000
#复制流中的一个偏移量,master处理完写入命令后,会把命令的字节长度做累加记录,统计在该字段。该字段也是实现部分复制的关键字段。
master_repl_offset:42
#无论主从,都表示自己上次主实例repid1和复制偏移量;用于兄弟实例或级联复制,主库故障切换psync
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:42

[root@node1 utils]# redis-cli
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set teacher zhangsan
OK
127.0.0.1:6379> get teacher
"zhangsan"

④ 报错排查
1)WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
当前每一个端口最大的监听队列的长度不满足这个高负载环境,需要调整

解决办法

echo 2048 > /proc/sys/net/core/somaxconn

2)WARNING overcommit_memory is set to 0! Background save may fail under low memory condition
内存超额警告,当前内存设置为0会导致后台保存失败

解决办法:

echo "vm.overcommit_memory=1" > /etc/sysctl.conf
#刷新配置文件保其生效
sysctl vm.overcommit_memory=1

3)WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis
内核中启用了透明大页面(THP)支持会将导致Redis的延迟和内存使用问题

解决:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

4)Error condition on socket for SYNC: Connection reset by peer
连接被拒绝,因为主服务器可能绑定了自身IP地址

解决办法:

#主节点配置文件
bind 0.0.0.0

总结

猜你喜欢

转载自blog.csdn.net/weixin_55609819/article/details/121342143