Redis集群搭建需要注意什么?

2021-04-23 10:00发布

8条回答
瑶瑶吖 -已所不欲,勿施于人
1楼 · 2021-04-23 10:40.采纳回答

#指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求

bind 192.16.1.174

#是否开启保护模式,默认开启。

protected-mode yes

#redis监听的端口号。

port 7000

#此参数确定了TCP连接中已完成队列

tcp-backlog 511

# 此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。

timeout 0

#指定TCP连接是否为长连接,"侦探"信号有server端维护。默认为0.表示禁用

tcp-keepalive 300

# 默认redis不是以后台进程的方式启动,如果需要在后台运行,需要将这个值设置成yes

daemonize yes

可以通过upstart和systemd管理Redis守护进程

supervised no

# redis启动的进程路径

pidfile /var/run/redis_7000.pid

# 日志级别,log 等级分为4 级,debug,verbose,notice, 和warning。生产环境下一般开启notice

loglevel notice

# 日志文件地址

logfile /var/log/redis/redis_7000.log

# 设置数据库的个数,可以使用SELECT 命令来切换数据库。默认使用的数据库是0号库。默认16个库

databases 16

# 持久化数据存储目录

dir /usr/local/cluster/7000

#当主master服务器挂机或主从复制在进行时,是否依然可以允许客户访问可能过期的数据。

在"yes"情况下,slave继续向客户端提供只读服务,有可能此时的数据已经过期;在"no"情况下,

任何向此server发送的数据请求服务(包括客户端和此server的slave)都将被告知"error"

slave-serve-stale-data yes

# 如果是slave库,只允许只读,不允许修改

slave-read-only yes

是否使用socket方式复制数据

repl-diskless-sync no

diskless复制的延迟时间,防止设置为0。一旦复制开始,节点不会再接收新slave的复制请求直到下一个rdb传输。

所以最好等待一段时间,等更多的slave连上来

repl-diskless-sync-delay 5

是否禁止复制tcp链接的tcp nodelay[gs1] [gs2] 参数

repl-disable-tcp-nodelay no

当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。

而配置成0,永远不会被选举。

slave-priority 100

默认redis使用的是rdb方式持久化

appendonly no

sof文件名

appendfilename "appendonly_7000.aof"

#aof持久化策略的配置

appendfsync everysec

# appendfsync no

在aof重写或者写入rdb文件的时候,会执行大量IO,

此时对于everysec和always的aof模式来说,执行fsync会造成阻塞过长时间,

no-appendfsync-on-rewrite字段设置为默认设置为no。

no-appendfsync-on-rewrite no

aof自动重写配置。

auto-aof-rewrite-percentage 100

 #设置允许重写的最小aof文件大小

auto-aof-rewrite-min-size 64mb

#aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。

aof-load-truncated yes

# 启用或停用集群

  cluster-enabled yes

配置redis做为一个集群节点来启动 。

  cluster-config-file ./nodes-7000.conf

设置集群节点超时时间

 cluster-node-timeout 3000

“慢操作日志”记录

slowlog-log-slower-than 10000

慢操作日志”保留的最大条数,

slowlog-max-len 128

延迟监控,用于记录等于或超过了指定时间的操作,默认是关闭状态,即值为0。

latency-monitor-threshold 0

notify-keyspace-events ""

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-size -2

list-compress-depth 0

#intset中允许保存的最大条目个数,如果达到阀值,intset将会被重构为hashtable

set-max-intset-entries 512

#zset为有序集合,有2中编码类型:ziplist,skiplist。

因为"排序"将会消耗额外的性能,当zset中数据较多时,将会被重构为skiplist。

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

hll-sparse-max-bytes 3000

#是否开启顶层数据结构的rehash功能,如果内存允许,请开启。rehash能够很大程度上提高K-V存取的效率

activerehashing yes

#buffer控制类型包括:normal -> 普通连接;slave->与slave之间的连接;pubsub ->pub/sub类型连接,

client-output-buffer-limit normal 0 0 0

client-output-buffer-limit slave 256mb 64mb 60

client-output-buffer-limit pubsub 32mb 8mb 60

#Redis server执行后台任务的频率,默认为10

hz 10

#当一个child在重写AOF文件的时候,如果aof-rewrite-incremental-fsync值为yes生效,

那么这个文件会以每次32M数据的来被同步,这大量新增提交到磁盘是有用的,并且能避免高峰延迟。

aof-rewrite-incremental-fsync yes

yjh
2楼 · 2021-04-23 10:59

这里,在一个Linux虚拟机上搭建6个节点的redis伪集群,思路很简单,一台虚拟机上开启6个redis实例,每个redis实例有自己的端口。这样的话,相当于模拟出了6台机器了,然后在以这6个实例组建redis集群就可以了。

前提:redis已经安装,目录为/usr/local/redis-4.0.1

redis集群是用的ruby脚本,所以要想执行该脚本,需要ruby环境.。对应redis的源码src目录下的redis-trib.rb,redis-trib.rb是redis官方推出的管理redis集群的工具,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。so

安装ruby环境:

  1.yum install ruby

   

  2.yum install rubygems

   

  3.gem install redis

      

  Centos默认支持ruby到2.0.0,redis需要最低是2.2.2。解决办法是 先安装rvm 再把ruby版本升级到2.3.3 

       1.sudo yum install curl

       2.安装rvm

    curl -L get.rvm.io | bash -s stable 

  3.

   source /usr/local/rvm/scripts/rvm

  4.查看rvm库中已知的ruby版本

    rvm list known

  5.安装一个ruby版本

    rvm install 2.3.3

  6.使用一个ruby版本

    rvm use 2.3.3

  7.卸载一个已知版本

   rvm remove 2.0.0 

  8.查看版本

   ruby --version

  9.再安装redis

   gem install redis

 

redis集群搭建

  创建redis-cluster目录,再创建redis-8001,redis-8002,redis-8003节点目录,再把redis-conf分别复制到节点目录下

  

      分别修改节点下redis-conf文件,由于在一台机器(192.16819.129)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;

  

  开启redis服务,看看是否能启动。ok没问题。

  

  创建startall.sh脚本(提示permission denied说明权限不足,执行命令chmod 777 startall.sh修改权限)

  

  启动startall.sh脚本

  

  创建stopall.sh脚本

  

  

  创建集群

  接下来,我们要通过Ruby脚本来创建集群了。

    

  可以看到redis-trib.rb具有以下功能:

  • 1、 create :创建集群

  • 2、 check :检查集群

  • 3、 info :查看集群信息

  • 4、 fix :修复集群

  • 5、 reshard :在线迁移slot

  • 6、 rebalance :平衡集群节点slot数量

  • 7、 add-node :将新节点加入集群

  • 8、 del-node :从集群中删除节点

  • 9、 set-timeout :设置集群节点间心跳连接的超时时间

  • 10、 call :在集群全部节点上执行命令

  • 11、 import :将外部redis数据导入集群

  • redis-trib.rb主要有两个类: ClusterNode 和 RedisTrib 。 ClusterNode 保存了每个节点的信息, RedisTrib 则是redis-trib.rb各个功能的实现

  

  注意:提示最少3个master cluster nodes,前面说是创建6个,但实际操作我只创建了3个节点,所以可以得出我们创建redis集群是最少三个主节点,而且应该是奇数个,so,不要偷懒,再创建三个吧。

  特别注意:这里关键是可选replicas参数,--replicas 2 意思为为每个 master 分配 2 各 slave,replicas表示需要有几个slave。不填写这个参数是可以创建成功的,这样是三个master 。关于replicas参数后面再介绍吧

  

  

 

 首先,--replicas 1   1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。

其次,注意到图中slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。这个将在后续的随笔中验证。


我想吃肉
3楼 · 2021-04-23 11:10

1)create:创建一个集群环境

2)call:可以执行Redis命令

3)add-node:将一个节点添加到集群中,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port

4)del-node:移除一个节点

5)reshard:重新分片

6)check:检查集群状态

7)rebalance:平衡节点,参数ip:host为集群中任意一个已经存在的节点


三岁奶猫
4楼 · 2021-04-23 13:14

redis集群是用的ruby脚本,所以要想执行该脚本,需要ruby环境.。对应redis的源码src目录下的redis-trib.rb,redis-trib.rb是redis官方推出的管理redis集群的工具,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。


灰机带翅膀
5楼 · 2021-04-25 22:24

1、redis.conf的配置
创建其他redis实例时,要将7000修改为对应的端口。最后一行的保护模式如果不关闭,Jedis访问Redis集群时会报错

2、远程访问
客户端如果在远程机器上,需要开启服务端机器的防火墙端口

3、创建集群时要注意ip不要写127.0.0.1,否则远程客户端访问集群时会和本机ip混淆报错


我的网名不再改
6楼 · 2021-04-25 22:28

redis集群是用的ruby脚本,所以要想执行该脚本,需要ruby环境.。对应redis的源码src目录下的redis-trib.rb,redis-trib.rb是redis官方推出的管理redis集群的工具,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。so

安装ruby环境:

1.yum install ruby

redis集群搭建及注意事项

2.yum install rubygems

redis集群搭建及注意事项

3.gem install redis

redis集群搭建及注意事项

Centos默认支持ruby到2.0.0,redis需要最低是2.2.2。解决办法是 先安装rvm 再把ruby版本升级到2.3.3 

1.sudo yum install curl

2.安装rvm

    curl -L get.rvm.io | bash -s stable

3.

   source /usr/local/rvm/scripts/rvm

4.查看rvm库中已知的ruby版本

    rvm list known

  5.安装一个ruby版本

    rvm install 2.3.3

  6.使用一个ruby版本

    rvm use 2.3.3

  7.卸载一个已知版本

   rvm remove 2.0.0 

  8.查看版本

   ruby --version

  9.再安装redis

   gem install redis

redis集群搭建

创建redis-cluster目录,再创建redis-8001,redis-8002,redis-8003节点目录,再把redis-conf分别复制到节点目录下

redis集群搭建及注意事项

分别修改节点下redis-conf文件,由于在一台机器(192.16819.129)上,因此每个实例应该有不同的端口;同时,每个实例显然会有自己的存放数据的地方;开启AOF模式;开启集群配置;开启后台模式;

redis集群搭建及注意事项

开启redis服务,看看是否能启动。ok没问题。

redis集群搭建及注意事项

创建startall.sh脚本(提示permission denied说明权限不足,执行命令chmod 777 startall.sh修改权限)

redis集群搭建及注意事项

启动startall.sh脚本

redis集群搭建及注意事项

创建stopall.sh脚本

redis集群搭建及注意事项

redis集群搭建及注意事项

创建集群

  接下来,我们要通过Ruby脚本来创建集群了。

redis集群搭建及注意事项

可以看到redis-trib.rb具有以下功能:

  • 1、 create :创建集群

  • 2、 check :检查集群

  • 3、 info :查看集群信息

  • 4、 fix :修复集群

  • 5、 reshard :在线迁移slot

  • 6、 rebalance :平衡集群节点slot数量

  • 7、 add-node :将新节点加入集群

  • 8、 del-node :从集群中删除节点

  • 9、 set-timeout :设置集群节点间心跳连接的超时时间

  • 10、 call :在集群全部节点上执行命令

  • 11、 import :将外部redis数据导入集群

  • redis-trib.rb主要有两个类:

redis集群搭建及注意事项

注意:提示最少3个master cluster nodes,前面说是创建6个,但实际操作我只创建了3个节点,所以可以得出我们创建redis集群是最少三个主节点,而且应该是奇数个,so,不要偷懒,再创建三个吧。

特别注意:这里关键是可选replicas参数,replicas表示需要有几个slave。不填写这个参数是可以创建成功的,这样是三个master 。关于replicas参数后面再介绍吧

redis集群搭建及注意事项

redis集群搭建及注意事项

首先,--replicas 1 1其实代表的是一个比例,就是主节点数/从节点数的比例。那么想一想,在创建集群的时候,哪些节点是主节点呢?哪些节点是从节点呢?答案是将按照命令中IP:PORT的顺序,先是3个主节点,然后是3个从节点。

其次,注意到图中slot的概念。slot对于Redis集群而言,就是一个存放数据的地方,就是一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中,这和以前1.X的主从模式是不一样的(主从模式下Master/Slave数据存储是完全一致的),因为Redis集群中3台Master的数据存储并不一样。


zgzbs
7楼 · 2021-09-07 14:29

1、内存中对象说的是对象类型的数据还是就单纯的是存入的数据?一般String使用setex()命令进行插入有时效的value; 2、作为NOSQL的代表,redis性能还是很不错的,一般不用管道的话,读写同时处理10000次/秒不在话下,用上管道经过本人测试20万条...

zgtl_20
8楼 · 2021-12-10 08:45

注意的点:

  • bind这里配置要注意,默认是只有一个127.0.0.1,这个时候只能自己连接,其他局域网内是连接不上的。所以,需要配置多个 IP ,这样就可以局域网内进行连接了。我设置的0.0.0.0,虽然这不太安全,方便我在其它地方连接。

  • daemonize是设置是否后台启动 Redis,默认no,正常都需要以服务形式启动 Redis,所以这里设置为yes。

  • 可以设置密码 requirepass mypassord

  • redis v3.0+版本增加了保护机制,默认protected-mode yes, 这样目标机器调用可能会报错,需要设置为no


相关问题推荐

  • 回答 156

    对于每一位才开始接触JAVA的新手来说,先不要管算法和数据结构,大多数简单的程序不需要用到算法和数据结构,所以当你真正需要时再去学习。编程一段时间以后,你就会知道在哪些地方用到他们。这时知道算法的名字并了解它们的功能,然后动手去实践。当我们在去...

  • 回答 93

    2个都很好就业,更关键的是要学得到东西

  • 回答 12
    已采纳

    获取Map集合中所有的key可以通过map集合的keySet()方法获取例如:    Map map = new HashMap();    map.put(xx,xx); //存放数据    //.... 省略    Set set = map.keySet();    //可以通过迭代器进行测试    Iterator iter = set.iter...

  • 回答 56
    已采纳

    不同年龄,不同掌握程度,学历,找工作城市,面试能力这是一个多方面影响的结果,如果是平均值的话,全国平均薪资14k左右

  • 回答 38

    具体学多久,根据自己的学习力,自律性、解决问题能力来决定若系统性学习,跟着讲师的节奏走,大概半年左右,有专业的讲师把课程进行规划,尽心系统学习,有问题,讲师会帮忙解决,学习的效率很高,避免了自学中出现各种问题解决不了,而耽误很多时间,可能会...

  • BIO与NIO、AIO的区别2020-05-19 15:59
    回答 4
    已采纳

    IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。一、BIO     在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要...

  • 回答 23
    已采纳

    (1)idea启动时会有两个快捷方式,安装完后默认生成在桌面的是32位的idea的快捷方式,如果我们使用这个快捷方式运行大项目,一般都会很卡。解决方法是找到idea的安装目录,然后进入bin文件夹,找到名称为idea64的应用程序,右键他生成桌面快捷方式。以后每次...

  • Java方法的命名规则2021-04-06 19:07
    回答 31

    ava是一种区分字母的大小写的语言,所以我们在定义变量名的时候应该注意区分大小写的使用和一些规范,接下来我们简单的来讲讲Java语言中包、类、变量等的命名规范。(一)Package(包)的命名Package的名字应该都是由一个小写单词组成,例如com、xuetang9、compan...

  • 回答 2

    public class Point {    private int x;    private int y;    public int getX() {        return x;    }    public void setX(int x) {        this.x = x;    }    public int getY() {        return y;    } ...

  • 回答 6

    经典版单例模式public class Singleton {        private static Singleton uniqueInstance;//利用一个静态常量来记录singleton类的唯一实例。     private Singleton() {     }     public static  Singleton getInstance()...

  • 回答 3

    哈希表的长度一般是定长的,在存储数据之前我们应该知道我们存储的数据规模是多大,应该尽可能地避免频繁地让哈希表扩容。但是如果设计的太大,那么就会浪费空间,因为我们跟不用不到那么大的空间来存储我们当前的数据规模;如果设计的太小,那么就会很容易发...

  • 回答 14

    1. DOM(Document Object Model)        DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准。DOM是以层次结构组织的节点或信息片断的集合。这个层次结构允许开发人员在树中寻找特定信息。分析该结构通常需要加载整个文档和构造层次结构,然后才...

  • 回答 19

    1)作用不同: throw用于程序员自行产生并抛出异常; throws用于声明在该方法内抛出了异常2) 使用的位置不同: throw位于方法体内部,可以作为单独语句使用; throws必须跟在方法参数列表的后面,不能单独使用。3)内容不同: throw抛出一个异常对象,且只能是...

  • 回答 11

    基本执行过程如下:1)程序首先执行可能发生异常的try语句块。2)如果try语句没有出现异常则执行完后跳至finally语句块执行;3)如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。4)catch语句块可以有多个,分别捕获不同类型...

  • 回答 20

    100-199 用于指定客户端应相应的某些动作。 200-299 用于表示请求成功。 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 400-499 用于指出客户端的错误。 400 语义有误,当前请求无法被服务器理解。 401 当前请求需要用户验证...

  • 回答 16

    异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java编译...

没有解决我的问题,去提问