Java批量推送redis集群_Redis集群

RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题

分布式数据库概念:

1,分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集,比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点

e1c29dea8ea3970d12ad9f3af09c9942.png

2,分区规则:

常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区,顺序分区暂用不到,不做具体说明;rediscluster采用了哈希分区的“虚拟槽分区”方式(哈希分区分节点取余、一致性哈希分区和虚拟槽分区),其它两种也不做介绍,有兴趣可以百度了解一下。

3,虚拟槽分区(槽:slot)

RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据,哈希函数: Hash()=CRC16[key]&16383 按位与

槽与节点的关系如下

780cad8cd1cf22a21b5ff9a5bdd53d72.png

redis用虚拟槽分区原因:1,解耦数据与节点关系,节点自身维护槽映射关系,分布式存储

4,redisCluster的缺陷:

a,键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的槽,就不支持了

b,键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务

c,键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点

d,不支持多数据库,只有0,select 0

e,复制结构只支持单层结构,不支持树型结构。

集群环境搭建-手动篇:

1,在/usr/local/bin/clusterconf目录,

3d53f79d100075dcbb0c79ab4f7490ca.png

6389为6379的从节点,6390为6380的从节点,6391为6381的从节点

2,分别修改6379、 6380、 7381、 6389、 6390、 6391配置文件

port 6379                      //节点端口

cluster-enabled yes              //开启集群模式

cluster-node-timeout 15000       //节点超时时间(接收pong消息回复的时间)

cluster-config-file  /usrlocalbin/cluster/data/nodes-6379.conf 集群内部配置文件

其它节点的配置和这个一致,改端口即可

3,配置完后,启动6个redis服务

命令:cd /usr/local/bin/clusterconf/data

cat nodes-6379.conf  //查看6379节点ID值

27abf986278fb413c540f15171d8e8d3.png

也可以这样查看        6379>cluster nodes

d608808a0ac1f63fdbe929412ada6275.png

4,各节点启动后,使用cluster meet ip port与各节点握手,是集群通信的第一步

8fc469d15b3f122c6faa6ec9067c5a39.png

5,握手成功后,使用cluster nodes可以看到各节点都可以互相查询到

e21db3e1e536b9233c2a5ad24adf5d1e.png

6,节点握手成功后,此时集群处理下线状态,所有读写都被禁止

9c38cc13a073acb69b241eb6d372b1e7.png

7,使用cluster info命令获取集群当前状态

5e4fac03d95f64e83d68d60faeb53b9c.png

8,redis集群有16384个哈希槽,要把所有数据映射到16384槽,需要批量设置槽

redis-cli -h 127.0.0.1 -p 6379 cluster addslots {0...5461}

但我的虚拟机按范围分配有问题,同学们回去试一下看有没有问题

错误为: (error) ERR Invalid or out of range slot

批量不行,单个是可以的

redis-cli -h 127.0.0.1 -p 6379 cluster addslots 1 2 3 4

因此,我写一个脚本/usr/local/bin/addSlots.sh, 详情可见些脚本……

执行这个脚本可分配好槽位……

9,分配完槽后,可查看集群状态

41273bc90e71c23a2ddea8e3846a40e5.png

10,然后再查看cluster nodes,查看每个节点的ID

e53ce2a8ab236da0f8f83cad5b9f9866.png

11,将6389,6390,6391与 6379,6380,6381做主从映射

127.0.0.1:6389> cluster replicate af2c99b58aa8a0a8fd82ba594654ce9264ffb9bc

127.0.0.1:6390> cluster replicate 2d6e6deb9512324336754b7b3fdf86032445c77c

127.0.0.1:6391> cluster replicate 61bd9fbbd3c154da318b502b86b1ee6516b82c17

12,注:这是手动模式,在生产环境我们一般采用以下自动模式安装

自动安装模式:

1,在/usr/local新建目录:ruby

6c2d25cea29edc341b3d091db1911311.png

下载链接:https://pan.baidu.com/s/1kWsf3Rh 密码:n3pc

从这个链接下载  ruby-2.3.1.tar.gz   和  redis-3.3.0.gem

解压 tar -zxvf ruby-2.3.1.tar.gz

a0786ba7e86cf8ee3f96805c7949ea2f.png

a,  cd ruby-2.3.1

b,  ./configure -prefix=/usr/local/ruby

c,  make && make install   //过程会有点慢,大概5-10分钟

d, 然后gem install -l redis-3.3.0.gem  //没有gem需要安装yum install gem

e,准备好6个节点,(注意不要设置requirepass),将/usr/local/bin/clusterconf/data的config-file删除;依次启动6个节点:./redis-server clusterconf/redis6379.conf

如果之前redis有数据存在,flushall清空;(坑:不需要cluster meet ..)

f, 进入cd /usr/local/bin,  执行以下:1代表从节点的个数

./redis-trib.rb create --replicas 1 192.168.1.111:6379 192.168.1.111:6380 192.168.1.111:6381 192.168.1.111:6389 192.168.1.111:6390 192.168.1.111:6391

主从分配,6379是6389的从节点

d8253009ea7ce8c70a815bfea508dd03.png

貌似只有主节点可读写,从节点不可以

主节点死后,从节点变成主节点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Kubernetes 上部署 Redis 集群有多种方法,以下是其中一种基于 StatefulSet 的方法: 1. 创建 Redis 镜像的 Dockerfile 文件,安装 Redis 和 supervisord,然后将 supervisord 的配置文件和 Redis 的配置文件复制到 Docker 镜像中。 2. 构建 Docker 镜像并推送到 Docker 镜像仓库。 3. 创建 Redis 的 StatefulSet,其中需要指定副本数、镜像、容器端口等信息,同时需要为每个 Redis 实例指定一个唯一的 hostname。 4. 创建 Redis 的 Headless Service,用于为每个 Redis 实例创建一个唯一的 ClusterIP。 5. 创建 Redis 的 ConfigMap,用于存储 Redis 配置文件。 6. 创建 Redis 的 Service,用于提供 Redis 集群的访问地址。 7. 使用 kubectl apply 命令部署 Redis 集群。 以下是一个示例的 YAML 文件,可以根据实际情况进行修改: ``` apiVersion: apps/v1 kind: StatefulSet metadata: name: redis-cluster spec: serviceName: redis-cluster replicas: 3 selector: matchLabels: app: redis-cluster template: metadata: labels: app: redis-cluster spec: containers: - name: redis image: docker.io/my-redis-image:latest ports: - containerPort: 6379 volumeMounts: - name: redis-config mountPath: /usr/local/etc/redis/redis.conf subPath: redis.conf volumes: - name: redis-config configMap: name: redis-config items: - key: redis.conf path: redis.conf hostname: redis-$(pod).redis-cluster subdomain: redis-cluster dnsPolicy: ClusterFirstWithHostNet --- apiVersion: v1 kind: Service metadata: name: redis-cluster spec: ports: - port: 6379 name: redis clusterIP: None selector: app: redis-cluster --- apiVersion: v1 kind: ConfigMap metadata: name: redis-config data: redis.conf: | cluster-enabled yes cluster-config-file /var/lib/redis/nodes.conf cluster-node-timeout 5000 appendonly yes ``` 注意: - StatefulSet 的 hostname 需要使用 $(pod) 占位符来代表当前的 Pod 序号,这样可以为每个 Redis 实例指定唯一的 hostname。 - StatefulSet 的 subdomain 需要与 Service 的 name 相同,这样可以为每个 Redis 实例创建一个唯一的 ClusterIP。 - StatefulSet 的 dnsPolicy 需要设置为 ClusterFirstWithHostNet,这样可以在每个 Pod 中使用主机网络,从而避免了 Redis 集群中节点之间的通信问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值