作为一名开发人员,数据库我们都不陌生,因为我们的数据都是使用数据库来进行存储的,但是由于一般情况下不会出现高并发的情况,所以看起来并没有什么问题,可是一旦涉及到大数据量的需求,比如秒杀等场景或者是访问量瞬间较大的时候,单一的使用数据库保存数据的系统会因为磁盘读/写速度比较慢而存在严重的性能弊端,瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,很容易造成数据库系统瘫痪,最终导致服务宕机的严重问题。
为了解决这样的问题,我们通常会引入NoSQL,这是一种基于内存的数据库,并且提供一定的持久化功能。
Redis 是一个使用ANSI C编写的、完全开源的、遵守 BSD 协议、包含多种数据结构、支持网络、基于内存、可选持久性的、高性能的 key-value 数据库。是现在最受欢迎的NoSQL数据库之一,上面说的高并发导致宕机的问题,我们一般都会引入Redis来解决。
Redis 的应用场景包括但不限于:缓存系统(“热点”数据:高频读、低频写)、计数器、消息队列系统、排行榜、社交网络和实时系统等。还有官网列出的这些,如图:
上面这些我们都可以在实际的开发中使用,拿我自身的开发经历来说吧,比如开发短链系统的时候,我用到了上面的
由于资源有限,我们的redis集群就搭建在同一台虚拟机里面,安装6个redis(三主三从),用不同的端口来区分。
IP:192.168.0.22
# 三主端口分别是:
7000、7001和7002
# 三从端口分别是:
7003、7004和7005
为什么需要三主三从6个节点呢?
我们给集群应该有几个节点做一个假设:
2个节点,一个宕掉,剩下的1个不超过1半(1),集群停止工作
3个节点,一个宕掉,剩下的两个超过1半(1.5),集群 继续工作
4个节点,一个宕掉,剩下的3个超过1半(2个),集群 继续工作
4个节点,两个宕掉,剩下的2个不超过1半(2个),集群停止工作
所以要保证集群继续工作,不管是3个节点还是4个节点都是只允许一个节点宕掉,由此可见3个节点是最实际的选择。
综上所述,所以redis主从集群最少需要6个节点:master节点至少要3个,slave节点也是3个。
另外redis官网也建议集群三主三从。
[root@dxm22 ~]# mkdir -p /data/redis6
[root@dxm22 ~]# cd /data/redis6/
# redis官网
[root@dxm22 redis6]# wget https://download.redis.io/releases/redis-6.0.9.tar.gz
# 如果redis官网下载太慢,可以使用华为镜像网站下载,先放着,有需要的同学自取
[root@dxm22 redis6]# wget https://mirrors.huaweicloud.com/redis/redis-6.0.9.tar.gz
[root@dxm22 redis6]# ll -h
总用量 2.2M
-rw-r--r-- 1 root root 2.2M 10月 27 15:14 redis-6.0.9.tar.gz
[root@dxm22 redis6]# tar -zxvf redis-6.0.9.tar.gz
进入解压后的目录进行编译安装。
[root@dxm22 redis6]# cd redis-6.0.9/
# PREFIX的值:/usr/local/redis这个是安装目录,可以改成自己想要的安装目录。
[root@dxm22 redis-6.0.9]# make PREFIX=/usr/local/redis install
编译安装完成之后可以看到我们的安装目录(/usr/local/redis)下就有了bin这个目录。
# 创建目录:redis6-cluster
[root@dxm22 redis-6.0.9]# mkdir -p /usr/local/redis6-cluster
# 查看/usr/local目录
[root@dxm22 redis-6.0.9]# ll /usr/local
# 切换目录到/usr/local/
[root@dxm22 redis-6.0.9]# cd /usr/local/
[root@dxm22 local]#
# 切换完成之后复制
[root@dxm22 local]# cp -r redis/bin/ redis6-cluster/redis7000
[root@dxm22 local]# cd redis6-cluster/
[root@dxm22 redis6-cluster]# ll redis7000
注意:这里redis6-cluster下面redis7000目录不需要手动创建,执行命令之后会 自动创建 的,后面的5个也是如此。
[root@dxm22 local]# cp /data/redis6/redis-6.0.9/redis.conf /usr/local/redis6-cluster/redis7000/
主要修改以下几个地方:1、端口号修改为7000;2、开启集群创建模式,打开注释即可。cluster-enabled yes 表示启用cluster;3、修改bind地址为0.0.0.0;4、修改redis最大占用内存maxmemory为512mb;
[root@dxm22 local]# vim redis6-cluster/redis7000/redis.conf
复制的5份文件夹的名称分别是redis7001、redis7002、redis7003、redis7004、redis7005
# 切换目录到redis6-cluster
[root@dxm22 local]# cd redis6-cluster/
# 复制为redis7001
[root@dxm22 redis6-cluster]# cp -r redis7000/ redis7001
[root@dxm22 redis6-cluster]# ll redis7001/
总用量 45940
-rwxr-xr-x 1 root root 6384048 12月 10 20:21 redis-benchmark
-rwxr-xr-x 1 root root 11290840 12月 10 20:21 redis-check-aof
-rwxr-xr-x 1 root root 11290840 12月 10 20:21 redis-check-rdb
-rwxr-xr-x 1 root root 6690128 12月 10 20:21 redis-cli
-rw-r--r-- 1 root root 84839 12月 10 20:21 redis.conf
lrwxrwxrwx 1 root root 12 12月 10 20:21 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 11290840 12月 10 20:21 redis-server
# 修改文件夹redis7001下redis.conf端口号为7001
[root@dxm22 redis6-cluster]# cd redis7001/
[root@dxm22 redis7001]# vim redis.conf
# 复制为redis7002
[root@dxm22 redis6-cluster]# cp -r redis7000/ redis7002
[root@dxm22 redis6-cluster]# cd redis7002
[root@dxm22 redis7002]# ll
总用量 45940
-rwxr-xr-x 1 root root 6384048 12月 10 20:23 redis-benchmark
-rwxr-xr-x 1 root root 11290840 12月 10 20:23 redis-check-aof
-rwxr-xr-x 1 root root 11290840 12月 10 20:23 redis-check-rdb
-rwxr-xr-x 1 root root 6690128 12月 10 20:23 redis-cli
-rw-r--r-- 1 root root 84839 12月 10 20:23 redis.conf
lrwxrwxrwx 1 root root 12 12月 10 20:23 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 11290840 12月 10 20:23 redis-server
# 修改文件夹redis7002下redis.conf端口号为7002
[root@dxm22 redis7002]# vim redis.conf
# 复制为redis7003
[root@dxm22 redis6-cluster]# cp -r redis7000/ redis7003
[root@dxm22 redis6-cluster]# cd redis7003
[root@dxm22 redis7003]# ll
总用量 45940
-rwxr-xr-x 1 root root 6384048 12月 10 20:26 redis-benchmark
-rwxr-xr-x 1 root root 11290840 12月 10 20:26 redis-check-aof
-rwxr-xr-x 1 root root 11290840 12月 10 20:26 redis-check-rdb
-rwxr-xr-x 1 root root 6690128 12月 10 20:26 redis-cli
-rw-r--r-- 1 root root 84839 12月 10 20:26 redis.conf
lrwxrwxrwx 1 root root 12 12月 10 20:26 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 11290840 12月 10 20:26 redis-server
# 修改文件夹redis7003下redis.conf端口号为7003
[root@dxm22 redis7003]# vim redis.conf
# 复制为redis7004
[root@dxm22 redis6-cluster]# cp -r redis7000/ redis7004
[root@dxm22 redis6-cluster]# cd redis7004
[root@dxm22 redis7004]# ll
总用量 45940
-rwxr-xr-x 1 root root 6384048 12月 10 20:27 redis-benchmark
-rwxr-xr-x 1 root root 11290840 12月 10 20:27 redis-check-aof
-rwxr-xr-x 1 root root 11290840 12月 10 20:27 redis-check-rdb
-rwxr-xr-x 1 root root 6690128 12月 10 20:27 redis-cli
-rw-r--r-- 1 root root 84839 12月 10 20:27 redis.conf
lrwxrwxrwx 1 root root 12 12月 10 20:27 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 11290840 12月 10 20:27 redis-server
# 修改文件夹redis7004下redis.conf端口号为7004
[root@dxm22 redis7004]# vim redis.conf
# 复制为redis7005
[root@dxm22 redis6-cluster]# cp -r redis7000/ redis7005
[root@dxm22 redis6-cluster]# cd redis7005
[root@dxm22 redis7005]# ll
总用量 45940
-rwxr-xr-x 1 root root 6384048 12月 10 20:29 redis-benchmark
-rwxr-xr-x 1 root root 11290840 12月 10 20:29 redis-check-aof
-rwxr-xr-x 1 root root 11290840 12月 10 20:29 redis-check-rdb
-rwxr-xr-x 1 root root 6690128 12月 10 20:29 redis-cli
-rw-r--r-- 1 root root 84839 12月 10 20:29 redis.conf
lrwxrwxrwx 1 root root 12 12月 10 20:29 redis-sentinel -> redis-server
-rwxr-xr-x 1 root root 11290840 12月 10 20:29 redis-server
# 修改文件夹redis7005下redis.conf端口号为7005
[root@dxm22 redis7005]# vim redis.conf
6个节点挨个启动有点繁琐,这里我们使用脚本文件批量启动。
[root@dxm22 redis6-cluster]# vim start-all-redis.sh
内容如下:
cd redis7000
./redis-server redis.conf &
cd ..
cd redis7001
./redis-server redis.conf &
cd ..
cd redis7002
./redis-server redis.conf &
cd ..
cd redis7003
./redis-server redis.conf &
cd ..
cd redis7004
./redis-server redis.conf &
cd ..
cd redis7005
./redis-server redis.conf &
cd ..
[root@dxm22 redis6-cluster]# chmod +x start-all-redis.sh
[root@dxm22 redis6-cluster]# ./start-all-redis.sh
Running in cluster mode 说明是集群模式。
从redis官网看到要创建集群要使用redis-cli,因为我们这里是redis版本是6.0.9。
[root@dxm22 redis6-cluster]# cd redis7000
[root@dxm22 redis7000]# ./redis-cli --cluster create 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 \
> --cluster-replicas 1
# 此处使用的命令是create,因为我们要创建一个新集群。该选项--cluster-replicas 1意味着我们希望为每个创建的主机都提供一个从机。其他参数是我要用于创建新集群的实例的地址列表。
注意: 这里的IP和端口要换成自己的IP和端口。
[OK] All 16384 slots covered.说明16384个槽位全部分配完毕。
至此redis6集群搭建完成。从图中可以看到每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10933-16383solts。
[root@dxm22 redis7000]# ./redis-cli -c -p 7001
127.0.0.1:7001> set a 1
这里选择的是redis7000的文件夹,为什么-p后面使用的是7001的端口呢?就是为了让大家明白,任意一个都可以,一样的。
从这两张图可以看出集群中的节点是自动跳转的,这就要归功于命令中的-c选项了,如果不加-c选项节点之间是无法自动跳转的,也可以看出数据的存储是均匀分配到不同节点的。
127.0.0.1:7000> cluster nodes
127.0.0.1:7000> cluster info
[root@dxm22 redis7000]# ./redis-cli -p 7000 cluster nodes | grep master
所以7000、7001和7002是主节点。让我们使用DEBUG SEGFAULT命令使节点7001崩溃 :
[root@dxm22 redis7000]# ./redis-cli -p 7001 debug segfault
[root@dxm22 redis7000]# ./redis-cli -p 7000 cluster nodes | grep master
可以看到7001端口已经崩溃,7004从slave变成了master节点。
[root@dxm22 redis7000]# cd ../redis7001
[root@dxm22 redis7001]# ./redis-server ./redis.conf &
我们把上面那个批量启动redis的脚本做一下改动,内容如下:
[root@dxm22 redis6-cluster]# cat start-all-redis.sh
cd /usr/local/redis6-cluster/redis7000
./redis-server redis.conf &
cd /usr/local/redis6-cluster/redis7001
./redis-server redis.conf &
cd /usr/local/redis6-cluster/redis7002
./redis-server redis.conf &
cd /usr/local/redis6-cluster/redis7003
./redis-server redis.conf &
cd /usr/local/redis6-cluster/redis7004
./redis-server redis.conf &
cd /usr/local/redis6-cluster/redis7005
./redis-server redis.conf &
[root@dxm22 redis6-cluster]# vim stop-all-redis.sh
[root@dxm22 redis6-cluster]# cat stop-all-redis.sh
ps aux|grep redis|awk {
print $2}|xargs kill -15
[root@dxm22 redis6-cluster]# vim /etc/systemd/system/redis-cluster.service
内容如下:
[Unit]
Description=Redis6Cluster
After=network.target
[Service]
Type=forking
ExecStart=sh /usr/local/redis6-cluster/start-all-redis.sh
ExecStop=sh /usr/local/redis6-cluster/stop-all-redis.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 重新加载服务列表
[root@dxm22 redis6-cluster]# systemctl daemon-reload
# 先停止掉前面启动的redis进程
[root@dxm22 redis6-cluster]# systemctl stop redis-cluster.service
[root@dxm22 redis6-cluster]# ps aux | grep redis
root 57800 0.0 0.0 12320 1060 pts/0 S+ 23:06 0:00 grep --color=auto redis
# 查看开机服务列表是否有redis服务
[root@dxm22 redis7001]# systemctl list-unit-files | grep redis
redis-cluster.service disabled
# 存在,且非开启自启动,接着使用systemctl启动redis集群服务
[root@dxm22 redis6-cluster]# systemctl start redis-cluster.service
# 查看服务状态
[root@dxm22 redis6-cluster]# systemctl status redis-cluster.service
Active: active (running)说明服务是启动状态,再来看看进程。
[root@dxm22 redis7000]# systemctl enable redis-cluster.service
Created symlink /etc/systemd/system/multi-user.target.wants/redis-cluster.service → /etc/systemd/system/redis-cluster.service.
[root@dxm22 redis7000]# systemctl list-unit-files | grep redis
redis-cluster.service enabled
Prometheus监控Redis cluster和监控MySQL是一样的,都是使用 exporter。
[root@dxm22 redis6-cluster]# mkdir -p /data/redis_exporter
[root@dxm22 redis6-cluster]# cd /data/redis_exporter/
[root@dxm22 redis_exporter]# wget https://github.com/oliver006/redis_exporter/releases/download/v1.14.0/redis_exporter-v1.14.0.linux-amd64.tar.gz
[root@dxm22 redis_exporter]# tar -zxvf redis_exporter-v1.14.0.linux-amd64.tar.gz
[root@dxm22 redis_exporter]# cd redis_exporter-v1.14.0.linux-amd64/
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# ll
总用量 8512
-rw-r--r-- 1 root root 1063 12月 10 09:09 LICENSE
-rw-r--r-- 1 root root 15864 12月 10 09:09 README.md
-rwxr-xr-x 1 root root 8695808 12月 10 09:08 redis_exporter
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# cp redis_exporter /usr/local/bin/
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# ll /usr/local/bin/ | grep redis_exporter
-rwxr-xr-x 1 root root 8695808 12月 11 00:02 redis_exporter
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# nohup /usr/local/bin/redis_exporter -redis.addr=192.168.0.22:7001 –debug &
[1] 58694
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# nohup: 忽略输入并把输出追加到'nohup.out'
这里输入集群中任意一个节点的端口就可以,然后查看进程
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# ps aux | grep redis_exporter
浏览器输入IP+9121访问。我这里是http://192.168.0.22:9121/。
[root@dxm22 redis_exporter]# vim /etc/systemd/system/redis_exporter.service
内容如下:
[Unit]
Description=redis_exporter
After=network.target
[Service]
Type=simple
ExecStart=nohup /usr/local/bin/redis_exporter -redis.addr=192.168.0.22:7001 –debug &
PrivateTmp=true
RestartSec=5
StartLimitInterval=0
Restart=always
[Install]
WantedBy=multi-user.target
# 重新加载服务列表
[root@dxm22 redis_exporter]# systemctl daemon-reload
# 先停止掉前面启动的redis_exporter进程
[root@dxm22 redis_exporter]# ps aux | grep redis_exporter
root 58694 0.2 1.1 713444 21008 pts/0 Sl 00:05 0:11 /usr/local/bin/redis_exporter -redis.addr=192.168.0.22:7001 –debug
root 93164 0.0 0.0 12320 976 pts/0 S+ 01:14 0:00 grep --color=auto redis_exporter
[root@dxm22 redis_exporter]# kill -9 58694
[root@dxm22 redis_exporter]# ps aux | grep redis_exporter
root 93174 0.0 0.0 12320 996 pts/0 S+ 01:15 0:00 grep --color=auto redis_exporter
# 查看开机服务列表是否有redis_exporter服务
[root@dxm22 redis_exporter]# systemctl list-unit-files | grep redis_exporter
redis_exporter.service disabled
# 存在,且非开启自启动,接着使用systemctl启动redis_exporter服务
[root@dxm22 redis_exporter]# systemctl start redis_exporter
# 查看服务状态
[root@dxm22 redis_exporter]# systemctl status redis_exporter
Active: active (running)说明服务是启动状态,再来看看进程。
[root@dxm22 redis_exporter]# systemctl enable redis_exporter.service
Created symlink /etc/systemd/system/multi-user.target.wants/redis_exporter.service → /etc/systemd/system/redis_exporter.service.
[root@dxm22 redis_exporter]# systemctl list-unit-files | grep redis_exporter
redis_exporter.service enabled
[root@dxm22 redis6-cluster]# vim /etc/prometheus/prometheus.yml
增加如下内容:
- job_name: 'redis_exporter_targets'
static_configs:
- targets:
- redis://192.168.0.22:7000 #这里的IP和端口要换成自己的。
- redis://192.168.0.22:7001
- redis://192.168.0.22:7002
- redis://192.168.0.22:7003
- redis://192.168.0.22:7004
- redis://192.168.0.22:7005
params:
check-keys: ["metrics:*"]
metrics_path: /scrape
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.0.22:9121 #部署节点ip
## config for scraping the exporter itself
- job_name: 'redis_exporter'
static_configs:
- targets: ['192.168.0.22:9121'] #部署节点ip
[root@dxm22 redis_exporter-v1.14.0.linux-amd64]# systemctl restart prometheus.service
再次访问http://192.168.0.22:9090/targets。
内容如下:
[root@dxm22 ~]# cat /usr/local/redis6-cluster/redis7000/for.sh
#!/bin/bash
for((i=1;i<=10000000;i++));
do
echo "set a${i} ${i}" >> ./batch_insert.txt;
echo "get a${i}" >> ./batch_insert.txt;
done
# 执行shell脚本
[root@dxm22 ~]# sh /usr/local/redis6-cluster/redis7000/for.sh
# 批量写入数据
[root@dxm22 redis7000]# cat batch_insert.txt | ./redis-cli -h 127.0.0.1 -c -p 7002
再来看看grafana监控:
此时redis性能使用率已经在上升。
至此关于Centos8搭建redis6.0.9集群并使用prometheus监控完成。