知识点

相关文章

更多

最近更新

更多

redis 集群使用主从复制架构-redis集群管理

2019-03-24 00:09|来源: 网路

 redis集群使用主从架构如下图,能有效解决集群中节点连接不上造成集群挂掉的情况
 a) 在Redis集群中可以使用主从模式实现某一个节点的高可用
 b) 当该节点(master)宕机后,集群会将该节点的从数据库(slave)转变为(master)继续完成集群服务;


创建主从集群

 参考前面的主从复制和集群环境搭建,启动6个redis实例,分别是:
 6380(主) 6480(从)
 6381(主) 6481(从)
 6382(主) 6482(从)


[root@master redis-cluster-master-slave]# pwd

 /opt/redis/redis-cluster-master-slave
 [root@master redis-cluster-master-slave]# tree
 ├── 6380
 │   └── redis.conf
 ├── 6381
 │   └── redis.conf
 ├── 6382
 │   └── redis.conf
 ├── 6480
 │   └── redis.conf
 ├── 6481
 │   └── redis.conf
 └── 6482
     └── redis.conf


启动redis-server

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6380/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6381/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6382/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6480/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6481/redis.conf
 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6482/redis.conf


创建集群,指定了从库数量为1,创建顺序为主库(3个)、从库(3个)

 [root@master redis-cluster-master-slave]# /opt/redis/redis-3.2.1/src/redis-trib.rb create --replicas 1 192.168.56.101:6380 192.168.56.101:6381 192.168.56.101:6382 192.168.56.101:6480 192.168.56.101:6481 192.168.56.101:6482
 >>> Creating cluster
 >>> Performing hash slots allocation on 6 nodes...
  Using 3 masters:
  192.168.56.101:6380
  192.168.56.101:6381
  192.168.56.101:6382
  Adding replica 192.168.56.101:6480 to 192.168.56.101:6380
  Adding replica 192.168.56.101:6481 to 192.168.56.101:6381
  Adding replica 192.168.56.101:6482 to 192.168.56.101:6382
 M: 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380
    slots:0-5460 (5461 slots) master
 M: 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381
    slots:5461-10922 (5462 slots) master
 M: aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382
    slots:10923-16383 (5461 slots) master
 S: 74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480
    replicates 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15
 S: 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481
    replicates 87d7a6fba680f6826fe680a73ab9ea692aa1b03f
 S: 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482
    replicates aba2eba21bbe0b39423afd940a40e692c4fe7408
 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 192.168.56.101:6380)
 M: 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380
    slots:0-5460 (5461 slots) master
 M: 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381
    slots:5461-10922 (5462 slots) master
 M: aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382
    slots:10923-16383 (5461 slots) master
 M: 74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480
    slots: (0 slots) master
    replicates 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15
 M: 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481
    slots: (0 slots) master
    replicates 87d7a6fba680f6826fe680a73ab9ea692aa1b03f
 M: 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482
    slots: (0 slots) master
    replicates aba2eba21bbe0b39423afd940a40e692c4fe7408
 [OK] All nodes agree about slots configuration.
 >>> Check for open slots...
 >>> Check slots coverage...
 [OK] All 16384 slots covered.


查看集群节点信息

 192.168.56.101:6380> cluster nodes
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 slave 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 0 1468862135140 4 connected
  4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468862137161 5 connected
  87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468862133120 2 connected 5461-10922
  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 myself,master - 0 0 1 connected 0-5460
  aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 master - 0 1468862138173 3 connected 10923-16383
  4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468862136149 6 connected


测试集群

 1、添加和查询数据
 192.168.56.101:6380> set abc 123
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 OK
 192.168.56.101:6480> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 192.168.56.101:6480> keys *
 (empty list or set)
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6481 -c
 192.168.56.101:6481> keys *
 1) "abc"


添加和查询都正常,说明集群运行正常


2、测试集群中slave节点宕机

 将6480节点kill掉,查看情况。



查看集群节点信息,发现6480已经断开连接:

 192.168.56.101:6481> cluster nodes
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 master - 0 1468862952812 3 connected 10923-16383
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468862953824 2 connected 5461-10922
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 slave,fail 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 1468862829946 1468862827923 4 disconnected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468862951799 3 connected
 768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 master - 0 1468862949770 1 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 myself,slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 0 5 connected


连接集群中的客户端,发现集群可用,可见从数据库宕机不会影响集群正常服务

 192.168.56.101:6481> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 192.168.56.101:6381> set k1 111
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 OK
 192.168.56.101:6382> get k1
 "111"
 192.168.56.101:6382>
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6482 -c
 192.168.56.101:6482> get k1
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 "111"
 192.168.56.101:6382>
 [root@master redis-cluster]# /usr/local/bin/redis-cli -h 192.168.56.101 -p 6382 -c
 192.168.56.101:6382> get k1
 "111"


恢复6480服务:

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6480/redis.conf


测试6480中的数据:

 192.168.56.101:6480> get k1
 -> Redirected to slot [12706] located at 192.168.56.101:6382
 "111"


3、测试集群中master宕机

 假设6380宕机:



查看集群情况:

 192.168.56.101:6382> cluster nodes
  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380 master,fail - 1468863435404 1468863431554 1 disconnected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468863595024 6 connected
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 myself,master - 0 0 3 connected 10923-16383
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 master - 0 1468863594011 8 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468863597051 5 connected
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468863596038 2 connected 5461-10922


发现:

 1、6380节点失效不可用
 2、6480节点从slave转换为master


测试集群是否可用:

 192.168.56.101:6382> get abc
 -> Redirected to slot [7638] located at 192.168.56.101:6381
 "123"
 集群可用。


恢复6380,并查看集群信息

 [root@master redis-cluster-master-slave]# /usr/local/bin/redis-server /opt/redis/redis-cluster-master-slave/6380/redis.conf


192.168.56.101:6382> cluster nodes

  768ad8c6edc4b88b650bffc9ab0fd22f4e85ce15 192.168.56.101:6380   slave   74f0fd0468eefad443bcd4627069d217e9213c72 0 1468863759429 8 connected
 4d09704a783936c024305797dec32e5d1debe922 192.168.56.101:6482 slave aba2eba21bbe0b39423afd940a40e692c4fe7408 0 1468863757408 6 connected
 aba2eba21bbe0b39423afd940a40e692c4fe7408 192.168.56.101:6382 myself,master - 0 0 3 connected 10923-16383
  74f0fd0468eefad443bcd4627069d217e9213c72 192.168.56.101:6480 master - 0 1468863754363 8 connected 0-5460
 4ce9eab1382bc2e1886c29df3b4263e701bf5e6e 192.168.56.101:6481 slave 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 0 1468863758418 5 connected
 87d7a6fba680f6826fe680a73ab9ea692aa1b03f 192.168.56.101:6381 master - 0 1468863756394 2 connected 5461-10922


发现:

 1、6380节点可用
 2、6480依然是主节点
 3、6380成为6480的从数据库


注:使用集群需要注意的事项

 1、 多键的命令操作(如MGET、MSET),如果每个键都位于同一个节点,则可以正常支持,否则会提示错误。
 2、 集群中的节点只能使用0号数据库,如果执行SELECT切换数据库会提示错误。


书生参考网络整理


redis知识点

redis快速入门

reids常用命令

redis数据结构

java_API_客户端

Jedis

Tlcache

redis_持久化

AOF

RDB

发布订阅(pub/sub)

redis_事件

redis事务

redis通讯协议

RESP(Redis Serialization Protocol)

redis高可用

redis哨兵

监控(Monitoring) 提醒(Notification) 自动故障迁移(Automatic failover)

redis主从复制

  • 复制模式

    1. 主从复制
    2. 从从复制
  • 复制过程

    • slave向master发送sync命令;
    • master开启子进程执行bgsave写入rdb文件;
    • master发送缓存和RDB文件给slave;
    • master发送数据发送给slave完成复制;

redis集群(Redis_Cluster)

相关问答

更多
  • 用的是什么集群方式,JedisSentinelPool 还是ShardedJedisPool。 如果用的是前者,配置是需要连接sentinel端口的(默认26379),不是连接redis端口(6379)。 或者把spring相关配置文件贴出来一下。 127.0.0.1:26379 127.0.0.1:26380 127.0.0.1:26381
  • 用的是什么集群方式,JedisSentinelPool 还是ShardedJedisPool。 如果用的是前者,配置是需要连接sentinel端口的(默认26379),不是连接redis端口(6379)。 或者把spring相关配置文件贴出来一下。

    redis怎么使用[2024-01-20]

    应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键。 这样处理,主要是实时读写redis,而mysql数据则通过队列异步处理,缓解mysql压力,不过这种方法应用场景主要基于高并发,而且redis的高可用集群架构相对更复杂,一般不是很推荐。
  • 作用是复制一个与当前进程一样的进程,新进程的所有数据(变量、环境变量、程序计数器等)数值都和原进程一致,但是是一个全新的进程,也称为原进程的子进程。
  • 应用Redis实现数据的读写,同时利用队列处理器定时将数据写入mysql。 同时要注意避免冲突,在redis启动时去mysql读取所有表键值存入redis中,往redis写数据时,对redis主键自增并进行读取,若mysql更新失败,则需要及时清除缓存及同步redis主键
  • redis主从复制 redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379 主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。 redis复制过程如下: 1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master ser ...
  • redis主从复制 和Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。 全量同步 Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下: - 从服务器连接主服务器,发送SYNC命令; - 主服务器接收到SYNC命名后,开始执行B ...
  • redis主从复制总结整理 主题 Redis Redis的主从复制策略是通过其持久化的rdb文件来实现的,其过程是先dump出rdb文件,将rdb文件全量传输给slave,然后再将dump后的操作实时同步到slave中。让从服务器(slave server)成为主服务器(master server)的精确复制品。官方文档ReplicationHowto中提到以下特点: 一个master支持多个slave,slave可以接受其他slave的连接,作为其他slave的master,从而形成一个master-sl ...
  • redis主从复制 redis主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.33.130 6379 主要是通过master server持久化的rdb文件实现的。master server 先dump出内存快照文件,然后将rdb文件传给slave server,slave server 根据rdb文件重建内存表。 redis复制过程如下: 1、slave server启动连接到master server之后,salve server主动发送SYNC命令给master ser ...
  • 1. client在一个连接中发出multi命令时, 2. 这个连接会进入一个事务上下文, 3. 该连接后续的命令不会立即执行, 4. 而是先放到一个队列中,当执行exec命令时,redis会顺序的执行队列中的所有命令!