[NoSQL数据库] Redis集群部署

一、Redis集群配置

为每一个集群的节点准备一个配置文件:

# 7000.conf
port 7000
bind 192.168.1.181
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
# 7001.conf
port 7001
bind 192.168.1.181
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
# 7002.conf
port 7002
bind 192.168.1.181
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes

以上三个配置文件都在192.168.1.181机器上,三个集群节点分别绑定的端口为7000、7001、7002。相当于三台redis服务器。

在另外一台机器192.168.1.180上,同样也准备三个redis服务:

# 7003.conf
port 7003
bind 192.168.1.180
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
# 7004.conf
port 7004
bind 192.168.1.180
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
# 7005.conf
port 7005
bind 192.168.1.180
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes

这三个redis服务跑在192.168.1.180机器上,使用7003、7004、7005端口。

二、运行Redis节点

使用第一节中的6个配置文件,分别在两台机器上启动6个redis实例(服务)。

[[email protected] ~]# redis-server ./7000.conf
1855:C 05 Jan 2020 22:29:55.465 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1855:C 05 Jan 2020 22:29:55.465 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1855, just started
1855:C 05 Jan 2020 22:29:55.465 # Configuration loaded
[[email protected]-base ~]# redis-server ./7001.conf
1860:C 05 Jan 2020 22:30:01.587 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1860:C 05 Jan 2020 22:30:01.587 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1860, just started
1860:C 05 Jan 2020 22:30:01.587 # Configuration loaded
[[email protected]-base ~]# redis-server ./7002.conf
1865:C 05 Jan 2020 22:30:03.438 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1865:C 05 Jan 2020 22:30:03.438 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=1865, just started
1865:C 05 Jan 2020 22:30:03.438 # Configuration loaded
[[email protected] ~]# redis-server ./7003.conf
21201:C 05 Jan 2020 22:35:57.144 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21201:C 05 Jan 2020 22:35:57.144 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=21201, just started
21201:C 05 Jan 2020 22:35:57.144 # Configuration loaded
[[email protected]-base ~]# redis-server ./7004.conf
21206:C 05 Jan 2020 22:35:59.415 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21206:C 05 Jan 2020 22:35:59.415 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=21206, just started
21206:C 05 Jan 2020 22:35:59.415 # Configuration loaded
[[email protected]-base ~]# redis-server ./7005.conf
21211:C 05 Jan 2020 22:36:01.211 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
21211:C 05 Jan 2020 22:36:01.211 # Redis version=5.0.7, bits=64, commit=00000000, modified=0, pid=21211, just started
21211:C 05 Jan 2020 22:36:01.211 # Configuration loaded

查看进程:

root       1856      1  0 22:29 ?        00:00:00 redis-server 192.168.1.181:7000 [cluster]
root       1861      1  0 22:30 ?        00:00:00 redis-server 192.168.1.181:7001 [cluster]
root       1866      1  0 22:30 ?        00:00:00 redis-server 192.168.1.181:7002 [cluster]
root       1871   1403  0 22:30 pts/0    00:00:00 grep --color=auto redis
root      21202      1  0 22:35 ?        00:00:00 redis-server 192.168.1.180:7003 [cluster]
root      21207      1  0 22:35 ?        00:00:00 redis-server 192.168.1.180:7004 [cluster]
root      21212      1  0 22:36 ?        00:00:00 redis-server 192.168.1.180:7005 [cluster]
root      21217   9126  0 22:36 pts/0    00:00:00 grep --color=auto redis

三、创建集群

1.创建集群

执行以下命令创建集群:

[[email protected] src]# redis-cli --cluster create --cluster-replicas 1 192.168.1.181:7000 192.168.1.181:7001 192.168.1.181:7002 192.168.1.180:7003 192.168.1.180:7004 192.168.1.180:7005
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.180:7005 to 192.168.1.181:7000
Adding replica 192.168.1.181:7002 to 192.168.1.180:7003
Adding replica 192.168.1.180:7004 to 192.168.1.181:7001
M: 0e8ad6ec3c1dbd9bc4aa7571717b98f2eddfae7f 192.168.1.181:7000
   slots:[0-5460] (5461 slots) master
M: b42102dab52497b36ed5b768b01463b09f7e7eab 192.168.1.181:7001
   slots:[10923-16383] (5461 slots) master
S: 75a547cdad955d5b77812fb7db7b276594cdcde2 192.168.1.181:7002
   replicates 6fa4cbb6d52841c91a0e9f747e5b906a8b6f10b1
M: 6fa4cbb6d52841c91a0e9f747e5b906a8b6f10b1 192.168.1.180:7003
   slots:[5461-10922] (5462 slots) master
S: 00e3e7ed62c230ebbafb15ab5a7194ca28221112 192.168.1.180:7004
   replicates b42102dab52497b36ed5b768b01463b09f7e7eab
S: 240f6cc79a637db17d35d39edd42475484ca56ad 192.168.1.180:7005
   replicates 0e8ad6ec3c1dbd9bc4aa7571717b98f2eddfae7f
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.1.181:7000)
M: 0e8ad6ec3c1dbd9bc4aa7571717b98f2eddfae7f 192.168.1.181:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: b42102dab52497b36ed5b768b01463b09f7e7eab 192.168.1.181:7001
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
M: 6fa4cbb6d52841c91a0e9f747e5b906a8b6f10b1 192.168.1.180:7003
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 240f6cc79a637db17d35d39edd42475484ca56ad 192.168.1.180:7005
   slots: (0 slots) slave
   replicates 0e8ad6ec3c1dbd9bc4aa7571717b98f2eddfae7f
S: 75a547cdad955d5b77812fb7db7b276594cdcde2 192.168.1.181:7002
   slots: (0 slots) slave
   replicates 6fa4cbb6d52841c91a0e9f747e5b906a8b6f10b1
S: 00e3e7ed62c230ebbafb15ab5a7194ca28221112 192.168.1.180:7004
   slots: (0 slots) slave
   replicates b42102dab52497b36ed5b768b01463b09f7e7eab
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

注意,在命令中,我们使用了 --cluster-replicas 1 ,这个表示每一个主节点配一个从节点。所以将6个redis实例,分成了3个主,3个从。

其中主节点为7000、7001、7003。他们的从节点分别是:7005、7004、7002。

2.槽(slots)

注意,redis一共有16384个slots,用于存储数据。

当我们只有一个redis服务的时候,所有的数据都存放在这些槽里面。

而当我们使用集群的时候,例如上述的3个主节点,那么这16384个槽会分配到三台主节点中。(注意上述命令中标黄的部分)

当我们向集群中存储数据的时候,例如:

set name leo

Redis会通过CRC16算法来计算name对应的值,然后再除以16384,余数就是对应该存放的slot编号(公式:CRC16(key)%16384)。然后根据这个编号去连接对应的主节点,进行存储。

我们随便连接一个redis实例(在集群中,连接任何一个实例都相当于连接到了集群),并执行set name leo:

[[email protected] src]# redis-cli -h 192.168.1.181 -c -p 7002
192.168.1.181:7002> set name leo
-> Redirected to slot [5798] located at 192.168.1.180:7003
OK
192.168.1.180:7003> 

可以看到,我们连接的192.168.1.181:7002其实属于slave,使用-c表示连接到集群,否则会报错。当执行set name leo的时候,redis计算到name对应的slot编号为5798,对应的是192.168.1.180:7003主节点。

然后自动跳转连接了192.168.1.180:7003,并存储了数据。

3.主从切换

当某个主节点宕机的时候,与他连接的从节点会自动变为主节点。

例如,我们杀掉192.168.1.181:7000的redis进程:

[[email protected] src]# kill -9 1856
[[email protected]-base src]# ps -ef | grep redis
root       1861      1  0 22:30 ?        00:00:04 redis-server 192.168.1.181:7001 [cluster]
root       1866      1  0 22:30 ?        00:00:04 redis-server 192.168.1.181:7002 [cluster]
root       1906   1403  0 22:56 pts/0    00:00:00 grep --color=auto redis

此时,我们查看7000对应slave节点192.168.1.180:7005的状态:

[[email protected] src]# redis-cli -h 192.168.1.180 -p 7005 info replication
# Replication
role:master
connected_slaves:0
master_replid:43d5b373d03e9a1ef4853b60c0504e25a562a62a
master_replid2:97def7c7993bcfbcbb6105aef2e86ae51190d236
master_repl_offset:1148
second_repl_offset:1149
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1148

可以看到7005已经变成了主节点。

如果此时,7000重新上线,则会作为7005的Slave节点存在:

[[email protected] ~]# redis-cli -h 192.168.1.181 -p 7000 info replication
# Replication
role:slave
master_host:192.168.1.180
master_port:7005
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:1176
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:43d5b373d03e9a1ef4853b60c0504e25a562a62a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1176
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1149
repl_backlog_histlen:28

4.集群注意事项

注意:集群必须存在3个以及3个以上的主节点,否则在创建集群时会失败,并且当存活的主节点数小于总节点的一半时,整个集群就无法提供服务了。

5.Python操作Redis集群

安装redis-py-cluster:

pip install redis-py-cluster

使用python连接集群:

from rediscluster import RedisCluster

if __name__ == ‘__main__‘:
    try:
        startup_nodes = [
            # 这里可以将所有的主总节点都写上
            {‘host‘: ‘192.168.1.181‘, ‘port‘: ‘7000‘},
            {‘host‘: ‘192.168.1.181‘, ‘port‘: ‘7001‘},
            {‘host‘: ‘192.168.1.181‘, ‘port‘: ‘7002‘},
            {‘host‘: ‘192.168.1.180‘, ‘port‘: ‘7003‘},
            {‘host‘: ‘192.168.1.180‘, ‘port‘: ‘7004‘},
            {‘host‘: ‘192.168.1.180‘, ‘port‘: ‘7005‘},
        ]

        src = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
        res = src.set(‘name‘, ‘leo‘)
        print(res)
    except Exception as e:
        print(e)

对集群的操作和对单个redis的操作是一样的。

原文地址:https://www.cnblogs.com/leokale-zz/p/12154234.html

时间: 2024-10-11 13:43:53

[NoSQL数据库] Redis集群部署的相关文章

redis集群部署配置

Redis集群部署配置 测试环境:服务器系统为centos6.5,redis版本为3.2.2,使用一台机器,模拟6个redis实例来创建redis集群,其中3主3从 分别建立redis的安装目录,并复制redis.conf到安装目录下. 2.修改每个目录下的redis.conf配置文件 port 7000   #端口 daemonize yes cluster-enabled yes   #开启集群模式 cluster-config-file nodes-7000.conf  #集群配置文件 c

Redis集群部署文档(Ubuntu15.10系统)

Redis集群部署文档(Ubuntu15.10系统)(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下)127.0.0.1:7000127.0.0.1:7001127.0.0.1:7002127.0.0.1:7003127.0.0.1:7004127.0.0.1:7005 1:下载redis.官网下载3.0.0版本,之前2.几的版本不支持集群模式下载地址:http://download.redis

剑指架构师系列-Redis集群部署

初步搭建Redis集群 克隆已经安装Redis的虚拟机,我们使用这两个虚拟机中的Redis来搭建集群. master:192.168.2.129 端口:7001 slave:192.168.2.132 端口:7002 sentinel:192.168.2.129 端口:26379 来说一下这个sentinel,sentinel是一个管理redis实例的工具,它可以实现对redis的监控.通知.自动故障转移.sentinel不断的检测redis实例是否可以正常工作,通过API向其他程序报告redi

redis集群部署之codis 维护脚本

搞了几天redis cluster codis 的部署安装,测试,架构优化,配合研发应用整合,这里记一些心得! 背景需求: 之前多个业务都在应用到redis库,各业务独立占用主从两台服务器,硬件资源利用不合理,主从架构冗余度不高,主redis故障的话,从redis恢复需要时间,降低业务的可用性, 所以调研测试部署了基于codis的redis集群. 官方地址 部署文档 参考这里redis cluster安装部署 维护管理 了解过codis的同志都知道codis集群组件服务启动有一定顺序的,而且基本

Redis集群部署过程记录(3台服务器共6个节点)

这是我的第一篇博文,整理了我在部署Redis集群踩过的坑,以及详细的部署过程,同时归结了部署过程中遇到的问题的处理方法.1.部署的环境:SUSE Linux Enterprise 11 sp42.涉及到的安装包如下:(1) 安装包:redis-4.0.2.tar.gz下载地址:http://download.redis.io/releases/ redis官网http://www.redis.io(2) 接口包:redis-4.0.0.gem(3) 脚本语言包:ruby-2.4.2.tar.gz

Redis集群部署(一)

一.Redis集群介绍 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集. Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误. Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势: 自动分割数据到不同的节点上. 整个集群的部分节点失败或者不可达的情况下能够继续处理命令. Redis 集群的数据分

redis 集群部署--实例

1 安装环境 jdk1.8.0  redis 3.0.6 双机主从,192.168.1.5主   192.168.1.6从 做redis缓存服务器 用sentinel监控redis实现HA 2 安装配置 首先安装jdk环境(略,请自行调整环境) 分别安装redis-master和redis-slave yum install -y redis 配置redis-master 192.168.1.5 vim /etc/redis.conf daemonize yes pidfile /var/run

Redis集群部署(二)

                                添加主从节点 一.查看集群信息redis-cli -p 6379 cluster nodes [[email protected] redis]# redis-cli -h 192.168.1.3 -p 6379 cluster nodes dbc41c1e1a3c0c51c1e2a8216dace0f8883cf51f 192.168.1.3:6385 master - 0 1434048814711 0 connected 85

Redis集群部署

0, 先决条件Redis安装依赖 gcc-c++Redis集群依赖 ruby rubygems安装命令:$ yum -y install ruby rubygems 1,安装1.1, 下载 Redis,下载地址:http://download.redis.io/releases/redis-3.2.9.tar.gz$ wget http://download.redis.io/releases/redis-3.2.9.tar.gz 1.2, 解压安装包$ tar xzf redis-3.2.9.