单机,单节点,单实例的Redis会有什么问题呢?

容易导致单点故障,那么如何解决呢?

可以通过主备方式

image

同时可以实现读写分离

image

这里的每个节点是全量的,镜像的。

单节点的容量有限而且单点的压力比较大,如何解决呢?

可以分不同的实例来存不同的业务数据

每种业务数据也可以根据不同的规则放到同一组的Redis库中

引入多个Redis实例后,会出现数据一致性的问题,如何解决呢?

如果要达到强一致性(同步方式),就容易导致不可用性,比如一个节点写成功后,同步到其他节点,假设其他节点有一个网络延迟或者故障,就会导致整个服务不可用,所以,如果要保证可用 ,需要容忍丢失一些数据(主节点写成功立即给客户端返回成功,异步把数据同步到其他备用节点)。如果要保证数据不丢失(保证最终一致性),可以考虑使用消息队列。

image

这里就要求消息队列本身是可靠的,这种方式保证了最终一致性,也会有问题,比如多个客户端访问的时候,有可能会取到不一致的数据。

主从方式

客户端可以访问主,也可以访问从

主备方式

客户端只访问主,不访问备,只有当主挂了才访问备

无论主从和主备,主都成了单点故障,如何解决这个问题呢?

所以必须要对主做HA(比如主挂了,从机顶上去做主机)
要对主进行HA,必须要选择一个高可用的监控程序,
监控程序的设计要考虑,是多个监控程序报告Redis挂了才算Redis真的挂了(如果不这样,容易产生脑裂问题,即:出现数据分区)

如果有N个节点,需要N/2+1个节点报告异常(过半),才算真的异常。

脑裂是否要处理,要看你的分区容忍性。

机器的台数是奇数比较好。

主从复制实验

通过install_server.sh脚本在一台机器安装三个redis实例

  • 6379

  • 6380

  • 6381

首先停掉这三个实例,然后把这三个实例的配置文件统一放到一个地方,我放在/data目录下

cp /etc/redic/*.conf /data/

修改三个实例的如下配置

# 关闭aof
appendonly no

# 设置前台运行
daemonize no

# 注释掉logfile
# logfile /var/log/redis_6379.log

然后启动三个实例

redis-server /data/6379.conf
redis-server /data/6380.conf
redis-server /data/6381.conf

启动客户端

redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381

把6380 和 6381 设置为6379的从机,在6380和6381两个客户端均执行

replicaof 127.0.0.1 6379

我们在6379客户端执行一条语句

set k1 from6379

然后在6380和6381都执行

127.0.0.1:6381> get k1
"from6379"

127.0.0.1:6380> get k1
"from6379"

可以看到从机同步到了主机的数据

在6380或者6381中任意一台的客户端执行

127.0.0.1:6381> set k2 asdfasd
(error) READONLY You can't write against a read only replica.

会提示如下信息:

(error) READONLY You can't write against a read only replica.

即在从机无法做写操作。

版权声明:本文为greyzeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/greyzeng/p/14815454.html