上一篇blog【Redis从入门到放弃系列 十四】Redis集群之哨兵模式详细介绍了哨兵模式,加上之前讲到的主从复制模式,一共聊到了两种模式,实际上哨兵模式也是基于主从复制上的一种更加高可用的模式,那么今天要聊到的cluster模式,它一定意义上也是基于主从复制模式的,只不过比主从复制模式更加强大,不仅做到了主从的读写分离包括读的负载均衡,还能进行很好的写的负载均衡:
- 高可扩展, 分散单台服务器的访问压力,实现负载均衡
- 高可扩展,分散单台服务器的存储压力,实现可扩展性
- 高可用, 降低单台服务器宕机带来的业务灾难
具备了以上特点的Cluster架构如下:
Cluster集群结构设计
数据写入时会依据CRC算key,计算结果再对16384个插槽取余,然后放置到指定主服务器。因为初始化机器的时候就会给每个主初始化一定数量的槽,数据放到哪个槽一定是有明确的路由地址的:
如果直接访问一次命中就直接取,否则就由客户端直接去目标机器找,因为存在地址簿,所以最多两次命中:
槽是集群建立之初或集群加减机器时都会动态调整和变化的。每个机器分为若干个槽slot,加机器和减机器都可以通过动态调整槽来实现。
Cluster集群搭建
前几篇blog都在一台机器上分别用不同的端口号来进行Redis集群的搭建和使用,既然我已经通过三台虚拟机连成了一个分布式系统,我也别老在一台虚机上玩儿了,今天正式整出一个真实的Redis的cluster集群来:
盘点现有资源并规划集群
我现在有三台虚拟机,并且我要起一个三主三从的cluster的Redis集群,所以我每台虚机上还是要起两个实例,但是同一个主从的不能都放到一台机器上,按照企业级的灾备方案去考量:
服务器 | 主RedisIP | 从RedisIP |
Centos-TML1【192.168.5.101】 | 192.168.5.101:6379 | 192.168.5.101:6380 |
Centos-TML2【192.168.5.102】 | 192.168.5.102:6379 | 192.168.5.102:6380 |
Centos-TML3【192.168.5.103】 | 192.168.5.103:6379 | 192.168.5.103:6380 |
当然为了分散主从,我们的主从对应关系如下:
主服务器master | 从服务器slave |
192.168.5.101:6379 | 192.168.5.102:6380 |
192.168.5.102:6379 | 192.168.5.103:6380 |
192.168.5.103:6379 | 192.168.5.101:6380 |
调整配置并分发Redis
首先我们将各种日志和其它配置文件都干掉,更加方便的观察集群的变化:
清空日志文件
[root@192 redis-6.0.8]# cd data [root@192 data]# ll 总用量 16 -rw-r--r-- 1 root root 116 11月 1 17:35 appendonly-6379.aof -rw-r--r-- 1 root root 202 11月 1 17:35 dump-6379.rdb -rw-r--r-- 1 root root 175 11月 1 16:28 dump-6380.rdb -rw-r--r-- 1 root root 202 11月 1 17:35 dump-6381.rdb [root@192 data]# rm -rf * [root@192 data]# ll 总用量 0 [root@192 data]#
清空哨兵配置文件和6380、6381配置文件,仅保留6379配置文件
[root@192 redis-6.0.8]# cd config/ [root@192 config]# ll 总用量 8 -rw-r--r-- 1 root root 325 11月 1 17:35 redis-6379.conf [root@192 config]#
调整6379配置文件增加集群的相关配置如下
port 6379 daemonize no #logfile "redis-6379.log" dir "/root/redis-6.0.8/data" dbfilename "dump-6379.rdb" rdbcompression yes rdbchecksum yes save 10 2 appendonly yes appendfilename "appendonly-6379.aof" appendfsync everysec #重点调整内容 bind 192.168.5.101 cluster-enabled yes //是否开启集群 cluster-config-file nodes-6379.conf //集群日志文件输入 cluster-node-timeout 10000 //集群发现超时时间
查看配置文件如下:
[root@192 config]# cat redis-6379.conf port 6379 daemonize no #logfile "redis-6379.log" dir "/root/redis-6.0.8/data" dbfilename "dump-6379.rdb" rdbcompression yes rdbchecksum yes save 10 2 appendonly yes appendfilename "appendonly-6379.aof" appendfsync everysec bind 192.168.5.101 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 10000
6379配置文件复制一个6380的配置文件出来
[root@192 config]# sed "s/6379/6380/g" redis-6379.conf >redis-6380.conf [root@192 config]# ll 总用量 8 -rw-r--r-- 1 root root 333 11月 14 12:31 redis-6379.conf -rw-r--r-- 1 root root 333 11月 14 12:34 redis-6380.conf [root@192 config]# cat redis-6380.conf port 6380 daemonize no #logfile "redis-6380.log" dir "/root/redis-6.0.8/data" dbfilename "dump-6380.rdb" rdbcompression yes rdbchecksum yes save 10 2 appendonly yes appendfilename "appendonly-6380.aof" appendfsync everysec bind 192.168.5.101 cluster-enabled yes cluster-config-file nodes-6380.conf cluster-node-timeout 10000 [root@192 config]#
分发192.101.5.101上的Redis分别到其它两台虚拟机上
使用AppNode的文件对传模式将Redis进行集群分发,这样其它两台服务器上也就都有了Redis了,要做的就是改配置文件的端口号。
分别修改102机器和103机器上6379和6380配置文件的端口号
102机器上的6379配置如下:
[root@192 ~]# cd redis-6.0.8/config/ [root@192 config]# cat redis-6379.conf port 6379 daemonize no #logfile "redis-6379.log" dir "/root/redis-6.0.8/data" dbfilename "dump-6379.rdb" rdbcompression yes rdbchecksum yes save 10 2 appendonly yes appendfilename "appendonly-6379.aof" appendfsync everysec bind 192.168.5.102 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 10000 [root@192 config]#
103机器上的6379配置如下
[root@192 ~]# cd redis-6.0.8/config/ [root@192 config]# cat redis-6379.conf port 6379 daemonize no #logfile "redis-6379.log" dir "/root/redis-6.0.8/data" dbfilename "dump-6379.rdb" rdbcompression yes rdbchecksum yes save 10 2 appendonly yes appendfilename "appendonly-6379.aof" appendfsync everysec bind 192.168.5.103 cluster-enabled yes cluster-config-file nodes-6379.conf cluster-node-timeout 10000 [root@192 config]#
6380的配置文件修改方式类似,主要改bind的ip地址
启动集群并查看信息
启动集群分为以下几个步骤:杀掉所有Redis现存进程、启动集群中的服务节点、联通集群
杀掉所有Redis现存进程
启动集群之前需要杀掉所有现存Redis进程来保证实验环境准确性:
[root@192 config]# ps -ef | grep redis- root 67888 1 0 11:02 ? 00:00:09 redis-server *:6380 root 67901 1 0 11:02 ? 00:00:09 redis-server *:6381 root 68018 1 0 11:06 ? 00:00:13 redis-sentinel *:26379 [sentinel] root 68243 1 0 11:13 ? 00:00:12 redis-sentinel *:26380 [sentinel] root 68411 1 0 11:20 ? 00:00:11 redis-sentinel *:26381 [sentinel] root 69268 1 0 12:09 ? 00:00:04 redis-server 127.0.0.1:6379 root 70700 70588 0 12:59 pts/7 00:00:00 grep --color=auto redis- [root@192 config]# kill -s 67888 -bash: kill: 67888: 无效的信号声明 [root@192 config]# kill -s 9 67888 [root@192 config]# kill -s 9 67901 [root@192 config]# kill -s 9 68018 [root@192 config]# kill -s 9 68243 [root@192 config]# kill -s 9 68411 [root@192 config]# kill -s 9 69268 [root@192 config]# ps -ef | grep redis- root 70776 70588 0 13:01 pts/7 00:00:00 grep --color=auto redis- [root@192 config]#
激活每一台的Redis指令
配置完成后我们就可以正式启动集群并查看集群的启动信息了,注意一点,在启动客户端之前一定要安装下Redis,否则会找不到指令:
[root@192 redis-6.0.8]# redis-server config/redis-6379.conf bash: redis-server: 未找到命令... [root@192 redis-6.0.8]#
经过安装后即可激活Redis的指令
启动集群并查看信息
[root@192 redis-6.0.8]# make install cd src && make install make[1]: 进入目录“/root/redis-6.0.8/src” Hint: It's a good idea to run 'make test' ;) INSTALL install INSTALL install INSTALL install INSTALL install INSTALL install make[1]: 离开目录“/root/redis-6.0.8/src” [root@192 redis-6.0.8]# redis-server config/redis-6379.conf 20088:C 14 Nov 2020 12:52:53.265 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 20088:C 14 Nov 2020 12:52:53.265 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=20088, just started 20088:C 14 Nov 2020 12:52:53.265 # Configuration loaded 20088:M 14 Nov 2020 12:52:53.265 * Increased maximum number of open files to 10032 (it was originally set to 1024). 20088:M 14 Nov 2020 12:52:53.266 * No cluster configuration found, I'm 94d9e1637bd1701b146e367ffa7a69e8c24566e8 _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 6.0.8 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in cluster mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 20088 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 20088:M 14 Nov 2020 12:52:53.281 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 20088:M 14 Nov 2020 12:52:53.281 # Server initialized 20088:M 14 Nov 2020 12:52:53.281 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 20088:M 14 Nov 2020 12:52:53.281 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo madvise > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled (set to 'madvise' or 'never'). 20088:M 14 Nov 2020 12:52:53.281 * Ready to accept connections
这样分别启动三台机器的主master和从slave,启动后效果如下:
三台主服务器和三台从服务器均已启动完毕。查看其中的101可以看到如下进程号:
[root@192 ~]# ps -ef | grep redis- root 70362 69871 0 12:45 pts/4 00:00:01 redis-server 192.168.5.101:6379 [cluster] root 70795 70588 0 13:02 pts/7 00:00:00 redis-server 192.168.5.101:6380 [cluster] root 70893 70830 0 13:05 pts/0 00:00:00 grep --color=auto redis- [root@192 ~]#
安装Ruby
之前的Redis集群启用是需要Ruby的,所以我就安装了Ruby。首先通过如下wget下载Ruby2.6.5版本:
[root@192 ~]# wget https://cache.ruby-china.com/pub/ruby/ruby-2.6.5.tar.xz --2020-11-14 13:21:45-- https://cache.ruby-china.com/pub/ruby/ruby-2.6.5.tar.xz 正在解析主机 cache.ruby-china.com (cache.ruby-china.com)... 36.248.208.250 正在连接 cache.ruby-china.com (cache.ruby-china.com)|36.248.208.250|:443... 已连接。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:11553580 (11M) [application/x-tar] 正在保存至: “ruby-2.6.5.tar.xz” 100%[=========================================================================================================================================================================================>] 11,553,580 9.29MB/s 用时 1.2s 2020-11-14 13:21:47 (9.29 MB/s) - 已保存 “ruby-2.6.5.tar.xz” [11553580/11553580]) [root@192 ~]#
然后解压Ruby
xz -d ruby-2.6.5.tar.xz 第一次解压,得到ruby-2.6.5.tar tar -xvf ruby-2.6.5.tar 第二次解压,得到目录ruby-2.6.5
解压结束后进入Ruby目录下编译安装Ruby
./configure --prefix=/usr/local/ruby make make install
添加全文的Ruby环境变量并查看安装状态
[root@192 ruby-2.6.5]# echo "PATH=$PATH:/usr/local/ruby/bin" >> /etc/bashrc [root@192 ruby-2.6.5]# source /etc/bashrc [root@192 ruby-2.6.5]# ruby -v ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-linux]