Redis入门 (CentOS7 + Redis-3.2.1)

Centos7.9安装部署redis7.2.3 redis数据库的安装部署 阅读详情

1. 编译安装

1.1 下载redis

# cd /tmp/
# wget http://download.redis.io/releases/redis-3.2.1.tar.gz
# tar zxvf redis-3.2.1.tar.gz
# cd redis-3.2.1/

1.2 编译redis

# make

错误:

找不到 <jemalloc/jemalloc.h>

解决:

make distclean

然后重新make;redis的代码包里有自带的jemalloc;


1.3 测试

# yum install tcl

# make test

错误1:

You need tcl 8.5 or newer in order to run the Redis test

解决:

# yum install tcl.x86_64


错误2:

[exception]: Executing test client: NOREPLICAS Not enough good slaves to write..
NOREPLICAS Not enough good slaves to write.

......

Killing still running Redis server 63439
Killing still running Redis server 63486
Killing still running Redis server 63519
Killing still running Redis server 63546
Killing still running Redis server 63574
Killing still running Redis server 63591
I/O error reading reply

......

解决:

vim tests/integration/replication-2.tcl

- after 1000

+ after 10000


错误3:

[err]: Slave should be able to synchronize with the master in tests/integration/replication-psync.tcl
Replication not started.

解决:

遇见过一次,重试make test就ok了。


错误4:

[err]: Test replication partial resync: ok psync (diskless: yes, reconnect: 1) in tests/integration/replication-psync.tcl

解决:

vim tests/integration/replication-psync.tcl

- after 100

+ after 1000


1.4 安装redis

# make install
# cp redis.conf /usr/local/etc/
# cp src/redis-trib.rb /usr/local/bin/

2. standalone模式

2.1 配置redis

# vim etc/redis.conf    
daemonize yes
logfile "/var/run/redis/log/redis.log"
pidfile /var/run/redis/pid/redis_6379.pid
dbfilename redis.rdb
dir /var/run/redis/rdb/

2.2 启动redis

# mkdir -p /var/run/redis/log
# mkdir -p /var/run/redis/rdb
# mkdir -p /var/run/redis/pid
# /usr/local/bin/redis-server /usr/local/etc/redis.conf
# ps -ef | grep redis
root      71021      1  0 15:46 ?        00:00:00 /usr/local/bin/redis-server 127.0.0.1:6379

2.3 测试redis

# /usr/local/bin/redis-cli
127.0.0.1:6379> set country china
OK
127.0.0.1:6379> get country
"china"
127.0.0.1:6379> set country america
OK
127.0.0.1:6379> get country
"america"
127.0.0.1:6379> exists country
(integer) 1
127.0.0.1:6379> del country
(integer) 1
127.0.0.1:6379> exists country
(integer) 0
127.0.0.1:6379>exit

2.4 停止redis

# /usr/local/bin/redis-cli shutdown  

3. master-slave模式

3.1 配置redis

为了测试master-slave模式,我需要在一个host上启动2个redis实例(有条件的话,当然可以使用多个host,每个host运行一个redis实例)。为此,需要把redis.conf复制多份:

# cp /usr/local/etc/redis.conf /usr/local/etc/redis_6379.conf
# cp /usr/local/etc/redis.conf /usr/local/etc/redis_6389.conf

配置实例6379:

<pre name="code" class="plain"># vim /usr/local/etc/redis_6379.conf
daemonize yes
port 6379
logfile "/var/run/redis/log/redis_6379.log"
pidfile /var/run/redis/pid/redis_6379.pid
dbfilename redis_6379.rdb
dir /var/run/redis/rdb/
min-slaves-to-write 1
min-slaves-max-lag 10

最后两项配置表示: 在10秒内,至少1个slave ping过master;

配置实例6389:

<pre name="code" class="plain"># vim /usr/local/etc/redis_6389.conf
daemonize yes
port 6389
slaveof 127.0.0.1 6379
logfile "/var/run/redis/log/redis_6389.log"
pidfile /var/run/redis/pid/redis_6389.pid
dbfilename redis_6389.rdb
dir /var/run/redis/rdb/
repl-ping-slave-period 10

易见,我将要启动两个redis实例,一个使用端口6379(默认端口),另一个使用6389;并且,前者为master,后者为slave。

repl-ping-slave-period表示slave向master发送PING的频率,单位是秒。

另外,在6389的配置文件中,有如下配置可以修改(一般不需修改):

slave-read-only yes 
slave-serve-stale-data yes

第一个表示:slave是只读的;

第二个表示:当slave在同步新数据(从master同步数据)的时候,它使用旧的数据服务client。这使得slave是非阻塞的。


在6379的配置文件中,有如下配置可以修改(一般不需修改):

# repl-backlog-size 1mb
repl-diskless-sync no
repl-diskless-sync-delay 5

对于这几项,故事是这样的: 

1. 对于一直保持着连接的slave,可以通过增量同步来达到主从一致。

2.  断开重连的slave可能通过部分同步来达到一致(redis 2.8之后才有这一功能,此版本之前,只能和新的slave一样,通过完整同步来达到一致),机制是:

master在内存中记录一些replication积压量;重连的slave与master就replication offset和master run id进行协商:若master run id没变(即master没有重启),并且slave请求的replication offset在积压量里,就可以从offset开始进行部分同步来达到一致。这两个条件任何一个不满足,就必须进行完整同步了。repl-backlog-size 1mb就是用于配置replication积压量大小的。

3.  对于新的slave或者无法通过部分同步达到一致的重连slave,而必须进行完整同步,即传送一个RDB文件。master有两种方式来传这个RDB文件:

  • disk-backed:在磁盘上生成RDB文件,然后传送给slave;
  • diskless:不在磁盘上生成RDB文件,而是一边生成RDB数据,一边直接写到socket;

repl-diskless-sync用于配置使用哪种策略。对于前者,在磁盘上生成一次RDB文件,可以服务多个slave;而对于后者,一旦传送开始,新来的slave只能排队(等当前slave同步完成)。所以,master在开始传送之前,可能希望推迟一会儿,希望来更多的slave,这样master就可以并行的把生成的数据传送给他们。参数repl-diskless-sync-delay 就是用于配置推迟的时间的,单位秒。

慢磁盘的master,可能需要考虑使用diskless传送。


3.2 启动master

# /usr/local/bin/redis-server /usr/local/etc/redis_6379.conf
# /usr/local/bin/redis-cli
127.0.0.1:6379> set country Japan
(error) NOREPLICAS Not enough good slaves to write.
127.0.0.1:6379>

可见,由于slave没启动,不满足在10秒内,至少1个slave ping过master的条件,故出错。


3.3 启动slave

# /usr/local/bin/redis-server /usr/local/etc/redis_6389.conf
# /usr/local/bin/redis-cli
127.0.0.1:6379> set country Japan
OK

3.4 停止redis

# /usr/local/bin/redis-cli -p 6389 shutdown
# /usr/local/bin/redis-cli -p 6379 shutdown


4. cluster + master-slave模式

Cluster能做什么:
  • 自动的将数据集分布到不同节点上;
  • 当一部分节点故障时,能够继续服务;
数据分布:redis不使用一致性hash,而是另一种形式的sharding:一共用16384个hash slot,它们分布在不同的节点上(例如节点A包含0-4999,节点B包含5000-9999,节点C包含10000-16384)。key被映射到hash slot上。比如,key_foo被映射到slot 1000,而slot 1000存储于节点A上,那么key_foo(以及它的值)将存储于节点A上。另外,你可以让不同的key映射到同一个slot上,方法是使用{}把key的一部分括起来;在key到slot的映射过程中,只考虑{}之内的部分。例如,this{foo}key和another{foo}key在映射中,只有"foo"被考虑,所以它们一定映射到相同的slot。

TCP port:每个节点使用两个端口:服务client的端口;集群bus端口。集群bus端口 = 服务client的端口 + 10000。配置过程中只需指定服务client的端口,后者由redis根据这个规则自行计算。集群bus端口用于故障侦测、配置更新、fail over鉴权等;服务client的端口除了用于服务客户,还用于节点间迁移数据。 服务client的端口必须对client和所有其他节点开放;集群bus端口必须对所有其他节点开放。

一致性保证:redis集群不能保证强一致性。也就是说,在特定情况下,redis可能丢失写入的数据(虽然已经回应client:已成功写入)。
  • 异步复制导致数据丢失:1. 用户写入master节点B;2. master节点B向client回复OK;3. master节点B把写入数据复制到它的slave。可见,因为B不等slave确认写入就向client回复OK,若master节点B在2之后故障,就会导致数据丢失。
  • 网络分裂导致数据丢失:例如有A,B,C三个master,它们的slave分别是A1,B1,C1;如果发生网络分裂,B和客户端分到一侧。在cluster-node-timeout之内,客户端可以继续向B写入数据;当超过cluster-node-timeout时,分裂的另一侧发生fail over,B1当选为master。客户端向B写的数据就丢失了。
  • redis(非cluster模式)本身也可能丢失数据:1. RBD定期快照,导致快照周期内的数据丢失;2. AOF,虽然每一个写操作都记入log,但log是定期sync的,也可能丢失sync周期内的数据。

在下文,节点和实例是可以互换的名词(因为,我是在同一个host上试验集群,一个节点由一个实例代替)。

我将在同一台机器上试验redis集群模式,为此,我需要创建6个redis实例,其中3个master,另外3个是slave。它们的端口是7000-7005。

4.1 配置redis集群:

<pre name="code" class="plain"># cp /usr/local/etc/redis.conf  /usr/local/etc/redis_7000.conf
# vim /usr/local/etc/redis_7000.conf
daemonize yes
port 7000
pidfile /var/run/redis/pid/redis_7000.pid
logfile "/var/run/redis/log/redis_7000.log"
dbfilename redis_7000.rdb
dir /var/run/redis/rdb/
min-slaves-to-write 0
cluster-enabled yes
cluster-config-file /var/run/redis/nodes/nodes-7000.conf
cluster-node-timeout 5000
cluster-slave-validity-factor 10
repl-ping-slave-period 10

这里我把min-slave-to-write改为0,为了后文验证fail over之后,仍能够读写(否则,master crash之后,slave取代它成为master,但它没有slave,故不能读写)。

# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7001.conf
# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7002.conf
# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7003.conf
# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7004.conf
# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7005.conf
# sed -i -e 's/7000/7001/' /usr/local/etc/redis_7001.conf
# sed -i -e 's/7000/7002/' /usr/local/etc/redis_7002.conf
# sed -i -e 's/7000/7003/' /usr/local/etc/redis_7003.conf
# sed -i -e 's/7000/7004/' /usr/local/etc/redis_7004.conf
# sed -i -e 's/7000/7005/' /usr/local/etc/redis_7005.conf


4.2 启动redis实例

# mkdir -p /var/run/redis/log
# mkdir -p /var/run/redis/rdb
# mkdir -p /var/run/redis/pid
# mkdir -p /var/run/redis/nodes


# /usr/local/bin/redis-server /usr/local/etc/redis_7000.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7001.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7002.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7003.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7004.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7005.conf


现在,在每个实例的log里,可以看见类似这么一行(当然,后面那个串16进制数各不相同):

3125:M 12 Jul 15:24:16.937 * No cluster configuration found, I'm b6be6eb409d0207e698997d79bab9adaa90348f0

事实上,那串16进制数就是每个redis实例的ID。它在集群的环境下,唯一标识一个redis实例。每个redis实例通过这个ID记录其他实例,而不是通过IP和port(因为IP和port可以改变)。我们这里所说的实例,就是集群中的节点,这个ID也即是Node ID。


4.3 创建redis集群

我们使用从redis源代码中拷贝的redis-trib.rb来创建集群。它是一个ruby脚步,为了失它能够运行,还需要如下准备工作:

# yum install gem
# gem install redis


现在可以创建集群了:

# /usr/local/bin/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7003 to 127.0.0.1:7000
Adding replica 127.0.0.1:7004 to 127.0.0.1:7001
Adding replica 127.0.0.1:7005 to 127.0.0.1:7002
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
M: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) master
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) master
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) master
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

最后一行:

[OK] All 16384 slots covered.

表示至少有一个master能够服务全部slot(16384个)了。可以认为集群创建成功了。从命令的输出可以看出:

实例7000 ID:b6be6eb409d0207e698997d79bab9adaa90348f0

实例7001 ID:23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9

实例7002 ID:6b92f63f64d9683e2090a28ebe9eac60d05dc756

实例7003 ID:ebfa6b5ab54e1794df5786694fcabca6f9a37f42

实例7004 ID:026e747386106ad2f68e1c89543b506d5d96c79e

实例7005 ID:441896afc76d8bc06eba1800117fa97d59453564

其中:

7000、7001和7002是master;

7000包含的slot是0-5460,slave是7003

7001包含的slot是5461-10922,slave是7004

7002包含的slot是10923-16383,slave是7005


如果不想要slave,6个实例都做master(没有备份),把"--replicas 1"去掉即可。


在继续进行之前,先看看这几项配置项的意义:

  • cluster-enabled:启用集群功能。
  • cluster-config-file:集群中的实例通过这个文件持久化集群配置:其他实例及其状态等。不是让人来编辑的。redis实例在收到消息(例如其他实例状态变化的消息)时重写。
  • cluster-node-timeout:一个节点失联时间大于这个值(单位毫秒)时,就会认为是故障(failing)的。它有两个重要意义:1. master节点失联时间大于它时,就可能被fail over到slave上;2. 一个节点如果和大多数master失联的时间大于它时,就停止接收请求(比如由于网络分裂,一个master被隔离出去,与大多数master失联,当失联时间大于这个值时,它就停止工作,因为在分裂的那一边可能已经fail over到slave上了)。
  • cluster-slave-validity-factor:说来话长,一个slave当发现它的数据太老时,它就不会进行fail over。如何确定它的数据年龄呢?有两个检查机制:机制1. 假如有多个slave都可以fail over,它们就会交换信息,根据replication offset (这个值能反映从master得到数据的多少)来确定一个级别(rank),然后根据rank来延迟fail over。Yuanguo:可能是这样的: 根据replication offset确定哪个slave的数据比较新(从master得到的多),哪个slave的数据比较旧(从master得到的少),然后排列出一个rank。数据新的slave尽快fail over,数据老的slave延迟fail over,越老延迟的越长。机制1和这个配置项无关。 机制2. 每个slave记录它与master最后一次交互(PING或者是命令)以来逝去的时间。若这个时间过大,则认为数据是老的。如何确定这个时间是否“过大”呢?这就是这个配置项的作用,若大于

(node-timeout * slave-validity-factor) + repl-ping-slave-period

就认为过大,数据是老的。

  • repl-ping-slave-period:slave向master发送PING的频率,单位是秒。
以下这两项,我们没有设置:
  • cluster-migration-barrier:假如有一个master有3个slave,另一个master没有任何slave。这时,需要把第一个master的slave 迁移给第二个master。但第一个master把自己的slave迁移给别人时,自己必须保有一定个数的slave。保有个数就是cluster-migration-barrier。例如,把这个值设置为3时, 就不会发生slave迁移了,因为迁移之后保有数小于3。所以,你想禁止slave迁移,把这个数设置很大即可。
  • cluster-require-full-coverage:若设置为yes,一旦存在hash slot没被覆盖,则集群停止接收请求。在这种情况下,若集群部分宕机,导致一些slot没有被覆盖,则整个集群变得不可用。你若希望在一些节点宕机时,被覆盖的那些slot仍能服务,把它设置为no。

4.4 测试集群

4.4.1 redis-cli的集群模式

# /usr/local/bin/redis-cli -p 7000
127.0.0.1:7000> set country China
(error) MOVED 12695 127.0.0.1:7002
127.0.0.1:7000> get country
(error) MOVED 12695 127.0.0.1:7002
127.0.0.1:7000> exit

# /usr/local/bin/redis-cli -p 7002
127.0.0.1:7002> set country China
OK
127.0.0.1:7002> get country
"China"
127.0.0.1:7002> set testKey testValue
(error) MOVED 5203 127.0.0.1:7000
127.0.0.1:7002> exit

# /usr/local/bin/redis-cli -p 7000
127.0.0.1:7000> set testKey testValue
OK
127.0.0.1:7000> exit

某一个特定的key,只能由特定的master来服务?

不是的。原来,redis-cli需要一个 -c 来表示cluster模式。使用cluster模式时,可以在任何节点(master或者slave)上存取数据:

# /usr/local/bin/redis-cli -c -p 7002
127.0.0.1:7002> set country America
OK
127.0.0.1:7002> set testKey testValue
-> Redirected to slot [5203] located at 127.0.0.1:7000
OK
127.0.0.1:7000> exit

# /usr/local/bin/redis-cli -c -p 7005
127.0.0.1:7005> get country
-> Redirected to slot [12695] located at 127.0.0.1:7002
"America"
127.0.0.1:7002> get testKey
-> Redirected to slot [5203] located at 127.0.0.1:7000
"testValue"
127.0.0.1:7000> set foo bar
-> Redirected to slot [12182] located at 127.0.0.1:7002
OK
127.0.0.1:7002> exit

事实上,redis-cli对cluster的支持是比较基础的,它只是利用了节点能够根据slot进行重定向的功能。例如在上面的例子中,在实例7002上设置testKey时,它计算得到对应的slot是5203,而5203由实例7000负责,所以它重定向到实例7000。

一个更好的客户端应该能够缓存 hash slot到节点地址的映射,然后就可以直接访问正确的节点,免于重定向。这个映射只有在集群配置发生变化的时候才需要刷新,例如,fail over之后(slave代替了master,故节点地址改变),或者管理员添加/删除了节点(hash slot分布发生变化)。


4.4.2 ruby客户端:redis-rb-cluster

安装

# cd /usr/local/
# wget https://github.com/antirez/redis-rb-cluster/archive/master.zip
# unzip master.zip
# cd redis-rb-cluster-master

测试

安装完成之后,进入redis-rb-cluster-master目录,发现里面有一个example.rb,执行它:

# ruby example.rb 127.0.0.1 7000
1
2
3
4
5
6
^C


它循环向redis集群set这样的键值对:

foo1 => 1

foo2 => 2

......

可通过redis-cli来验证前面的执行结果。


4.4.3 hash slots在节点间resharding

为了展示resharding过程中IO不间断,再打开一个终端,运行

# ruby example.rb 127.0.0.1 7000;

同时在原终端测试resharding:

# /usr/local/bin/redis-trib.rb reshard 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?2000                    <----  迁移多少hash slot?
What is the receiving node ID? 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9      <----  迁移目的地? 7001实例
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:all                                                           <----  迁移源?all
Do you want to proceed with the proposed reshard plan (yes/no)? yes          <----  确认


迁移过程中,另一个终端的IO持续没有中断。迁移完成之后,检查现在hash slot的分布:

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

可见slot的分布已经发生变化:

7000:4461个

             1000-5460

7001:7462个

              0-999

              5461-11922

7002:4461个

              11923-16383


4.4.4 fail over

在测试fail over之前,先看一下包含在redis-rb-cluster中的另一个工具:consistency-test.rb;它是一个一致性检查器:累加变量,然后检查变量的值是否正确。

# ruby consistency-test.rb 127.0.0.1 7000
198 R (0 err) | 198 W (0 err) |
685 R (0 err) | 685 W (0 err) |
1174 R (0 err) | 1174 W (0 err) |
1675 R (0 err) | 1675 W (0 err) |
2514 R (0 err) | 2514 W (0 err) |
3506 R (0 err) | 3506 W (0 err) |
4501 R (0 err) | 4501 W (0 err) |

两个括号中的(N err)分别代表IO错误数,而不是数据不一致。数据不一致在最后一个列打印(上例中没有数据不一致现象)。为了演示数据不一致现象,我修改consistency-test.rb脚步,把key打印出来,然后在另一个终端中,通过redis-cli更改key的值。

# vim consistency-test.rb
            # Report
            sleep @delay
            if Time.now.to_i != last_report
                report = "#{@reads} R (#{@failed_reads} err) | " +
                         "#{@writes} W (#{@failed_writes} err) | "
                report += "#{@lost_writes} lost | " if @lost_writes > 0
                report += "#{@not_ack_writes} noack | " if @not_ack_writes > 0
                last_report = Time.now.to_i
+               puts key
                puts report
            end

运行脚本,我们可以看见脚本操作的每个变量的key:

# ruby consistency-test.rb 127.0.0.1 7000
81728|502047|15681480|key_8715
568 R (0 err) | 568 W (0 err) |
81728|502047|15681480|key_3373
1882 R (0 err) | 1882 W (0 err) |
81728|502047|15681480|key_89
3441 R (0 err) | 3441 W (0 err) |

在另一终端,修改key:81728|502047|15681480|key_8715的值:

127.0.0.1:7001> set 81728|502047|15681480|key_8715 0
-> Redirected to slot [12146] located at 127.0.0.1:7002
OK
127.0.0.1:7002>


然后,可以看见consistency-test.rb检查出值不一致:

# ruby consistency-test.rb 127.0.0.1 7000
81728|502047|15681480|key_8715
568 R (0 err) | 568 W (0 err) |
81728|502047|15681480|key_3373
1882 R (0 err) | 1882 W (0 err) |
81728|502047|15681480|key_89
......
81728|502047|15681480|key_2841
7884 R (0 err) | 7884 W (0 err) |
81728|502047|15681480|key_308
8869 R (0 err) | 8869 W (0 err) | 2 lost |
81728|502047|15681480|key_6771
9856 R (0 err) | 9856 W (0 err) | 2 lost |
变量的值应该为2,但是丢失了(被我改掉了)。

4.4.4.1 自动fail over

当一个master crash了,一段时间后(前面配置的的5秒)会自动fail over到它的slave上。

在一个终端上,运行一致性检查器consistency-test.rb(删掉了打印key的语句)。然后在另一个终端上模拟crash一个master:

# ./redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001        <---- 可见7001是一个master
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


# /usr/local/bin/redis-cli -p 7001 debug segfault                 <---- 模拟7001 crash         
Error: Server closed the connection


# ./redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
M: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004        <---- 7001 fail over到7004;现在7004是master,并且没有slave
   slots:0-999,5461-11922 (7462 slots) master
   0 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


在一致性检查一侧,可以看见在fail over过程中出现了一些IO错误。

7379 R (0 err) | 7379 W (0 err) |
8499 R (0 err) | 8499 W (0 err) |
9586 R (0 err) | 9586 W (0 err) |
10736 R (0 err) | 10736 W (0 err) |
12416 R (0 err) | 12416 W (0 err) |
Reading: Too many Cluster redirections? (last error: MOVED 11451 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 11451 127.0.0.1:7001)
13426 R (1 err) | 13426 W (1 err) |
Reading: Too many Cluster redirections? (last error: MOVED 5549 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 5549 127.0.0.1:7001)
13426 R (2 err) | 13426 W (2 err) |
Reading: Too many Cluster redirections? (last error: MOVED 9678 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 9678 127.0.0.1:7001)
13427 R (3 err) | 13427 W (3 err) |
Reading: Too many Cluster redirections? (last error: MOVED 10649 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 10649 127.0.0.1:7001)
13427 R (4 err) | 13427 W (4 err) |
Reading: Too many Cluster redirections? (last error: MOVED 9313 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 9313 127.0.0.1:7001)
13427 R (5 err) | 13427 W (5 err) |
Reading: Too many Cluster redirections? (last error: MOVED 8268 127.0.0.1:7001)
Writing: Too many Cluster redirections? (last error: MOVED 8268 127.0.0.1:7001)
13428 R (6 err) | 13428 W (6 err) |
Reading: CLUSTERDOWN The cluster is down
Writing: CLUSTERDOWN The cluster is down
13432 R (661 err) | 13432 W (661 err) |
14786 R (661 err) | 14786 W (661 err) |
15987 R (661 err) | 15987 W (661 err) |
17217 R (661 err) | 17217 W (661 err) |
18320 R (661 err) | 18320 W (661 err) |
18737 R (661 err) | 18737 W (661 err) |
18882 R (661 err) | 18882 W (661 err) |
19284 R (661 err) | 19284 W (661 err) |
20121 R (661 err) | 20121 W (661 err) |
21433 R (661 err) | 21433 W (661 err) |
22998 R (661 err) | 22998 W (661 err) |
24805 R (661 err) | 24805 W (661 err) |

注意两点:

  • fail over完成之后,IO错误数停止增加,集群可以继续正常服务。
  • 没有出现不一致错误。master crash是可能导致数据不一致的(slave的数据落后于master,master crash后,slave取代它,导致使用落后的数据),但这种情况不是非常容易发生,因为master完成新的写操作时,几乎在回复客户端的同时,就向slave同步了。但不代表不可能出现。

重启7001,它将变成7004的slave:

# /usr/local/bin/redis-server /usr/local/etc/redis_7001.conf

# ./redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
M: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
S: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001             <---- 7001已变成7004的slave
   slots: (0 slots) slave
   replicates 026e747386106ad2f68e1c89543b506d5d96c79e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4.4.4.2 手动fail over

有的时候,用户可能想主动fail over,比如,想升级某个master,最好让它变成slave,这样能减小对集群可用性的影响。这就需要手动fail over。

手动fail over必须在slave上执行:

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
M: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
S: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001                <---- 7001是7004的slave
   slots: (0 slots) slave
   replicates 026e747386106ad2f68e1c89543b506d5d96c79e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

# /usr/local/bin/redis-cli -p 7001 CLUSTER FAILOVER                       <---- 在slave 7001上执行fail over
OK

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004               <---- 7004变成7001的slave
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001               <---- 7001变成master
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

手动fail over的过程:

  1. slave告诉master,停止处理用户请求;
  2. master停止处理用户请求,并回复slave它的replication offset;
  3. slave等待它的replication offset和master的匹配;即等待,直到从master接收到所有数据。这时候master和slave的数据一致,并且master不接收新数据;
  4. slave开始fail over:从大多数master获取一个配置epoc(配置变更版本号,应该是cluster-config-file包含的信息的版本号),并广播新配置(在新配置中,slave已经变成master);
  5. 老的master接收到新配置,重新开始处理用户请求:把请求重定向到新master;它自己已经变成slave;

fail over命令有两个选项:

  • FORCE:上面fail over的过程中,需要master参与。若master处于失联状态(网络故障或者master崩溃了,但没完成自动fail over),加上FORCE选项,则fail over不与master进行握手,而是直接从第4步开始。
  • TAKEOVER:上面fail over的过程中,需要大多数master的授权并有大多数master产生一个新的配置变更版本号。有时,我们不想与其他master达成一致,而直接fail over,则需要TAKEOVER选项。一个真实的用例是:master在一个数据中心, 所有slave在另一个数据中心,当所有master宕机或者网络分裂时,集中地把所有处于另一数据中心的slave提升为master,来达到数据中心切换的目的。


4.4.5 添加节点

4.4.5.1 添加master

# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7006.conf
# sed -i -e 's/7000/7006/' /usr/local/etc/redis_7006.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7006.conf             <---- 1. 拷贝、修改conf,并启动一个redis实例
# /usr/local/bin/redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000    <---- 2. 把实例加入集群
>>> Adding node 127.0.0.1:7006 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7006 to make it join the cluster.
[OK] New node added correctly.                                           <---- 新节点添加成功

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000                      <---- 3. 检查
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006               <---- 新节点没有任何slot;所以需要手动reshard
   slots: (0 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

# /usr/local/bin/redis-trib.rb reshard 127.0.0.1:7000                    <---- 4. reshard
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots: (0 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:0-999,5461-11922 (7462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 3000                  <---- 迁移3000个slot
What is the receiving node ID? 6147326f5c592aff26f822881b552888a23711c6     <---- 目的地是新加的节点
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.                    <---- 源是7001;由于上次reshard,它的slot非常多,所以迁走3000
Source node #1:23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
Source node #2:done
......
    Moving slot 7456 from 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
    Moving slot 7457 from 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
    Moving slot 7458 from 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
    Moving slot 7459 from 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
    Moving slot 7460 from 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
Do you want to proceed with the proposed reshard plan (yes/no)? yes         <---- 确认

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000                         <---- 5. 再次检查
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006                   <---- 新加的节点有3000个slot
   slots:0-999,5461-7460 (3000 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4.4.5.2 添加slave

<pre name="code" class="plain"><pre name="code" class="plain">1. 拷贝、修改conf,并启动一个redis实例
# cp /usr/local/etc/redis_7000.conf /usr/local/etc/redis_7007.conf
# sed -i -e 's/7000/7007/' /usr/local/etc/redis_7007.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7007.conf 


2. 作为slave添加,并指定其master
[root@localhost ~]# /usr/local/bin/redis-trib.rb add-node --slave --master-id 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7007 127.0.0.1:7000
>>> Adding node 127.0.0.1:7007 to cluster 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460 (3000 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
>>> Send CLUSTER MEET to node 127.0.0.1:7007 to make it join the cluster.
Waiting for the cluster to join.
>>> Configure node as replica of 127.0.0.1:7006.
[OK] New node added correctly.

3. 检查
# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000 
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: 6d8675118da6b492c28844395ee6915506c73b3a 127.0.0.1:7007        <---- 新节点成功添加,并成为7006的slave
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460 (3000 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.




上面添加slave时,指定了其master。也可以不指定master,这样,它将随机地成为一个master的slave;然后,可以把它迁移为指定master的slave(通过CLUSTER REPLICATE命令)。另外,还可以通过作为一个空的master添加,然后使用CLUSTER REPLICATE命令把它变为slave。


4.4.6 删除节点

删除之前,先看看当前的结构

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: 6d8675118da6b492c28844395ee6915506c73b3a 127.0.0.1:7007
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460 (3000 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可见:

master slave

7000 7003

7001 7004

7002 7005

7006 7007

我们将删掉7007(slave)和7002(master).


4.4.6.1 删除slave节点

删除slave(7007)比较容易,通过del-node即可:

# /usr/local/bin/redis-trib.rb del-node 127.0.0.1:7000 6d8675118da6b492c28844395ee6915506c73b3a
>>> Removing node 6d8675118da6b492c28844395ee6915506c73b3a from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006       <---- 7006现在没有slave了
   slots:0-999,5461-7460 (3000 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

4.4.6.2 删除master节点

删除master节点之前,必须确保master是空的(没有任何slot),这可以通过reshard来完成。然后才能删除master。

<pre name="code" class="plain"># /usr/local/bin/redis-trib.rb reshard 127.0.0.1:7000            <---- reshard
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6b92f63f64d9683e2090a28ebe9eac60d05dc756
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002
   slots:11923-16383 (4461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460 (3000 slots) master
   0 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4461                 <---- 我们计划把7002清空,所以需要迁移其所有slot,4461个
What is the receiving node ID? 6147326f5c592aff26f822881b552888a23711c6    <---- 目的地7006
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1:6b92f63f64d9683e2090a28ebe9eac60d05dc756                    <---- 源7002
Source node #2:done
......
    Moving slot 16382 from 6b92f63f64d9683e2090a28ebe9eac60d05dc756
    Moving slot 16383 from 6b92f63f64d9683e2090a28ebe9eac60d05dc756
Do you want to proceed with the proposed reshard plan (yes/no)? yes


检查7002是否已经被清空:

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005           <---- 7002的slave,变成7006的了 (若设置了cluster-migration-barrier,如何?)
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
M: 6b92f63f64d9683e2090a28ebe9eac60d05dc756 127.0.0.1:7002           <---- 7002已经被清空
   slots: (0 slots) master
   0 additional replica(s)                                           <---- 并且它的slave也不见了(因为没有数据,slave是浪费<span style="font-family: Arial, Helvetica, sans-serif;">) !!!!!!</span>
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460,11923-16383 (7461 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

现在可以删除7002了:

# /usr/local/bin/redis-trib.rb del-node 127.0.0.1:7000 6b92f63f64d9683e2090a28ebe9eac60d05dc756
>>> Removing node 6b92f63f64d9683e2090a28ebe9eac60d05dc756 from cluster 127.0.0.1:7000
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.

看看现在的结构:

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots:0-999,5461-7460,11923-16383 (7461 slots) master
   1 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
可见:

master slave

7000 7003

7001 7004

7006 7005


4.4.7 slave迁移

现在的拓扑结构是:

master slave

7000 7003

7001 7004

7006 7005


我们可以通过命令把一个slave分配给别的master:

# /usr/local/bin/redis-cli -p 7003 CLUSTER REPLICATE 6147326f5c592aff26f822881b552888a23711c6    <---- 让7003做7006的slave
OK
# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000           <---- 7000没有slave
   slots:1000-5460 (4461 slots) master
   0 additional replica(s)
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005           <---- 7005是7006的slave
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003           <---- 7003是7006的slave
   slots: (0 slots) slave
   replicates 6147326f5c592aff26f822881b552888a23711c6
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006           <---- 7006有两个slave
   slots:0-999,5461-7460,11923-16383 (7461 slots) master
   2 additional replica(s)
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

另外,除了手动迁移之外,redis还会自动迁移slave。前面介绍配置项cluster-migration-barrier时也简单解释过:

  • redis在特定的时刻,试图把拥有最多slave的master的slave迁移给没有slave的master;
  • 有了这一机制,你可以简单地向系统添加一些slave,不用指定它们的master是谁。当有master失去了所有slave时(slave一个个都故障了),系统就会自动迁移给它。
  • cluster-migration-barrier:设置自动迁移时,一个master最少保留几个slave。例如,这个值设置为2,我有3个slave,你没有时,我会给你一个;我有2个slave,你没有时,我不会给你。

4.4.8 升级节点

4.4.8.1 升级slave

  • 停掉;
  • 使用新版本的redis启动;

4.4.8.2 升级master

  • 手动fail over到一个slave上;
  • 等待master变为slave;
  • 然后,作为slave升级(停掉,使用新版redis启动);
  • 再fail over回来(可选);

4.4.9 集群迁移

暂时没必要;

4.4.10 Stop/Start集群

Stop集群:只需一个个停止各个实例

# /usr/local/bin/redis-cli -p 7000 shutdown
# /usr/local/bin/redis-cli -p 7001 shutdown
# /usr/local/bin/redis-cli -p 7003 shutdown
# /usr/local/bin/redis-cli -p 7004 shutdown
# /usr/local/bin/redis-cli -p 7005 shutdown
# /usr/local/bin/redis-cli -p 7006 shutdown
# ps -ef | grep redis
root      26266  23339  0 17:24 pts/2    00:00:00 grep --color=auto redis
[root@localhost ~]#


Start集群:只需一个个启动各个实例(没必要再使用redis-trib.rb create)

# /usr/local/bin/redis-server /usr/local/etc/redis_7000.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7001.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7003.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7004.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7005.conf
# /usr/local/bin/redis-server /usr/local/etc/redis_7006.conf

# /usr/local/bin/redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: b6be6eb409d0207e698997d79bab9adaa90348f0 127.0.0.1:7000
   slots:1000-5460 (4461 slots) master
   1 additional replica(s)
M: ebfa6b5ab54e1794df5786694fcabca6f9a37f42 127.0.0.1:7003
   slots:0-999,5461-7460,11923-16383 (7461 slots) master
   1 additional replica(s)
S: 026e747386106ad2f68e1c89543b506d5d96c79e 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9
M: 23149e93876a0d1d2cd7962d1b8fbdf42ecc64e9 127.0.0.1:7001
   slots:7461-11922 (4462 slots) master
   1 additional replica(s)
S: 6147326f5c592aff26f822881b552888a23711c6 127.0.0.1:7006
   slots: (0 slots) slave
   replicates ebfa6b5ab54e1794df5786694fcabca6f9a37f42
S: 441896afc76d8bc06eba1800117fa97d59453564 127.0.0.1:7005
   slots: (0 slots) slave
   replicates b6be6eb409d0207e698997d79bab9adaa90348f0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.


测试IO是否正常:

# ruby consistency-test.rb 127.0.0.1 7000
109 R (0 err) | 109 W (0 err) |
661 R (0 err) | 661 W (0 err) |
1420 R (0 err) | 1420 W (0 err) |
2321 R (0 err) | 2321 W (0 err) |
……

5. 小结

本文主要记录了redis的配置过程(包括单机模式,主备模式和cluster模式);在这个过程中,尽量对redis系统的工作方式进行解释,即使不算详尽。希望可以作为入门知识。

centos7 安装redis3.2 centos7 安装redis3.2 背景:mac 10.14.6,Parallels Desktop 15.1.2,CentOS-7-x86_64-Minimal 1 创建一个redis文件夹,用来放redis [root@centos-linux ~]# mkdir /usr/local/redis 3 下载一个redis包,注意匹配虚拟机的系统,这种教程很多,自行下载 4 将本机文件包上传到centos7 terminal >scp /Users/daiyuanru/Downloads/re 阅读详情

相关推荐

Centos7 安装升级最新版Redis7.4.1

今天阿里云云盾检测出一个redis低版本的漏洞,需要升级到稳定高版本修复漏洞,升级过程遇到了一些坑,特记录分享给大家,原服务器默认yum源安装的gcc 是4.8.5 ,默认安装redis是 3.2.12(如下图): 升级新版redis需要更高级的gcc支持,这里我们就选择升级gcc9 如果已经使用yum安装了低版本redis的,可以先删除redis 下载安装包 1、进入官网https://redis.io/,下滑点击download跳转下载页面,一般下载Stack版本(稳定版)(旧版找Stable),可以

weixin_39093006的博客 1746

redis集群安装

1…1. 部署 1、 两台服务器,6 个实例,3 个主节点,3 个从节点(也可以所有节点都放一台服务器)。 主节点与从节点存在对应关系,启动完后可通过 cluster node 命令获取。 cd /usr/local/redis-3.2.8/src/ ./redis-cli -h 192.168.1.151 -c -p 7000 cluster nodes 2、 一般情况下,一个主节点坏了,还有从节点补上。若整个集群只有两个正常主节点 (从节点没补上),集群则会处于 down 状态。 1.1.1. 初始步骤

qq_44779847的博客 389

跨境TRS投资操作指南与系统解决方案

3 点击【申请 TRS 账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS 账户开户申请已提交,后台对已提交的 TRS 开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;2.点击【申请TRS账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS账户开户申请已提交,后台对已提交的TRS开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;4)更广泛的投资选择:相比A股通,TRS可以交易更多的A股标的,提供了更广泛的投资选择。

2401_85487119的博客 2847

Slave should be able to synchronize with the master in tests/integration/replication-psync.tcl

在redis进行maketest时候会出现一系列的异常,有如下解决方案: You need tcl 8.5 or newer in order to run the Redis test 解决方案:前面已经安装了tcl; [exception]: Executing test client: NOREPLICAS Not enough good slaves to write… NOREPLICAS Not enough good slaves to write. 解决方案:vim tests/in

Riqk_Qin的专栏 942

重磅!Repo Wiki!

RepoWiki是Qoder平台的智能文档生成功能,通过静态代码分析自动提取项目架构、模块依赖和核心逻辑,并持续追踪代码变更保持文档同步。其工作流程分为四个阶段:1)代码扫描与AST解析;2)结构分析与依赖映射;3)文档智能生成;4)增量更新机制。支持多种编程语言,能识别设计模式并推断技术决策,适用于新项目搭建和遗留系统维护。优势在于降低理解成本和提高开发效率,但存在文件数量限制和依赖Git的局限性。典型应用场景包括自动生成架构图、API手册和团队知识沉淀。

ayusong870的博客 4023

SAP ERPsim生产拓展实验报告

ERP课的实验和实践,也是SAP竞赛玩的东西,除了界面不华丽外很像游戏而且是团队型的pvp大乱斗

m0_67262022的博客 2020

Linux服务器安装Redis

Step1:下载redis 官网:https://redis.io/download(两三兆,很快啊) 直接最新,咱也不是部署线上环境,不要怕,遇到错误才会成长。 其它版本在下面: Step2:创建你要安装的目录 我是在/usr/local 下建了一个redis文件夹, 小tip :mkdir 新建文件夹 rmdir 删除文件夹(空的) rm -rf 删除文件夹(遍历删除该文件及子文件 Step3:上传下载好的redis到刚刚创建的目录下(Xftp) Step4:解压 tar xvf red

qq_42682745的博客 654

太速科技-基于DSP TMS320C6678+FPGA XC7V690T的6U VPX信号处理卡

当多块盘并行工作时,存储阵列读写带宽成指数增长,2块盘则≥4GB/s,4块盘则≥8GB/s,以此类推。存储阵列的存储容量由单盘配置决定,目前单块NVME存储盘存储容量可选择512GB、1TB、2TB、4TB、8TB、16TB。硬盘管理通过文件系统,FPGA的PCIeX4与 6U VPX主板互联,操作系统直接映射管理硬盘,也可以通过前面板QSFP+ 光纤导出给其他服务器设备。本方案优势就是集中的进行采集,存储,计算一体化,降低硬件成本、功耗,减小设备体积、重量。信号处理,无线电通信领域。

Orihard_的博客 678

linux下redis安装、启动与停止,redis做成服务

如果的linux可以链接网络,那么可以直接联网下载。直接输入代码:wget http://download.redis.io/releases/redis-3.0.2.tar.gztar zxvf redis-3.0.2.tar.gz 我们会看到在该目录下多了一个文件,redis-3.0.2 ,我们进入该目录,然后编译执行命令make,等待10左右,我们就会看到已经编译完了,我们看到如下界面,说明...

你是我的天晴 4万+

Xilinx高级调试方法--远程调试

本文主要介绍Xilinx的一些高级调试方法,以及如何使用Xilinx的相关IP。

斌赋的博客 3308

【部署】Docker部署OpenClaw及常见问题解决(win11)

给AI单独开一个隔离的小容器,AI执行所有命令、下载文件都在这个小盒子里,就算AI被诱导执行危险命令,也不会影响你Win11本机的文件和系统,是必开的安全功能。Docker容器里的OAuth回调,会尝试在你Win11本机的1455端口捕获认证信息,但容器和Win11本机的网络隔离,导致浏览器访问不到这个回调地址。「挂载」就是把你Win11本机的文件夹,共享给容器里的「虚拟小电脑」,两边都能读写文件,比如你想让AI操作你D盘里的代码文件,就需要挂载。

海兰 4697

Redis系列之安装(Windows、Linux、Mac、单机、分布式)

单机版 Linux,Windows,RedisPLus客户端免密连接 集群版 本地计算机上的Redis服务启动后停止。

lonelymanontheway的博客 554

FreeRTOS全攻略:从入门到精通

本文聚焦 FreeRTOS,从基础概念出发,阐述其开源、轻量级等优势。着重介绍 FreeRTOS 入门知识,涵盖内存管理、任务操作、同步互斥机制等核心内容。其中,空闲任务与钩子函数保障系统基础运行与功能扩展;队列、信号量、互斥锁和事件组等机制,分别从数据传递、资源访问控制、优先级问题解决及多任务同步等方面,为开发者提供高效的任务间协作与资源管理方案,助力开发者掌握 FreeRTOS 核心技术,为嵌入式项目开发筑牢基础。

邓邓子的博客 6357

Centos7安装Redis

安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。如果要让Redis以后台方式启动,则必须修改Redis配置文件,就在我们之前解压的redis安装包下(其他的常见配置可以选择配置,比如监听的端口、工作目录、指定日志文件名开启日志的保存功能,不必要。redis的启动方式有很多种,例如默认启动,指定配置启动,开机自启。可以下载各种redis的客户端,这里使用的是RESP。可以在centos进入redis进行数据库的操作。

qq_47637405的博客 1万+

YOLO26涨点改进 | 检测头Head创新改进篇 | 利用DynamicConv高效动态卷积改进YOLO26检测头,DyHead通过增强检测头操作,轻量化改进、提高模型目标检测的精度

YOLO26作为新一代轻量化目标检测模型的代表,凭借精简的Backbone架构、高效的特征融合 Neck 设计,在实时检测场景(如嵌入式设备、边缘计算)中展现出优异的性能,成为工业落地与科研入门的优选模型。但在实际应用中,YOLO26原生检测头仍存在核心瓶颈:采用固定参数卷积核,无法根据输入特征的目标尺度、纹理差异动态调整卷积权重,导致多尺度目标适配不足、复杂背景下特征利用率低,且传统改进方案往往难以平衡“精度提升”与“轻量化”,要么精度提升有限,要么大幅增加参数量、拖累推理速度。

qq_36130719的博客 370

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【redis】centos7下安装redis7

在CentOS 7下安装Redis7可以通过以下两种方法实现:手动编译安装和使用YUM进行安装。

morris 3万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Centos7.0 安装Redis 3.2.1详细过程和使用常见问题

环境:Cent OS 7.0 Redis 3.2.1 Redis的安装与启动这里我把Redis放在/home/xuliugen/software/下,所以在该目录下执行下列命令:$ wget http://download.redis.io/releases/redis-3.2.1.tar.gz $ tar xzf redis-3.2.1.tar.gz $ cd redis-3.2.1 $ m

徐刘根的博客 1万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

centos7 使用yum卸载redis3.2版本并安装redis5版本

由于项目中使用到了redis5及以上版本的功能,所以redis3.2无法满足要求,所以需要卸载redis3.2,并安装redis5版本。这里对操作步骤和遇到的问题进行记录,方便下次遇到类似的问题可以参考。

liaomingwu的专栏 1021

一文学会 CentOS7 安装配置 Redis

CentOS7 安装 Redis 步骤 1、安装 gcc 依赖 2、上传并解压 redis 安装包 3、进入 redis 解压目录 4、安装并指定安装目录 5、启动服务 5.1、前台启动 5.2、后台启动 6、开机自启设置 7、重启系统,测试Redis

不迁怒,不贰过。小知识,大智慧。 3334

CentOS7.x系统安装Redis6.0.1

文章目录1.下载Redis2.安装Redis2.1编译Redis2.2升级gcc版本2.3make install CentOS7.x安装Redis6.0.1 1.下载Redis 下载Redis最新稳定版6.0.1,https://redis.io/ [solang@solang ~]$ wget http://download.redis.io/releases/redis-6.0.1.tar.gz 2.安装Redis 2.1编译Redis [solang@solang ~]$ tar -zxf red

Life is for sharing的博客 5133

Centos 7安装 Redis

Centos 7 安装redis流程

小松鼠的博客 5695

CentOS7下安装redis3.2.9

CentOS 7上安装redis3.2.9 redis离线安装步骤如下: 1、下载redis安装包。下载地址为https://redis.io/download 下载下来的文件为redis-3.2.9.tar.gz 2、通过WinSCP工具把安装包上传到linux系统上面 创建一个redis的目录存放安装包和编译之后的文件 mkdir redis 3、解压安装包 t

tianhouquan的专栏 3858

【开发心得】CentOS7编译Redis7.4.2打包RPM完整方案

由于最近客户需要解决redis版本升级问题,故而全网寻找安全版本,redis7.4.x版本求而为果,只能自己编译了。截止发文时间2025-02-12 最新稳定版的redis版本号为7.4.2。

清风唱诗人的博客 5068
上一篇: ceph的实践
下一篇: redis的C/C++ API
for_tech
博客等级 码龄11年 50粉丝 37原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值