Tomcat+MySQL+Redis源码安装三件套
- Tomcat部分
- 概念
- Tomcat的作用
- Tomcat的原理
- Linux运维中的应用场景
- 具体操作示例
- 基本使用流程实验
- Tomcat安装
- tomcat的反向代理及负载均衡
- 源地址hash(不能负载)
- tomcat负载均衡实现(使用cookie)
- memcached 操作命令
- 理论补充
- 结合反向代理实现tomcat部署
- 常见部署方式
- 理论阐述
- 1. Standalone 模式
- 2. 单机反向代理
- 3. 多机反向代理
- 4. 多级代理
- 5. 集群配置
- 总结
- Memcached简介
- Memcached的工作原理
- Memcached与Tomcat的集成
- 工作场景
- MySQL集群技术部分
- 概念
- 原因
- 重要性
- 应用场景
- 基本使用和实验流程
- 源码安装mysql
- mysql的组从复制
- MySQL延迟复制
- 慢查询日志:
- 概念
- 实验
- 测试:
- mysql的并行复制
- 配置MHA高可用
- 搭建主从
- 配置MHA环境
- 剩余配置理论补充
- MHA添加VIP功能
- Redis集群
- 概念
- 1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库
- 1.2 为什么还要用 NoSQL 数据库呢?
- 1.3 RDBMS和NOSQL的特点及优缺点:
- Redis特性
- Redis特性
- 缓存的实现流程
- Redis的安装
- 配置主从同步
- 哨兵:
- 故障解决:
- Redis Cluster(无中心化设计)
- 概念
- Redis Cluster 工作原理
- Redis Cluster特点如下
- Redis cluster 架构
- 创建redis cluster的前提
- 环境配置
- 检测
- 查看集群信息
- **所有的Redis都需要进行密码验证**
- 8台模式:
- 集群扩容
- 添加slave集群
- 拓展实验(clsuter集群维护)
- 代码
- Redis理论补充
- 部署redis cluster
- redis-cli --cluster 参数说明
Tomcat部分
概念
在运维当中,Tomcat的主要作用是作为一个Servlet容器,负责运行Java Web应用程序。它提供了一个环境,使得开发者能够构建和运行基于Java的Web应用。以下是Tomcat的一些关键作用和原理:
Tomcat的作用
- Servlet容器:Tomcat实现了Java Servlet规范,可以加载和管理Servlet,处理HTTP请求和响应。
- JSP支持:Tomcat支持JavaServer Pages(JSP),允许开发者使用JSP编写动态网页。
- Web应用部署:Tomcat可以部署和管理Web应用程序,支持热部署和动态更新。
- 日志和监控:Tomcat提供了日志记录和监控功能,帮助运维人员进行故障排查和性能监控。
- 安全性:Tomcat支持各种安全机制,如用户认证、角色授权和SSL加密。
Tomcat的原理
- 生命周期管理:Tomcat负责管理Servlet的生命周期,包括初始化、服务和销毁。
- 请求处理:Tomcat接收到HTTP请求后,会解析请求,找到对应的Servlet或JSP页面,然后处理请求并生成响应。
- 多线程处理:Tomcat使用多线程技术来处理并发请求,提高服务器的响应能力。
- 类加载机制:Tomcat具有独特的类加载机制,确保Web应用程序之间的隔离性和资源共享。
- 日志和配置:Tomcat使用配置文件(如
server.xml
)来管理服务器的各种设置,并提供日志记录功能。
Linux运维中的应用场景
- Web应用部署:在Linux环境中部署Java Web应用程序,使用Tomcat作为应用服务器。
- 集群和负载均衡:在高并发场景下,使用Tomcat集群和负载均衡技术来提高系统的可用性和性能。
- 性能优化:通过调整Tomcat的配置参数(如线程池大小、连接超时时间等),优化服务器性能。
- 日志分析和监控:使用Linux工具(如
grep
、awk
等)分析Tomcat日志,监控服务器运行状态,及时发现和解决问题。 - 自动化部署和管理:使用Linux脚本(如Shell脚本)自动化Tomcat的部署和管理任务,提高运维效率。
具体操作示例
-
安装Tomcat:
sudo dnf install tomcat9
-
启动和停止Tomcat:
sudo systemctl start tomcat9 sudo systemctl stop tomcat9
-
查看Tomcat日志:
sudo nano /var/log/tomcat9/catalina.out
-
部署Web应用:
将WAR文件复制到Tomcat的webapps
目录下,Tomcat会自动解压并部署应用。sudo cp myapp.war /var/lib/tomcat9/webapps/
-
配置Tomcat:
修改/etc/tomcat9/server.xml
文件来调整Tomcat的配置,例如增加一个新的Context:<Context path="/myapp" docBase="/path/to/myapp" reloadable="true" />
通过以上步骤,可以在Linux环境中高效地管理和维护Tomcat服务器,确保Java Web应用程序的稳定运行。
基本使用流程实验
准备两台纯净的虚拟机,redhat9版本虚拟机,或者centOS7及以上版本,外加一台再加一台nginx主机,并上面安装
Tomcat安装
这个是后来的Tomcat1,后面我自己改了名字
准备Tomcat环境包
配置启动文件
两边Tomcat一样配置
tomcat的反向代理及负载均衡
126是另一台Tomcat的IP地址
两边都有
源地址hash(不能负载)
tomcat负载均衡实现(使用cookie)
使用cookie jsessionid来实现hash
memcached 操作命令
测试:
干掉Tomcat2再看效果:
理论补充
结合反向代理实现tomcat部署
常见部署方式
理论阐述
反向代理是一种常见的网络配置,它允许客户端通过代理服务器访问实际的服务端。在Tomcat部署中,经常使用Nginx作为反向代理服务器,以提高性能、安全性及可维护性。以下是几种常见的部署方式及其工作模式:
1. Standalone 模式
在Standalone模式中,Tomcat独立运行,直接接收和处理用户的请求。这种模式简单,适合开发和测试环境,但在生产环境中可能不够高效,因为Tomcat处理静态资源的能力不如专门的Web服务器。
2. 单机反向代理
在这种模式下,Nginx作为反向代理服务器,前置在Tomcat前面。Nginx处理静态资源请求,并将动态请求(如JSP、Servlet)转发给Tomcat处理。这种方式既能利用Nginx处理静态资源的优势,又能充分利用Tomcat处理Java应用的能力。
3. 多机反向代理
当需要处理大量并发请求时,可以使用多台Tomcat服务器,并通过Nginx进行负载均衡。Nginx不仅作为反向代理服务器,还负责将请求分发到不同的Tomcat实例上,从而提高系统的处理能力和可靠性。
4. 多级代理
在一些复杂的环境中,可能会使用多级代理。例如,LNNMT(Linux + Nginx + Nginx + MySQL + Tomcat)架构中,第一级Nginx处理外部请求,第二级Nginx处理内部请求,然后将请求转发给Tomcat。这种方式可以提供更细粒度的控制和更高的安全性。
5. 集群配置
在需要高可用性和负载均衡的场景中,可以使用Nginx+Tomcat的集群配置。Nginx作为反向代理,将请求分发到多个Tomcat实例上。这样不仅可以提高系统的处理能力,还能确保在某个Tomcat实例出现问题时,其他实例能够接管请求,保证服务的连续性。
总结
反向代理实现Tomcat部署的方式多种多样,可以根据具体的需求选择合适的方案。无论是单机环境还是多机集群,合理利用Nginx和Tomcat的优势,可以显著提升系统的性能和可靠性。
Memcached简介
Memcached是一个高性能的分布式内存对象缓存系统,用于减轻数据库负载,加速动态Web应用。其工作原理主要涉及数据的存储和检索,以及与Tomcat等应用服务器的集成使用。
Memcached的工作原理
-
数据存储:Memcached接收来自客户端(如Tomcat)的请求,将数据以键值对的形式存储在内存中。每个键都会通过哈希算法映射到一个特定的内存位置,以便快速查找。
-
数据检索:当客户端请求某个键的数据时,Memcached会查找相应的内存位置,如果找到则返回数据,否则返回未命中(miss)。
-
LRU策略:当内存满时,Memcached使用最近最少使用(LRU)策略淘汰最不常用的数据,为新的数据腾出空间。
-
分布式:Memcached支持分布式部署,通过一致性哈希等方式将数据分布在多个节点上,提高系统的扩展性和容错能力。
Memcached与Tomcat的集成
-
客户端库:Tomcat通常通过Memcached客户端库(如Spymemcached、XMemcached等)与Memcached服务器通信。这些库提供了方便的API,用于设置和获取缓存数据。
-
缓存策略:在Tomcat中,可以将频繁访问的数据(如数据库查询结果、用户会话信息等)缓存到Memcached中,减少对后端数据库的请求,提高系统性能。
工作场景
-
Web应用加速:在Web应用中,许多请求是重复的,尤其是对静态内容和常见数据的请求。通过将这些数据缓存到Memcached中,可以显著减少数据库负载,提高应用响应速度。
-
会话管理:在分布式Web应用中,传统的Cookie-based会话管理难以扩展。通过将用户会话数据存储在Memcached中,可以实现跨服务器的会话共享,支持无缝的负载均衡和高可用性。
-
数据预加载:在某些应用场景中,可以预先将热点数据加载到Memcached中,进一步提高系统的响应速度。例如,在新闻网站中,可以将热门新闻的数据库记录缓存起来。
-
分布式锁:在多节点环境中,Memcached可以用来实现分布式锁,协调多个应用实例对共享资源的访问,避免并发问题。
通过以上介绍,可以看出Memcached在Web应用的性能优化和分布式系统的设计中扮演了重要角色。结合Tomcat等应用服务器,可以构建出高效、可扩展的Web应用架构。
MySQL集群技术部分
概念
在运维工作中,源码安装MySQL具有以下几个原因、重要性和应用场景:
原因
- 定制化需求:某些特殊应用场景可能需要对MySQL进行定制化编译,以满足特定的功能或性能需求。
- 版本控制:源码安装允许管理员精确控制MySQL的版本,避免依赖包管理工具可能带来的版本冲突问题。
- 优化编译选项:通过源码安装,可以根据硬件和系统特点优化编译选项,获得更好的性能。
- 安全性和控制:源码安装可以让管理员更好地控制MySQL的安装过程和配置,增强系统的安全性。
重要性
- 灵活性:源码安装提供了最大的灵活性,允许管理员根据具体需求进行配置和优化。
- 性能优化:针对特定硬件和操作系统进行优化编译,可以显著提升MySQL的性能。
- 技术支持:源码安装通常伴随着详细的编译和安装文档,有助于运维人员深入理解MySQL的内部结构和工作原理,提供更好的技术支持。
- 安全控制:通过源码安装,可以更好地控制软件的来源和安装过程,减少潜在的安全风险。
应用场景
- 高性能计算环境:在需要极致性能的环境中,源码安装允许管理员针对特定硬件进行优化,提升MySQL的性能表现。
- 特殊功能需求:某些特殊功能可能需要对MySQL源码进行修改或添加补丁,源码安装是唯一的选择。
- 版本兼容性要求:在需要严格控制软件版本的环境中,源码安装可以避免依赖包管理工具可能带来的版本冲突问题。
- 安全要求高的环境:在对安全性要求较高的环境中,源码安装可以让管理员更好地控制软件的来源和安装过程,减少潜在的安全风险。
通过源码安装MySQL,运维人员可以获得更高的灵活性和控制力,更好地满足特定的业务需求和技术要求。
基本使用和实验流程
源码安装mysql
先准备两台虚拟机(红帽7版本的系统)
把里面的libtirpc=devel的包单独拿出来
源码编译安装mysql
[root@mysql-node10 mysql-5.7.44]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
用myisam-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_unicode_ci \
-DWITH_BOOST=/root/mysql-5.7.44/boost/boost_1_59_0/
#指定安装路径
#指定数据目录
#指定套接字文件
#指定启用INNODB存储引擎,默认
#扩展字符集
#指定默认字符集
#指定默认校验字符集
#指定c++库依赖
[root@mysql-node10 mysql-5.7.44]# make -j2 #-j2 核心就跑几个进程 ,2代表核心数
[root@mysql-node10 mysql-5.7.44# make install
部署mysql
#生成启动脚本
[root@node10 ~]# dnf install initscripts-10.11.6-1.el9.x86_64 -y
[root@node10 ~]# cd /usr/local/mysql/support-files/
[root@node10 support-files]# cp mysql.server /etc/init.d/mysqld
#修改环境变量
[root@node10 ~]# vim ~/.bash_profile
export PATH=$PATH:/usr/local/mysql/bin
[root@node10 ~]# source ~/.bash_profile
#生成数据目录
[root@mysql-node1 ~]# useradd -s /sbin/nologin -M mysql
[root@mysql-node1 ~]# mkdir -p /data/mysql
[root@mysql-node1 ~]# chown mysql.mysql /data/mysql/
开始初始化:
最后一行的末尾的e<P-Xngvw6dd是我的密码,每个人的密码随机,自己观察
mysql的组从复制
主(node01为主):
从:
注意要两个YES才成功:如下,
测试:
MySQL延迟复制
在master中写入数据后过了延迟时间才能被查询成功,这里延时是60秒
这个延迟复制不是i/o线程过段时间来复制,i/o是正常工作的
是日志已经保存在slave端了,但是犹豫设置了延时,所以SQL语句的效果需要60秒之后才能生效
node2查询:
查询结果需要等时间
慢查询日志:
概念
慢查询,顾名思义,执行很慢的查询 当执行SQL超过long_query_time参数设定的时间阈值(默认10s)时,就被认为是慢查询,这个 SQL语句就是需要优化的 慢查询被记录在慢查询日志里 慢查询日志默认是不开启的 如果需要优化SQL语句,就可以开启这个功能,它可以让你很容易地知道哪些语句是需要优化的。
实验
主:
SET long_query_time=4;是一条用于设置慢查询日志阈值的命令。这里的
long_query_time` 是一个系统变量,它定义了一个查询被视为“慢查询”的时间阈值,单位是秒。
测试:
mysql的并行复制
当slave挂掉的时候,半同步无法写入,但是十秒(根据自身设定)之后转换成为异步模式就可以写入
配置MHA高可用
搭建主从
从(两台)
重新初始化
执行操作:
两边slave都配置了之后,在slave下才能查出三条
这段MySQL命令是在配置MySQL Group Replication(组复制)时执行的一系列操作。MySQL Group Replication是一个高可用性解决方案,它提供了容错、自动故障检测和自动恢复功能。下面是对这段命令的逐行解释:
-
SET SQL_LOG_BIN=0;
临时关闭二进制日志记录。这在创建用户和授予权限时不希望这些操作被记录到二进制日志中时使用。 -
CREATE USER rpl_user@'%' IDENTIFIED BY 'lee';
创建一个名为rpl_user
的新用户,允许从任何主机(%
)连接,并使用密码lee
进行身份验证。 -
GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
授予rpl_user
用户复制从属(slave)的权限,这意味着该用户可以用于复制过程。 -
FLUSH PRIVILEGES;
刷新权限,使新创建的用户和授予的权限立即生效。 -
SET SQL_LOG_BIN=1;
重新开启二进制日志记录,因为在接下来的操作中需要记录到二进制日志。 -
CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='lee' FOR CHANNEL 'group_replication_recovery';
配置用于组复制恢复通道的复制用户和密码。这个通道用于节点加入组复制时的通信。 -
SET GLOBAL group_replication_bootstrap_group=ON;
设置全局变量group_replication_bootstrap_group
为ON
,这允许当前节点引导整个组复制集群。通常只在第一个节点启动组复制时这样做。 -
START GROUP_REPLICATION;
启动组复制。这将使当前节点开始参与组复制集群。 -
SET GLOBAL group_replication_bootstrap_group=OFF;
将全局变量group_replication_bootstrap_group
设置回OFF
,以防止后续节点引导集群。 -
SELECT * FROM performance_schema.replication_group_members;
查询performance_schema.replication_group_members
表,以查看组复制集群中的成员状态。这个表显示了每个节点的UUID、角色(PRIMARY或SECONDARY)、状态(如ONLINE、RECOVERING、OFFLINE等)以及一些其他信息。
这些命令通常是在配置MySQL Group Replication时在单个节点上执行的,特别是在初始化集群时。在多节点环境中,这些步骤需要在每个节点上重复,但在其他节点上不需要设置group_replication_bootstrap_group=ON
,因为只有第一个节点需要引导集群。
配置MHA环境
重新那一台虚拟机,作为MHA主机,如果看到我这小节的route把他理解为MHA,因为当时名字忘改了
#在MHA中
[root@mysql-mha ~]# unzip MHA-7.zip
[root@mysql-mha MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm perl-Mail-Sender-0.8.23
1.el7.noarch.rpm
mha4mysql-manager-0.58.tar.gz
perl-Mail-Sendmail-0.79
21.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm
1.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm
perl-MIME-Lite-3.030
2.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm perl-Net-Telnet-3.03
19.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm
2.el7.noarch.rpm
[root@mysql-mha MHA-7]# yum install *.rpm -y
perl-MIME-Types-1.38
perl-Parallel-ForkManager-1.18
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.10:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.20:/mnt
[root@mysql-mha MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm
root@172.25.254.30:/mnt
#在sql-node中
[root@mysql-node10 ~]# yum install /mnt/mha4mysql-node-0.58
0.el7.centos.noarch.rpm -y
[root@mysql-node20 ~]# yum install /mnt/mha4mysql-node-0.58
0.el7.centos.noarch.rpm -y
[root@mysql-node30 ~]# yum install /mnt/mha4mysql-node-0.58
0.el7.centos.noarch.rpm -y
在软件中包含的工具包介绍
1.Manager工具包主要包括以下几个工具:
masterha_check_ssh #检查MHA的SSH配置状况
masterha_check_repl #检查MySQL复制状况
masterha_manger #启动MHA
masterha_check_status #检测当前MHA运行状态
masterha_master_monitor #检测master是否宕机
masterha_master_switch #控制故障转移(自动或者手动)
masterha_conf_host #添加或删除配置的server信息
2.Node工具包 (通常由masterHA主机直接调用,无需人为执行)
save_binary_logs #保存和复制master的二进制日志
apply_diff_relay_logs #识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog #去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs #清除中继日志(不会阻塞SQL线程)
剩余配置理论补充
配置MHA 的管理环境
因为我们当前只有一套主从,所以我们只需要写一个配置文件即可
rpm包中没有为我们准备配置文件的模板
可以解压源码包后在samples中找到配置文件的模板文件
2.检测配置:
a)检测网络及ssh免密
b)检测数据主从复制情况
MHA的故障切换
MHA添加VIP功能
设置秘钥认证
最后的ssh后面还有个id_rsa
Redis集群
概念
关系型数据库和 NoSQL 数据库
1.1 数据库主要分为两大类:关系型数据库与 NoSQL 数据库
关系型数据库,是建立在关系模型基础上的数据库,其借助于集合代数等数学概念和方法来处理数据库
中的数据主流的 MySQL、Oracle、MS SQL Server 和 DB2 都属于这类传统数据库。
NoSQL 数据库,全称为 Not Only SQL,意思就是适用关系型数据库的时候就使用关系型数据库,不适
用的时候也没有必要非使用关系型数据库不可,可以考虑使用更加合适的数据存储。主要分为临时性键
值存储(memcached、Redis)、永久性键值存储(ROMA、Redis)、面向文档的数据库
(MongoDB、CouchDB)、面向列的数据库(Cassandra、HBase),每种 NoSQL 都有其特有的使用
场景及优点。
1.2 为什么还要用 NoSQL 数据库呢?
主要是由于随着互联网发展,数据量越来越大,对性能要求越来越高,传统数据库存在着先天性的缺
陷,即单机(单库)性能瓶颈,并且扩展困难。这样既有单机单库瓶颈,却又扩展困难,自然无法满足
日益增长的海量数据存储及其性能要求,所以才会出现了各种不同的 NoSQL 产品,NoSQL 根本性的优
势在于在云计算时代,简单、易于大规模分布式扩展,并且读写性能非常高
1.3 RDBMS和NOSQL的特点及优缺点:
Redis特性
速度快: 10W QPS,基于内存,C语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
主从复制
支持高可用和分布式
Redis特性
速度快: 10W QPS,基于内存,C语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
主从复制
支持高可用和分布式
缓存的实现流程
Redis的安装
官方下载地址:
http://download.redis.io/releases/
一开始需要三台虚拟机即可
`
配置主从同步
哨兵:
TWO
哨兵节点是一个单独的进程,此功能并不是集成在主从复制当中的。哨兵机制就是通过哨兵节点来解决 Redis 主节点挂掉的问题的方法。哨兵节点不负责存储数据,主要是用来监控监控 Redis 主从服务器是否正常运行,并且在主节点挂掉后能够自动完成切换主节点,也就是故障转移工作。
故障解决:
-
edis-cli`:这是启动Redis命令行界面的命令,它允许用户与Redis服务器进行交互。
-
127.0.0.1:6379> CONFIG GET min-slaves-to-write
:这条命令用于获取当前Redis服务器的min-slaves-to-write
配置值。CONFIG GET
命令用于读取Redis配置参数的当前值。min-slaves-to-write
是一个配置项,它定义了主服务器必须至少有多少个健康的从服务器才能接受写入操作。如果少于这个数量的从服务器可用,主服务器将拒绝写入操作,以防止数据丢失。输出结果:
1) "min-slaves-to-write" 2) "0"
这表示当前
min-slaves-to-write
的值为0,即主服务器不要求有任何健康的从服务器就能接受写入操作。 -
127.0.0.1:6379> CONFIG SET min-slaves-to-write 2
:这条命令用于设置min-slaves-to-write
的新值为2。CONFIG SET
命令用于修改Redis配置参数的值。在这里,将min-slaves-to-write
设置为2意味着主服务器只有在至少有两个健康的从服务器时才会接受写入操作。输出结果:
OK
这表示配置设置成功。
-
127.0.0.1:6379> CONFIG GET min-slaves-to-write
:再次执行CONFIG GET
命令来验证min-slaves-to-write
的值是否已经被成功设置为2。输出结果:
1) "min-slaves-to-write" 2) "2"
这确认了
min-slaves-to-write
的值现在确实是2。
总结来说,这段命令的作用是先查询然后设置Redis服务器的min-slaves-to-write
配置参数,以控制主服务器在什么条件下可以接受写入操作。在这个例子中,设置为2意味着主服务器只有在至少有两个健康的从服务器时才允许写入操作,这样可以增加数据的冗余和安全性。
Redis Cluster(无中心化设计)
概念
Redis Cluster 工作原理
在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,
从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受
限于单机的内存大小、并发数量、网卡速率等因素。
redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存
当前节点数据和整个集群状态,每个节点都和其他所有节点连接
Redis Cluster特点如下
- 所有Redis节点使用(PING机制)互联
- 集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效
- 客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP
- redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redis
node上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担
16384/N个槽位 - Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使
用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点
上,从而有效解决单机瓶颈。
Redis cluster 架构
创建redis cluster的前提
1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。
2.每个节点必须开启的参数
cluster-enabled yes
#必须开启集群状态,开启后redis进程会有cluster显示
cluster-config-file nodes-6380.conf #此文件有redis cluster集群自动创建和维护,不需要任何手
动操作
3.所有redis服务器必须没有任何数据
4.先启动为单机redis且没有任何key value
环境配置
需要8台纯净的虚拟机,redhat9版本或者CentOS7版本
下面这些环境配置每一台都需要做
使用xshell,控制全局会话可以,在一台主机上面输入指令全部主机都生效
刚开始是6台
这里的密码一定要和上面配置文件里面的一致
配置之前先把防火墙和selinux关掉
检测
成功:
图上可只slave是228,看:
Performing Cluster Check (using node 172.25.253.224:6379)
M: 14e9553017d23ccbf754b18fad5177025650b1cf 172.25.253.224:6379
的号码去找: replicates开头的后面跟的id号码
查看集群信息
所有的Redis都需要进行密码验证
8台模式:
再加两台虚拟机
两台虚拟机关掉防火墙鹅selinux,下载Redis服务,将配置文件复制过去,
集群扩容
4096=How many slots do you want to move (from 1 to 16384)? 的16384/4(集群主服务器的数量)而得来
添加slave集群
检查成功,231成功成为230的从主机
拓展实验(clsuter集群维护)
添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相
反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如
果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。
代码
#移除要下线主机的哈希槽位
**[root@redis-master2 ~]# redis-cli -a 123456 --cluster reshard 172.25.254.20:6379**
Warning: Using a password with '-a' or '-u' option on the command line interface
may not be safe.
>>> Performing Cluster Check (using node 172.25.254.20:6379)
M: ba504e78f14df5944280f9035543277a0cf5976b 172.25.254.20:6379
slots:[6827-10922] (4096 slots) master
1 additional replica(s)
M: 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7 172.25.254.30:6379
slots:[12288-16383] (4096 slots) master
1 additional replica(s)
M: 009571cb206a89afa6658b60b2d403136056ac09 172.25.254.40:6379
slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
1 additional replica(s)
S: c20c9b5465b2e64868161c0e285d55bc81358ba4 172.25.254.110:6379
slots: (0 slots) slave
replicates 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7
S: d458f34fa900d83212c021dc1e65396e490b5495 172.25.254.120:6379
slots: (0 slots) slave
replicates 5ab2e93f4f0783983676f7bd118efaacfb202bd1
M: 5ab2e93f4f0783983676f7bd118efaacfb202bd1 172.25.254.10:6379
slots:[1365-5460] (4096 slots) master
1 additional replica(s)
S: 83d7a82fe896cf9f4d8212cb533058659bba16ce 172.25.254.130:6379
slots: (0 slots) slave
replicates ba504e78f14df5944280f9035543277a0cf5976b
S: 86a4a8fb08e70e41b5a30f829deb983d23854ea7 172.25.254.140:6379
slots: (0 slots) slave
replicates 009571cb206a89afa6658b60b2d403136056ac09
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 1fcaeb1dd936b46f4ea1efe4330c54195e66acf7
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: 5ab2e93f4f0783983676f7bd118efaacfb202bd1
Source node #2: done
#删除master
**[root@redis-master2 ~]# redis-cli -a 123456 --cluster del-node
172.25.254.120:6379 d458f34fa900d83212c021dc1e65396e490b5495** #这个172.25.254.120:6379后面跟的id是使用check查出来的
Warning: Using a password with '-a' or '-u' option on the command line interface
may not be safe.
>>> Removing node d458f34fa900d83212c021dc1e65396e490b5495 from cluster
172.25.254.120:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.
[root@redis-master2 ~]# redis-cli -a 123456 --cluster del-node
172.25.254.10:6379 5ab2e93f4f0783983676f7bd118efaacfb202bd1
Warning: Using a password with '-a' or '-u' option on the command line interface
may not be safe.
>>> Removing node 5ab2e93f4f0783983676f7bd118efaacfb202bd1 from cluster
172.25.254.10:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node
Redis理论补充
部署redis cluster
[root@redis-masterx ~]# vim /etc/redis/redis.conf
masterauth "123456"
#集群主从认证
requirepass "123456"
用“auth 密码”进行认证
cluster-enabled yes
#redis登陆密码 redis-cli 命令连接redis后要
#开启cluster集群功能
cluster-config-file nodes-6379.conf #指定集群配置文件
cluster-node-timeout 15000
[root@redis-master1 ~]# systemctl restart redis.service
[root@redis-master1 ~]# redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info
#节点加入集群的超时时间单位是ms
# Cluster
cluster_enabled:1