redis集群
<h1>一、redis集群-cluster模式(6个实例)</h1>
<p>安装包下载地址:[redis-6.2.4.tar.gz](<a href="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/37be5c8520ec25101b020475ba0328ed">http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/37be5c8520ec25101b020475ba0328ed</a> "[redis-6.2.4.tar.gz")</p>
<h2>1.准备环境:</h2>
<table>
<thead>
<tr>
<th>服务器ip</th>
<th>服务器作用</th>
<th>使用端口</th>
</tr>
</thead>
<tbody>
<tr>
<td>192.168.9.61</td>
<td>3主</td>
<td>7000、7001、7002、17000、17001、17002</td>
</tr>
<tr>
<td>192.168.12.89</td>
<td>3从</td>
<td>7003、7004、7005</td>
</tr>
</tbody>
</table>
<h2>2.cluster集群介绍:</h2>
<p>(1)由多个Redis服务器组成的分布式网络服务集群
(2)集群之中有多个Master主节点,每一个主节点都可读可写
(3)节点之间会互相通信,两两相连
(4)Redis集群无中心节点(去中心化)
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/203ff42ae634739b572fe9340ec8024d" alt="" /></p>
<h2>3.cluster集群复制</h2>
<p>在Redis-Cluster集群中,可以给每一个主节点添加从节点,主节点和从节点之间遵循主从模式的特性。
当用户需要处理更多读请求的时候,添加从节点可以扩展系统的读性能。
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/13dd77cf7f4cc4d1781d3b7c4a9d72ab" alt="" /></p>
<h2>4.故障转移:</h2>
<p>Redis集群的主节点内置了类似Sentinel的节点故障检测和自动故障转移功能,当集群中的某个主节点下线时,集群中的其他在线主节点会注意到这一点,并对已下线的主节点进行故障转移。
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/b2e0d35f17c5826cd086c311e5d543e8" alt="" /></p>
<h2>5.cluster集群优点:</h2>
<pre><code class="language-java">* 多个redis节点网络互联,数据共享
* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
* 支持在线增加、删除节点
* 客户端可以连接任何一个主节点进行读写</code></pre>
<h1>二、搭建集群步骤</h1>
<h2>1.检查两台服务器的系统是否带有gcc</h2>
<p>Rpm –qa|grep gcc
如没有gcc 则使用yum安装gcc
yum install gcc</p>
<h2>2.上传redis源码包并解压安装(两台服务器操作相同)</h2>
<p>创建安装目录
mkdir -p /risen/soft/redis
解压至当前目录
tar –zxvf redis包 –C ./
进入redis文件夹
cd redis文件夹
编译redis
make MALLOC=libc
安装redis至指定位置
make PREFIX=/risen/soft/redis install</p>
<h2>3.每台服务器配置出三个redis实例</h2>
<h3>3.1配置实例(192.168.9.61服务器)</h3>
<p>安装完成后,进入redis安装目录
cd /risen/soft/redis
新建redis实例文件夹
mkdir 7000
mkdir 7001
mkdir 7002
在各实例文件夹中新建data数据目录
mkdir 7000/data
mkdir 7001/data
mkdir 7002/data
在各实例文件夹中新建logs日志目录
mkdir 7000/logs
mkdir 7001/logs
mkdir 7002/logs
在各实例文件夹中复制redis.conf配置文件(源码包中有,也可以上传已经调试好的文件)
上传之后修改主要配置信息:端口,数据文件存放位置,绑定的ip地址
下图为绑定的ip地址
在bind 后配置本机的ip地址
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/02bdbc6647effdbc648243ef6cc57e24" alt="" />
设置redis密码
requirepass Risen@2022
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/27df36d3d619c84fb0200da303e1d1d7" alt="" />
Port定义实例的端口,7000实例即为7000
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/1fa732f4bc03278aa4f92eb9e75386fb" alt="" />
Pidfile配置的是该实例的pid文件根据各实例端口修改文件名称即可
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/b51573058b869c163514abee2073801c" alt="" />
Dir配置的是各实例的数据存放位置
例:实例7000的dir配置信息为/risen/soft/redis/7000/data
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/0009963a857c16af7e0d7b82c75441cf" alt="" />
logfile配置的是各实例的日志存放位置
例:实例7000的logfile配置信息为/risen/soft/redis/7000/logs/redis.log
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/a0c22836db200c4abee3819e9a529e62" alt="" />
以下三个选项是开启集群的重要选项,文件夹位置根据实例文件夹进行修改,放在各实例的主目录即可
例: 端口为7000实例
该配置文件的cluster-config-file 的配置目录为:/risen/soft/redis/7000/nodes-7000.conf
cluster-enabled yes
cluster-config-file /risen/soft/redis/7000/data/nodes-7000.conf
cluster-node-timeout 5000
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/ee0dbd8278be8637fff0e6d50cb554a3" alt="" /></p>
<h3>3.2配置实例(192.168.12.89服务器)</h3>
<p>安装完成后,进入redis安装目录
cd /risen/soft/redis
新建redis实例文件夹
mkdir 7003
mkdir 7004
mkdir 7005
在各实例文件夹中新建data数据目录
mkdir 7003/data
mkdir 7004/data
mkdir 7005/data
在各实例文件夹中新建logs日志目录
mkdir 7003/logs
mkdir 7004/logs
mkdir 7005/logs
在各实例文件夹中复制redis.conf配置文件(源码包中有,也可以上传已经调试好的文件)
上传之后修改主要配置信息:端口,数据文件存放位置,绑定的ip地址
下图为绑定的ip地址
在bind 后配置本机的ip地址
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/37f5207970fea0df9a02340ba40fa8ad" alt="" />
设置redis密码
requirepass Risen@2022
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/1978ec754058a576c6171ecec8dbbd83" alt="" />
Port定义实例的端口,7003实例即为7003
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/4fb9cbbbb9e6f5e710b86a0fb9cb3876" alt="" />
Pidfile配置的是该实例的pid文件根据各实例端口修改文件名称即可
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/56e58813da570b498b902a3b72b4b431" alt="" />
Dir配置的是各实例的数据存放位置
例:实例7003的dir配置信息为/risen/soft/redis/7003/data
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e187b416525cb8a28155be3583386143" alt="" />
logfile配置的是各实例的日志存放位置
例:实例7003的logfile配置信息为/risen/soft/redis/7003/logs/redis.log
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/4d7b90b34cbd5c4e01835d0861f30934" alt="" />
以下三个选项是开启集群的重要选项,文件夹位置根据实例文件夹进行修改,放在各实例的主目录即可
该配置文件的cluster-config-file 的配置目录为:/risen/soft/redis/7003/nodes-7003.conf
cluster-enabled yes
cluster-config-file /risen/soft/redis/7003/data/nodes-7003.conf
cluster-node-timeout 5000
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/ea00709612cd655fd964fd39518d0eec" alt="" /></p>
<h2>3.2开放网络策略</h2>
<p>集群正常工作,集群中的每个节点需要做到以下两点:
正常的客户端通信端口(通常是6379),文档中是7000、7001、7002必须对所有的客户端都开放,换言之,所有的客户端都可以访问
集群总线端口(客户端通信端口 + 10000)必须对集群中的其它节点开放,换言之,其它任意节点都可以访问
192.168.9.61(主)</p>
<pre><code class="language-shell">firewall-cmd --permanent --zone=public --add-port=7000/tcp
firewall-cmd --permanent --zone=public --add-port=7001/tcp
firewall-cmd --permanent --zone=public --add-port=7001/tcp
firewall-cmd --permanent --zone=public --add-port=17000/tcp
firewall-cmd --permanent --zone=public --add-port=17001/tcp
firewall-cmd --permanent --zone=public --add-port=17002/tcp
firewall-cmd --reload</code></pre>
<p>192.168.12.89(从)</p>
<pre><code class="language-shell">firewall-cmd --permanent --zone=public --add-port=7000/tcp
firewall-cmd --permanent --zone=public --add-port=7001/tcp
firewall-cmd --permanent --zone=public --add-port=7001/tcp
firewall-cmd --reload</code></pre>
<h3>3.3启动6个实例,并添加redis集群组</h3>
<p>全部配置完成之后启动redis
192.168.9.61服务器</p>
<pre><code>/risen/soft/redis/bin/redis-server /risen/soft/redis/7000/redis.conf &amp;
/risen/soft/redis/bin/redis-server /risen/soft/redis/7001/redis.conf &amp;
/risen/soft/redis/bin/redis-server /risen/soft/redis/7002/redis.conf &amp;</code></pre>
<p>192.168.14.160服务器</p>
<pre><code>/risen/soft/redis/bin/redis-server /risen/soft/redis/7000/redis.conf &amp;
/risen/soft/redis/bin/redis-server /risen/soft/redis/7001/redis.conf &amp;
/risen/soft/redis/bin/redis-server /risen/soft/redis/7002/redis.conf &amp;</code></pre>
<p>执行完成后,查看redis进程是否启动
ps -ef|grep redis
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/01c24b33bc954d6c106ea5e78e85eb24" alt="" />
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/50e133cf518745a1e26d0ef384b251ee" alt="" />
若没启动检查是否配置有问题
六个redis实例全部启动之后,在两台服务器上任意一台添加redis集群群组</p>
<pre><code>/risen/soft/redis/bin/redis-cli --cluster create 192.168.9.61:7000 192.168.9.61:7001 192.168.9.61:7002 192.168.12.89:7003 192.168.12.89:7004 192.168.12.89:7005 --cluster-replicas 1 -a Risen@2022</code></pre>
<p>-a为redis.conf文件设置的密码
显示如下信息 表示创建集群成功
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/78968227ea630f5b03fe2f33e9448cde" alt="" />
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e90e3b79138a92e5e8d342864e3851a8" alt="" />
问题:搭建Redis集群的过程中,执行到cluster create <ip>:<port> ... 的时候,发现程序在阻塞,显示:Waiting for the cluster to join 的字样,然后就无休无尽的等待...
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/e95a114985b6c0cbf5573fbf096b1e44" alt="" />
开放Redis服务的两个TCP端口。譬如Redis客户端连接端口为6379,而Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即 6379 + 10000 = 16379。所以开放每个集群节点的客户端端口和集群总线端口才能成功创建集群</p>
<h2>4.查询集群信息</h2>
<p>集群创建成功登陆任意redis结点查询集群中的节点情况</p>
<pre><code>/risen/soft/redis/bin/redis-cli -c -h 192.168.9.61 -p 7000 -a Risen@2022</code></pre>
<p><img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/5e2bed31e102cffd573d506680bba5b3" alt="" />
<img src="http://60.191.64.5:16100/server/index.php?s=/api/attachment/visitFile/sign/67d2ecc7c69205075627aa0c1b42f90f" alt="" /></p>
<pre><code class="language-java">-c表示以集群方式连接redis,
-h指定ip地址,
-p指定端口号
-a指定密码
cluster nodes 查询集群结点信息
cluster info 查询集群状态信息</code></pre>
<h2>5.redis开机自启设置(两台服务器设置相同)</h2>
<p>编辑/etc/rc.d/rc.local文件(注:此文件一定要有执行权限)
vim /etc/rc.d/rc.local
注:redis的启动是将提供的start脚本(因每台服务器存在3个实例,脚本需要根据具体情况进行修改)写在该文件中(脚本存放在/risen/data/sh目录下)
文件中添加
sh /risen/data/sh/start.sh
start.sh内容:
/risen/soft/redis/bin/redis-server /risen/soft/redis/7000/redis.conf &
/risen/soft/redis/bin/redis-server /risen/soft/redis/7001/redis.conf &
/risen/soft/redis/bin/redis-server /risen/soft/redis/7002/redis.conf &</p>
<h2>6.定时清理redis日志</h2>
<pre><code class="language-java">crontab -e
#每周六凌晨一点清理
00 1 * * 6 echo &quot;&quot; &gt; /risen/soft/redis/logs/redis.log</code></pre>