Redis集群

一、Redis介绍


  • Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。我可以通过官网查看信息。

  • Redis 是一个内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。

  • Redis与其他key - value缓存产品有以下三个特点:

    • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

    • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

    • Redis支持数据的备份,即master-slave模式的数据备份。

二、编译安装Redis(server1、2、3)


selinux iptables off
操作系统:Red Hat Enterprise Linux Server release 6.5 (Santiago)
百度网盘链接: https://pan.baidu.com/s/1KuhE75pb-6hIWHxk9yjULg 密码: a9bn

1、安装redis

[root@server1 ~]# wget http://download.redis.io/releases/redis-4.0.8.tar.gz
[root@server1 ~]# yum install -y gcc
[root@server1 ~]# tar xf /root/redis-4.0.8.tar.gz
[root@server1 ~]# cd /root/redis-4.0.8
[root@server1 redis-4.0.8]# make && make install
[root@server1 redis-4.0.8]# cd utils/
[root@server1 utils]# ./install_server.sh            ###一直按回车即可

2、可执行文件的作用

  • redis-server: Redis服务主程序。
  • redis-cli: Redis客户端命令行工具,也可以用telnet来操作。redis-benchmark: Redis性能测试工具,用于测试读写性能。
  • redis-check-aof:检查redis aof文件完整性,aof 文件持久化记录服务器执行的所有写操作命令,用于还原数据。
  • redis-check-dump:检查redis rdb文件的完整性,rdb就是快照存储, 即按照一定的策略周期性的将数据保存到磁盘,是默认的持久化方式。
  • redis-sentinel:是集群管理工具,主要负责主从切换。

3、查看端口

[root@server1 ~]# netstat -lntup|grep redis
tcp        0      0 127.0.0.1:6379              0.0.0.0:*                   LISTEN      4710/redis-server 1 

三、Redis主从复制


1、配置6379.conf(server2)

这里server2就是Master!!!

[root@server2 ~]# vim /etc/redis/6379.conf

Redis集群_第1张图片

2、查看结果

[root@server2 ~]# /etc/init.d/redis_6379 restart

[root@server2 ~]# netstat -lntup|grep redis
tcp        0      0 0.0.0.0:6379                0.0.0.0:*                   LISTEN      4639/redis-server 0 

3、配置6379.conf(server1)

[root@server1 ~]# vim /etc/redis/6379.conf

Redis集群_第2张图片
Redis集群_第3张图片

[root@server1 ~]# /etc/init.d/redis_6379 restart

4、查看结果

(1)在server2中设置
[root@server2 ~]# redis-cli
127.0.0.1:6379> set dream ya
127.0.0.1:6379> get dream
127.0.0.1:6379> quit

Redis集群_第4张图片

(2)server1中查看
[root@server1 ~]# redis-cli 
127.0.0.1:6379> config get bind
127.0.0.1:6379> get dream
127.0.0.1:6379> MONITOR

Redis集群_第5张图片

(3)查看权限
[root@server1 ~]# redis-cli 
127.0.0.1:6379> config get slave-read-only          ###可以通过设置写权限:CONFIG SET min-slaves-to-write 1
1) "slave-read-only"
2) "yes"
127.0.0.1:6379> quit

5、配置server3

[root@server3 ~]# vim /etc/redis/6379.conf 

Redis集群_第6张图片
Redis集群_第7张图片

[root@server3 ~]# /etc/init.d/redis_6379 restart

6、查看结果

(1)能否通Master(server3)
[root@server3 ~]# redis-cli
127.0.0.1:6379> get dream
"ya"
127.0.0.1:6379> info
127.0.0.1:6379> MONITOR
OK
1534777332.869540 [0 10.10.10.2:6379] "PING"
1534777342.891554 [0 10.10.10.2:6379] "PING"
(2)查看信息(server2)
[root@server2 ~]# redis-cli
127.0.0.1:6379> info 

Redis集群_第8张图片

四、Redis高可用(哨兵)


1、简介

  • redis sentinel是社区版本推出的原生高可用解决方案,其架构主要包括两部分:redis sentinel集群和redis数据集群。

  • 其中redis sentinel集群是由若干sentinel节点组成的分布式集群,可以实现故障发现、故障自动转移、配置中心和客户端统治。redis sentinel的节点数量要满足2n+1(n>1)的奇数个。

2、配置sentinel.conf (server2)

[root@server2 ~]# cp /root/redis-4.0.8/sentinel.conf /etc/redis/
[root@server2 ~]# vim /etc/redis/sentinel.conf 

Redis集群_第9张图片
Redis集群_第10张图片
Redis集群_第11张图片

sentinel monitor mymaster 10.10.10.2 6379 2设置master 并写入如果有两个节点认为主服务器down机,则主服务器down机

3、发送到server1、3

[root@server2 ~]# scp /etc/redis/sentinel.conf server1:/etc/redis/
[root@server2 ~]# scp /etc/redis/sentinel.conf server3:/etc/redis/

4、测试

(1)打开监控
[root@server1 ~]# redis-server /etc/redis/sentinel.conf --sentinel         ###命令是等价的
[root@server2 ~]# redis-sentinel /etc/redis/sentinel.conf
[root@server3 ~]# redis-server /etc/redis/sentinel.conf --sentinel
(2)停掉server2
[root@server2 ~]# redis-cli
127.0.0.1:6379> info              ###可以发现现在的Master是server2
...
# Replication
role:master
connected_slaves:2
slave0:ip=10.10.10.3,port=6379,state=online,offset=27741,lag=0
slave1:ip=10.10.10.1,port=6379,state=online,offset=27741,lag=0
master_replid:706371d43d9ef61119aeb34fe57dee5964a38874
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:27741
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:27741
...

127.0.0.1:6379> SHUTDOWN                 ###关闭
not connected> 
(3)server2信息

Redis集群_第12张图片

(4)server1中查看信息
###我们也可以使用此命令连接:redis-cli -h 10.10.10.1
[root@server1 ~]# redis-cli             
127.0.0.1:6379> info

Redis集群_第13张图片

(5)可以发现server1和server3配置文件自动变化
[root@server1 ~]# vim /etc/redis/sentinel.conf

Redis集群_第14张图片

五、Redis集群搭建


集群的教程参看网址:http://www.redis.cn/topics/cluster-tutorial.html
此处我们拿一台新的虚拟机来做实验!!!

1、Redis集群介绍

(1)集群简介
  • Redis集群是社区版推出的Reids分布式集群解决方案,是一个提供在多个Redis间节点间共享数据的程序集。主要解决Redis分布式方面的需求,比如,当单机内存,并发和流量等瓶颈的时候,reids cluster能起到很好的负载均衡的目的。

  • Redis集群节点最小配置6个节点以上(3主3从)。其中主节点提供读写操作,从节点作为备用节点,不提供请求,只作为故障转移使用。

  • Redis集群采用虚拟槽分区,所以的键根据Hash函数映射到0~16383的整数槽内,每个节点负责维护一部分槽以及槽所映射的键值数据。

  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误.

  • Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令. Redis 集群的优势:

    • 自动分割数据到不同的节点上。
    • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
(2)Redis 集群的主从复制模型
  • 为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

  • 在我们例子中具有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用.

  • 然而如果在集群创建的时候(或者过一段时间)我们为每个节点添加一个从节点A1,B1,C1,那么整个集群便有三个master节点和三个slave节点组成,这样在节点B失败后,集群便会选举B1为新的主节点继续服务,整个集群便不会因为槽找不到而不可用了.

  • 不过当B和B1 都失败后,集群是不可用的.

2、建立配置文件

daemonize:yes:redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
daemonize:no: 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭连接工具(putty,xshell等)都会导致redis进程退出。

[root@server1 ~]# mkdir -p /usr/local/redis-cluster/{7000..7005}
[root@server1 ~]# vim /usr/local/redis-cluster/7000/redis.conf       ###集群的配置文件
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes

###拷贝到其他节点
[root@server1 ~]# cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7001/
[root@server1 ~]# cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7002/
[root@server1 ~]# cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7003/
[root@server1 ~]# cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7004/
[root@server1 ~]# cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7005/

###修改其他节点配置
[root@server1 ~]# sed -i 's#port 7000#port 7001#g' /usr/local/redis-cluster/7001/redis.conf
[root@server1 ~]# sed -i 's#port 7000#port 7002#g' /usr/local/redis-cluster/7002/redis.conf
[root@server1 ~]# sed -i 's#port 7000#port 7003#g' /usr/local/redis-cluster/7003/redis.conf
[root@server1 ~]# sed -i 's#port 7000#port 7004#g' /usr/local/redis-cluster/7004/redis.conf
[root@server1 ~]# sed -i 's#port 7000#port 7005#g' /usr/local/redis-cluster/7005/redis.conf

3、安装redis

[root@server1 ~]# wget http://download.redis.io/releases/redis-4.0.8.tar.gz
[root@server1 ~]# yum install -y gcc
[root@server1 ~]# tar xf /root/redis-4.0.8.tar.gz
[root@server1 ~]# cd /root/redis-4.0.8
[root@server1 redis-4.0.8]# make && make install
[root@server1 redis-4.0.8]# cd utils/
[root@server1 utils]# ./install_server.sh            ###一直按回车即可

4、启动节点

###这样开启其他5个节点,要进入目录中
[root@server1 ~]# cd /usr/local/redis-cluster/7000          
[root@server1 7000]# redis-server redis.conf

[root@server1 7005]# netstat -lntup|grep :700*              ###查看启动端口

Redis集群_第15张图片

5、搭建集群

现在我们已经有了六个正在运行中的 Redis 实例,接下来我们需要使用这些实例来创建集群,并为每个节点编写配置文件。
通过使用Redis集群命令行工具 redis-trib ,编写节点配置文件的工作可以非常容易地完成:redis-trib位于 Redis 源码的 src 文件夹中,它是一个Ruby程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分片(reshared)等工作。

(1)安装集群插件
[root@server1 ~]# cp /root/redis-4.0.8/src/redis-trib.rb /usr/local/bin/      ###使用Redis集群命令行工具redis-trib 
[root@server1 ~]# yum install -y libyaml-0.1.3-4.el6_6.x86_64.rpm rubygems-1.3.7-5.el6.noarch.rpm ruby-2.2.3-1.el6.x86_64.rpm
[root@server1 ~]# gem install --local redis-4.0.1.gem
Successfully installed redis-4.0.1
Parsing documentation for redis-4.0.1
Installing ri documentation for redis-4.0.1
Done installing documentation for redis after 0 seconds
1 gem installed

[root@server1 ~]# gem list
*** LOCAL GEMS ***
bigdecimal (1.2.6)
io-console (0.4.3)
json (1.8.1)
minitest (5.4.3)
power_assert (0.2.2)
psych (2.0.8)
rake (10.4.2)
rdoc (4.2.0)
redis (4.0.1)
test-unit (3.0.8)
(2)redis-trib.rb插件参数介绍
redis-trib.rb:
    create:创建集群
    check:检查集群
    info:查看集群信息
    fix:修复集群
    reshard:在线迁移slot
    rebalance:平衡集群节点slot数量
    add-node:将新节点加入集群
    del-node:从集群中删除节点
    set-timeout:设置集群节点间心跳连接的超时时间
    call:在集群全部节点上执行命令
    import:将外部redis数据导入集群 
(3)启动集群

[root@server1 ~]# 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:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e858cc1041d8e0d5757ccdf68a2514a94da19015 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
M: 6264263f274a04eb098049a20153641340798a33 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
M: ebd720f77242f9e5a56cb59d9c5cb63a4bf91762 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
S: 86bc9a1471d8226920a44ec442a705d7f54fdc18 127.0.0.1:7003
   replicates ebd720f77242f9e5a56cb59d9c5cb63a4bf91762
S: 47c1d8be0ac4a0194f6ce1fbb139c1557e6d46b3 127.0.0.1:7004
   replicates e858cc1041d8e0d5757ccdf68a2514a94da19015
S: 9d3c9de34994ba216235eb77c088935c8cb12eaa 127.0.0.1:7005
   replicates 6264263f274a04eb098049a20153641340798a33
Can I set the above configuration? (type 'yes' to accept): yes       ###输入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: e858cc1041d8e0d5757ccdf68a2514a94da19015 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 9d3c9de34994ba216235eb77c088935c8cb12eaa 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6264263f274a04eb098049a20153641340798a33
S: 47c1d8be0ac4a0194f6ce1fbb139c1557e6d46b3 127.0.0.1:7004
   slots: (0 slots) slave
   replicates e858cc1041d8e0d5757ccdf68a2514a94da19015
S: 86bc9a1471d8226920a44ec442a705d7f54fdc18 127.0.0.1:7003
   slots: (0 slots) slave
   replicates ebd720f77242f9e5a56cb59d9c5cb63a4bf91762
M: 6264263f274a04eb098049a20153641340798a33 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: ebd720f77242f9e5a56cb59d9c5cb63a4bf91762 127.0.0.1:7002
   slots:10923-16383 (5461 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)查看集群信息

主从我们都可以进行写入,但是从写入的数据会自动迁移到主上!!!

[root@server1 ~]# redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER NODES               ###查看节点
9d3c9de34994ba216235eb77c088935c8cb12eaa 127.0.0.1:7005@17005 slave 6264263f274a04eb098049a20153641340798a33 0 1535188729149 6 connected
47c1d8be0ac4a0194f6ce1fbb139c1557e6d46b3 127.0.0.1:7004@17004 slave e858cc1041d8e0d5757ccdf68a2514a94da19015 0 1535188728147 5 connected
86bc9a1471d8226920a44ec442a705d7f54fdc18 127.0.0.1:7003@17003 slave ebd720f77242f9e5a56cb59d9c5cb63a4bf91762 0 1535188728048 4 connected
6264263f274a04eb098049a20153641340798a33 127.0.0.1:7001@17001 master - 0 1535188729650 2 connected 5461-10922
ebd720f77242f9e5a56cb59d9c5cb63a4bf91762 127.0.0.1:7002@17002 master - 0 1535188728000 3 connected 10923-16383
e858cc1041d8e0d5757ccdf68a2514a94da19015 127.0.0.1:7000@17000 myself,master - 0 1535188727000 1 connected 0-5460
127.0.0.1:7000> set dream ya
OK
127.0.0.1:7000> get dream
"ya"
127.0.0.1:7000> quit

[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: e858cc1041d8e0d5757ccdf68a2514a94da19015 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 9d3c9de34994ba216235eb77c088935c8cb12eaa 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 6264263f274a04eb098049a20153641340798a33
S: 47c1d8be0ac4a0194f6ce1fbb139c1557e6d46b3 127.0.0.1:7004
   slots: (0 slots) slave
   replicates e858cc1041d8e0d5757ccdf68a2514a94da19015
S: 86bc9a1471d8226920a44ec442a705d7f54fdc18 127.0.0.1:7003
   slots: (0 slots) slave
   replicates ebd720f77242f9e5a56cb59d9c5cb63a4bf91762
M: 6264263f274a04eb098049a20153641340798a33 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: ebd720f77242f9e5a56cb59d9c5cb63a4bf91762 127.0.0.1:7002
   slots:10923-16383 (5461 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.

[root@server1 ~]# redis-trib.rb info 127.0.0.1:7000            ###查看节点信息
127.0.0.1:7001 (6264263f...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:7000 (e858cc10...) -> 1 keys | 5461 slots | 1 slaves.
127.0.0.1:7002 (ebd720f7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.

到此集群就已经安装完毕!!!

六、集群基础操作


1、节点添加

[root@server1 ~]# mkdir -p /usr/local/redis-cluster/700{6..8}
[root@server1 ~]#cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7006/
[root@server1 ~]#cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7007/
[root@server1 ~]#cp /usr/local/redis-cluster/7000/redis.conf /usr/local/redis-cluster/7008/
[root@server1 ~]# sed -i 's#port 7000#port 7006#g' /usr/local/redis-cluster/7006/redis.conf 
[root@server1 ~]# sed -i 's#port 7000#port 7007#g' /usr/local/redis-cluster/7007/redis.conf 
[root@server1 ~]# sed -i 's#port 7000#port 7008#g' /usr/local/redis-cluster/7008/redis.conf 

2、启动

[root@server1 ~]# cd /usr/local/redis-cluster/7006/      ###其他也同样启动
[root@server1 7006]# redis-server redis.conf 

Redis集群_第16张图片

3、添加Slave节点

[root@server1 ~]# redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000

Redis集群_第17张图片

4、添加Master节点

[root@server1 ~]# redis-trib.rb add-node --master-id 1 127.0.0.1:7007 127.0.0.1:7004
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000

Redis集群_第18张图片

5、指定Master添加Slave

[root@server1 ~]# redis-trib.rb add-node --slave --master-id 9fe24f9ab820dd235265931ffcd49f97afce090b 127.0.0.1:7008 127.0.0.1:7000
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000

Redis集群_第19张图片

6、删除节点

如果Master节点有Slave节点,可以先删除Master节点后从Slave节点把数据转移到其他节点!!!

[root@server1 ~]# redis-trib.rb del-node 127.0.0.1:7008 6e5e8d6be8311c4da14a890d62b08af7247847a2
[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000           ###可以发现7008节点被删除了

Redis集群_第20张图片

7、重新分配hash

通过上图我们可以看到7007节点solt为空!!!

[root@server1 ~]# redis-trib.rb reshard 127.0.0.1:7007
...
How many slots do you want to move (from 1 to 16384)? 1000 
What is the receiving node ID? 9fe24f9ab820dd235265931ffcd49f97afce090b      ###7007节点的ID
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
...
###在输入2次yes即可

[root@server1 ~]# redis-trib.rb check 127.0.0.1:7000

Redis集群_第21张图片

你可能感兴趣的:(运维)