虚拟机下linux的安装与使用
1 虚拟机下linux的安装与使用
1.1 安装虚拟机
此处我们选用的虚拟机是:VirtualBox-6.1.18-142142-Win.exe
选择安装位置然后无脑下一步即可。
安装完成后桌面出现Oracle VM VirtualBox的图标点击进入虚拟机管理页面。可以通过管理菜单导入导出虚拟机的linux操作系统
注意:此文档导入的linux系统为xxx.ova文件
选择好系统文件后,进行虚拟电脑导入设置:
- 1.设置虚拟电脑位置
- 2.将MAC地址设定为:为所有网卡重新生成MAC地址
- 3.在虚拟系统中也可设置处理器、内存等,但是这些有初始默认设置,此处我们不进行修改。
设置完成后点击导入等待导入完成即可。
创建完成后需要进入设置1.调整对应的网卡,2.全部允许混杂模式,3.刷新mac地址,此时虚拟机管理器上已经显示有一个虚拟系统可以启动。
1.2 启动虚拟机的linux系统
点击选择管理软件中已经准备就绪的系统,右键选择或者通过菜单栏的启动按钮进行启动(此处相当于windows的开机)。
自动运行至等待登录界面显示:localhost login:
此时输入超级管理员root----->输入密码(linux命令行下输入密码,光标不移动且界面显示不变,需要自己记得输入的密码)------>登陆成功(展示last login:(上次登录的时间))----->进入命令行主界面[root@localhost ~]#
至此linux在虚拟机中已经成功启动,可以开始使用linux的指令。
1.3 Xshell与虚拟机链接
1.3.1 为什么要用Xshell工具
- 对于本地服务器来说,linux系统的命令行即可完成一系列操作。
- 当下流行的云服务器和服务器托管都是服务器实际并不在自己的公司,无法或者很难去面对服务器做一些操作,因此就需要一些远程软件来进行操作。(服务器机房一般要求温度、无尘、网速保证等,小公司一般不设置机房。)
1.3.2 Xshell的安装
此处我们选用的是破解好的绿色版压缩包Xshell_Plus_v6.0.0095.7z
解压后出现Xshell Plus文件夹,进入该文件夹双击: !绿化.bat文件,按照提示在命令行输入信息安装,安装完成后桌面出现:
-
Xshell图标(用于连接虚拟机linux系统),
-
Xftp图标(展示linux下的文件结构,可以直接按照windows的方式对其进行基本操作)
1.3.3 Xshell的使用
注意:在启动之前可以先关闭刚才启动的linux系统,然后通过管理页面无界面启动
-
双击Xshell打开
-
新建会话
-
设置项:
-
名称(链接的名字,随便写)
-
协议(SSH)
-
主机(虚拟系统的主机:linux命令行下可以输入ifconfig查询。)
-
端口号(本虚拟机默认22,有些默认80)
-
-
点击确定新建成功
-
输入用户名 输入密码 ,点击确认。(此处用户名密码为虚拟机系统的用户名密码)
-
登录完成进入主界面(可以进行linux命令操作)
2 linux
2.1 什么是Linux
-
一种免费,开源的操作系统
-
常作为服务器的操作系统使用
-
在目前市面上的服务器操作系统一般使用linux,极少数使用Windows Server(微软公司为服务器提供的应用操作系统,包含更加全面的权限管理系统以及防火墙机制).
2.2 常用发行版本
-
RedHat(红帽子)
-
CentOS
-
Ubuntu(有一套完整的界面解决方案,可以作为个人用户使用的操作系统)
2.3 常用命令
2.3.1 退出命令行
操作 | 效果 | 类型 |
---|---|---|
ctrl+c | 退出 | 组合键 |
2.3.2 查看IP
操作 | 效果 | 类型 |
---|---|---|
ifconfig | 查看当前电脑IP地址及网卡信息 | 命令 |
2.3.3 查看当前目录文件
操作 | 效果 | 类型 |
---|---|---|
ll | 显示当前目录下的文件以及文件信息 | 命令 |
ls | 显示当前目录文件名称 | 命令 |
cd 目录名 | 进入目录 | 命令 |
cd … | 回到上层目录 | 命令 |
pwd | 显示当前的目录的绝对路径 | 命令 |
cd / | 进入根目录 | 命令 |
通过↑/↓查看命令历史 | 查看命令历史 | ↑/↓按键 |
2.3.4 编辑文件
操作 | 效果 | 类型 |
---|---|---|
vim 文件名(带后缀) | vim : 编辑文件命令 | 命令 |
i | 进入编辑模式 | 按键 |
esc | 退出编辑状态,编辑状态下无法进行以下操作 | 按键 |
:q | 退出vim编辑器 | 命令 |
:q! | 强制退出vim,不保存修改内容 | 命令 |
:w | 保存但停留在vim界面 | 命令 |
:wq | 保存并退出文件 | |
/检索内容 | 检索 按n 下一个 | 命令+按键 |
快速按两下d | 删除整行 | 按键 |
注意:文件未保存而强制退出时,会存在临时文件,每次打开该文件会提示,需要将该临时文件删除方能彻底解决。
2.3.5 操作目录
操作 | 效果 | 类型 |
---|---|---|
mkdir 文件夹名称 | 创建目录 | 命令 |
mkdir -p 文件夹1/文件夹2/文件夹3 | 批量创建(层级创建) | 命令 |
rm [-r / -f / -rf ]文件/目录 | 删除目录/文件(-r表示目录 -f表示强制) | 命令 |
cp [-r] 源文件/源目录 目标文件/目标目录 | 拷贝目录/文件 | 命令 |
mv 源文件/源目录 目标文件/目标目录 | 移动目录/文件 | 命令 |
2.3.6 查找文件
操作 | 效果 | 类型 |
---|---|---|
grep 需要查找的字符串 文件名 | 查找文件内容 | 命令 |
n find / -name 文件名 | 查找文件 | 命令 |
2.3.7 压缩包及解压包
格式 | 操作 | 效果 | 类型 |
---|---|---|---|
.tar | tar xvf FileName.tar | 解包 | 命令 |
.tar | tar cvf FileName.tar DirName | 打包 | 命令 |
.gz | gzip -d FileName.gz | 解包 | 命令 |
.gz | gzip FileName | 打包 | 命令 |
.tar.gz | tar zxvf FileName.tar.gz | 解包 | 命令 |
.tar.gz | tar zcvf FileName.tar.gz DirName | 打包 | 命令 |
.zip | unzip FileName.zip | 解包 | 命令 |
.zip | zip FileName.zip FileName | 打包 | 命令 |
2.3.8 开放服务器端口
Linux默认只开放了80和22端口.其他端口需要用户自行授权开放
操作 | 效果 | 类型 |
---|---|---|
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT | 对外开放端口(临时) | 命令 |
firewall-cmd --permanent --zone=public --add-port=8080/tcp | 端口加入防火墙白名单(永久) | 命令 |
firewall-cmd --reload | 重启防火墙 | 命令 |
2.3.9 用户添加
操作 | 效果 | 类型 |
---|---|---|
useradd 用户账户名 | 添加用户 | 命令 |
passwd 用户账户名 | 修改用户密码 | 命令 |
su [用户名] | 切换用户(当用户名不填时,表示切换到系统用户root) | 命令 |
chmod u+w 指定的文件(/etc/sudoers) | 给用户添加权限(添加完权限之后,需要使用sudo 来执行命令) | 命令 |
2.3.10 查看进程
操作 | 效果 | 类型 |
---|---|---|
ps -ef|grep tomcat | 根据软件名字(此处为:tomcat)查看进程 | 命令 |
netstat -unltp|grep 8080 | 根据端口查看占用进程 | 命令 |
2.4 软件安装
2.4.1 安装JDK
使用ftp工具将jdk的rpm安装包上传至某一个目录中.
操作 | 效果 | 类型 |
---|---|---|
rpm -ivh jdk的rpm安装包 | 安装命令 | 命令 |
Java -version | 验证安装 | 命令 |
2.4.2 安装tomcat
操作 | 效果 | 类型 |
---|---|---|
tar zxvf apache-tomcat-7.0.82.tar.gz | 解压tomcat的压缩包 | 命令 |
mv apache-tomcat-7.0.82 /usr/local | 将解压缩的文件移动到/usr/local目录 | 命令 |
./startup.sh | 启动tomcat(在tomcat的bin目录下) | 命令 |
tail -f …/logs/catalina.out | 输出tomcat日志 | 命令 |
ps -ef|grep tomcat | 查看tomcat进程(可显示tomcat进程号) | 命令 |
kill -9 进程号 | 强制终止tomcat(进程号由上边命令查询) | 命令 |
/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT | 对外开放端口(临时) | 命令 |
firewall-cmd --permanent --zone=public --add-port=8080/tcp | 端口加入防火墙白名单(永久) | 命令 |
2.4.3 安装Nginx
1 介绍
-
Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:
-
作为 Web 服务器:相比 Apache,Nginx 使用更少的资源,支持更多的并发连接,体现更高的效率,这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应。
-
作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP,也可以支持作为 HTTP代理服务器 对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率很优秀。
-
作为邮件代理服务器: Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器)。
-
Nginx 安装非常的简单,配置文件 非常简洁(还能够支持perl语法),Bugs非常少的服务器: Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。
2 反向代理服务器/负载均衡服务器
-
使用ftp工具将nginx-1.10.2.tar.gz文件上传至虚拟机对的某一个目录中。
-
安装nginx相关的依赖
命令 | 作用 |
---|---|
yum -y install zlib zlib-devel openssl openssl-devel | 连接网络下载依赖 |
yum -y install patch | 连接网络下载依赖 |
- 解压Nginx压缩包
命令 |
---|
tar zxvf nginx-1.10.3.tar.gz |
- 配置nginx编译环境
操作 | 效果 | 类型 |
---|---|---|
./ configure | 配置nginx的编译环境 | 命令 |
–pid-path | nginx的进程文件存放目录 | 命令 |
–error-log-path | 错误日志存放目录 | 命令 |
–http-log-path | 请求日志存放目录 | 命令 |
module | Nginx中的功能,基本上都是以module的形式存在 | 命令 |
命令 |
- 给依赖预设值
命令(在解压后文件夹下运行如下命令) 注意:下面所有文字在一行 |
---|
./configure --prefix=/usr/local/nginx --pid-path=/usr/local/nginx/nginx.pid --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-stream --http-client-body-temp-path=/usr/local/nginx/tmp/client/ --http-proxy-temp-path=/usr/local/nginx/tmp/proxy/ |
- 编译安装
操作 | 效果 | 类型 |
---|---|---|
在nginx目录下,编译,执行 make | 编译 | 命令 |
再执行 make install | 安装 | 命令 |
- 验证Nginx是否安装成功
命令 |
---|
/usr/local/nginx/sbin/nginx -V |
- 配置nginx.conf
命令 |
---|
vim /usr/local/nginx/conf/nginx.conf |
- 在配置文件中加入标注为新加入的内容 ,实际工作中,不要忘记提前把域名和服务器IP绑定在一起。
user root;#root用户
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
#============================新增加的用于tomcat集群=================================
upstream javasm{
ip_hash; #根据ip分服务器防止雪崩,一个ip固定访问某个服务器
server 192.168.14.195:8080 weight=2;#weight表示权重越大权重越大,可替换为down
server 192.168.14.196:8080 weight=2;
server 192.168.14.197:8080 weight=2;
# server 192.168.14.230:8080;
# server 192.168.14.230:8081;
# server 192.168.14.230:8082;
}
#=====================================结束线========================================
server {
#处理跨域问题
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
listen 80;#nginx访问端口
server_name localhost;#nginx访问ip
#charset koi8-r;
#access_log logs/host.access.log main;
#静态资源路径方式1
location /img/{
root /home/data/;
}
#静态资源路径方式2
location /static/ {
alias /home/data/;
}
location / {
limit_req zone=javasmlimit burst=3 nodelay;
limit_conn perip 10;
limit_conn perserver 100;
limit_rate 1024k;
root html;
index index.html index.htm;
#处理跨域问题
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
#==========================新增加的用于tomcat集群========================
proxy_pass http://javasm;
#================================结束线=================================
}
}
- 校验nginx配置文件
命令 |
---|
/usr/local/nginx/sbin/nginx -t |
- 创建文件夹 /usr/local/nginx/tmp/client/
命令 |
---|
mkdir -p /usr/local/nginx/tmp/client/ |
- 启动nginx
命令 |
---|
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf |
- 如果无法访问,80端口加入防火墙白名单
命令 |
---|
firewall-cmd --permanent --zone=public --add-port=80/tcp |
- 重启nginx
命令 |
---|
/usr/local/nginx/sbin/nginx -s reload |
-
关闭
根据端口查找进程然后杀进程(与tomcat类似,但是用根据端口号查询)
操作 | 效果 | 类型 |
---|---|---|
netstat -unltp\grep 80 | 查询80端口对应的进程号 | 命令 |
kill -9 进程号 | 杀进程 | 命令 |
3 流量限制
为防止用户恶意访问,可以在nginx设置限流,防止发生雪崩效应。
3.1 根据ip控制速率
请求限制的功能来自于 ngx_http_limit_req_module 模块。使用它需要首先在 http 配置段中定义限制的参照标准和状态缓存区大小。
limit_req_zone 只能配置在 http 范围内;
$binary_remote_addr代表客户端ip
javasmlimit是自定义变量名
rate 请求频率,每秒允许多少请求;rate=3r/s; 每秒只处理3次请求,超过的请求拒绝处理。
10m缓冲区大小,1M能存储16000 IP地址,10M可以存储16W IP地址访问信息
在server {外 http模块加上如下内容,为方便测试,每秒处理1个请求
limit_req_zone $binary_remote_addr zone=javasmlimit:10m rate=1r/s;
在location / {内 location模块加上如下内容,表示当前请求会根据javasmlimit规则来限流,
#nodelay 不延迟处理
#burst 是配置超额处理,可简单理解为队列机制
# 上面配置同一个 IP 每秒只能发送一次请求(1r/s),这里配置了缓存3个请求,其它任务请求则失败(503错误)
limit_req zone=javasmlimit burst=3 nodelay;
3.2 控制并发连接数
http模块添加
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
location/ 模块添加
limit_conn perip 10;#单个客户端ip与服务器的连接数
limit_conn perserver 100; #限制与服务器的总连接数
# 限制传输速度(如果有N个并发连接,则是 N * limit_rate)
limit_rate 1024k;
流量限制不会提高服务器性能,但是能让服务器更加健壮。
测试过程中,我们看见系统默认的错误页面,正式上线还要修改错误页面的展示,我们可以修改/html/文件夹下的错误页面,给自己的nginx添加一个好看的错误页面。
需要配合静态文件服务器的功能。
4 静态资源服务器
- 修改nginx.conf
- 第一行
#添加 user root;
- 加入新的location
提前创建好文件夹,在文件夹中传入静态文件 mkdir -p /home/data
- 第一行
两种配置方式:
(1) root配置
location /img/ {
root /home/data/;
}
root是指定目录的上级目录,并且在指定的文件夹必须包含location指定名称的同名目录。
上面例子中,/home/data/目录下,必须有img文件夹才可以访问
请求路径:http://192.168.2.238/img/xxx.jpg
(2) alias配置
location /static/ {
alias /home/data/;
}
alias是指定目录的虚拟路径,location指定的名称是代替文件目录的访问路径
上面例子中,浏览器中输入static可以代替/home/data路径
请求路径:http://192.168.2.238/static/img/xxx.jpg
5 跨域配置
关于nginx的跨域可以配置在两个位置
5.1 允许全局的跨域
在server模块内,加入如下配置
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
5.2 允许指定路径跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods 'GET,POST';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
再有一种,在代码种加入跨域配置,这里以springboot项目为例
如果使用vue等前后端分离请求,会携带Cookie等信息,但是服务器不能信任全部域名的Cookie,如果想访问,可以从客户端和服务端两种解决方案,这里说明在服务器端的设置代码。
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
corsConfiguration.setAllowCredentials(true);//支持安全证书。跨域携带cookie需要配置这个
corsConfiguration.setMaxAge(3600L);//预检请求的有效期,单位为秒。设置maxage,可以避免每次都发出预检请求
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
6 SpringSession
1. HttpSession介绍
1.1 什么是HttpSession
第二阶段课程中,我们学习过HttpSession的相关知识,后续项目中,我们通常在Session中存储用户或菜单等信息,现在我们复习一下HttpSession的知识。
浏览器每次访问,服务器都会为每个用户创建一个独立的HttpSession对象
第一次访问服务器时,请求中没有携带任何标识,所以服务器会创建一个新的session对象,并且生成一个SessionID;
这个SessionID在响应浏览器的时候会被装进cookie中,从而被保存到浏览器中;
当用户再一次访问服务器时,请求中会携带着cookie中的SessionID去访问;
服务器会根据这个SessionID去查看是否有对应的Session对象;
有就拿出来使用,没有就创建一个Session。
服务器识别Session的标识是sessionid
1.2 Session共享
1.2.1 什么是Session共享
一个浏览器在访问多个web服务器时,多个服务器之间的session对象需要共享数据。
1.2.2 应用场景
在我们学过的Nginx反向代理模式中,用户通过方向代理服务器来访问真实服务器,如果使用随机或轮询策略,用户每次访问的服务器是不同的,那么我们无法获取用户存储在Session中的数据。
1.2.3 Session共享解决方案
l Session复制
通过对应用服务器的配置开启服务器的 Session 复制功能,在集群中的几台服务器之间同步 Session 对象,使得每台服务器上都保存所有的 Session 信息,这样任何一台宕机都不会导致 Session 的数据丢失,服务器使用 Session 时,直接从本地获取。这种方式的缺点也比较明显。因为 Session 需要时时同步,并且同步过程是有应用服务器来完成,由此对服务器的性能损耗也比较大。
l Session 绑定
利用 hash 算法,比如 nginx 的 ip_hash,使得同一个 Ip 的请求分发到同一台服务器上。 这种方式不符合对系统的高可用要求,因为一旦某台服务器宕机,那么该机器上的 Session 也就不复存在了,用户请求切换到其他机器后么有 Session,无法完成业务处理。
l 利用 Cookie 记录 Session
Session 记录在客户端,每次请求服务器的时候,将 Session 放在请求中发送给服务器, 服务器处理完请求后再将修改后的 Session 响应给客户端。这里的客户端就是 cookie。 利用 cookie 记录 Session 的也有缺点,比如受 cookie 大小的限制,能记录的信息有限, 安全性低,每次请求响应都需要传递 cookie,影响性能,如果用户关闭 cookie,访问就不正常。
l Session 服务器
Session 服务器可以解决上面的所有的问题,利用独立部署的 Session 服务器统一管理 Session,服务器每次读写 Session 时,都访问 Session 服务器。 对于 Session 服务器,我们可以使用 Redis 或者 MongoDB 等内存数据库来保存 Session 中的数据,以此替换掉服务中的 HttpSession。达到 Session 共享的效果。
1.3 测试无Session共享时的Session值
1.3.1 启动多个服务器
1.3.2 配置并启动Nginx,搭建服务器集群
1.3.3 设置Session并且尝试获取数据
2 SpringSession介绍
Spring Session 是Spring家族中的一个子项目,Spring Session提供了用于管理用户会话信息的API和实现。
它把servlet容器实现的httpSession替换为spring-session,专注于解决 session管理问题,Session信息存储在Redis中,可简单快速且无缝的集成到我们的应用中;
3 SpringBoot+SpringSession+Redis示例
Spring+SpringSession配置较为繁琐,我们以配置简单的SpringBoot为例。
3.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
3.2 修改配置文件
spring:
redis:
host: 127.0.0.1
password: javasm
port: 6379
timeout: 3000
session:
store-type: redis
3.3 测试
3.3.1 启动Redis
3.3.2 启动多个Tomcat服务器
发现此时已经可以达到Session共享
2.4.4 安装redis
1 redis的安装与基本测试
- 上传redis-3.2.9.tar.gz文件到opt文件夹
操作 | 效果 | 类型 |
---|---|---|
tar zxvf redis-3.2.9.tar.gz | 解压redis压缩包 | 命令 |
mv redis-3.2.9 /usr/local/ | 移动redis文件夹到指定位置 | 命令 |
cd /usr/local/redis-3.2.9/src | 1. 进入源码src目录 | 命令 |
make | 编译redis源码 | 命令 |
make test | 1. 测试编译结果 | 命令 |
vim redis.conf | 打开配置文件 | 命令 |
bind 绑定端口号注释 | 注释掉自带端口号 | 配置信息 |
requirepass 打开注释 修改密码 | 设置密码 | 配置信息 |
firewall-cmd --permanent --zone=public --add-port=6379/tcp | 开放端口号 | 命令 |
firewall-cmd --reload | 重启防火墙 | 命令 |
cd /usr/local/redis-3.2.9/src | 进入redis启动 命令目录 | 命令 |
./redis-server …/redis.conf & (&符号表示在后台执行) | 启动redis | 命令 |
./redis-cli -h 127.0.0.1 -p 6379 | 连接redis | 命令 |
auth javasm | s输入密码-javasm是密码 | 命令 |
输入指令exit退出 | 退出连接 | 命令 |
ps -ef|grep redis | 查询redis进程 | 命令 |
kill -9 进程号 | 杀进程停止redis服务 | 命令 |
2 redis集群
2.1 Linux环境如何搭建Redis集群
-
Redis主从复制简单介绍
作用
1.一个master可以有多个slave
2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构
3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。
4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余
5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。
6.可以用于读写分离和容灾恢复。
-
Redis主从复制的常用的几种方式
-
一主二仆 A(B、C) 一个Master两个Slave
-
薪火相传(去中心化)A - B - C ,B既是主节点(C的主节点),又是从节点(A的从节点)
-
反客为主(主节点down掉后,手动操作升级从节点为主节点) & 哨兵模式(主节点down掉后,自动升级从节点为主节点)
-
这里先配置一主二仆模式,薪火相传与一主二仆配置方式类似,之后再配置哨兵模式
Redis主从复制的搭建(一主二仆)
角色设计
需要搭建3个Redis环境
6379端口的Redis作为主(Master)
6380和6381端口的Redis作为仆从(Slave)
Redis主库搭建
参照上节文档,即6379的搭建与原来一样,不需要变化。
从库搭建
-
复制主库文件夹,修改名字
cp -r /usr/local/redis-3.2.9/redis.conf /usr/local/redis-3.2.9/redis.6380.conf
-
修改配置文件
以6380为例,进行修改
打开redis.config
vim /usr/local/redis-3.2.9_6380/redis.conf
-
端口进行修改
port 6380
-
主库配置
下面host为ip地址port为端口号 slaveof <host> <port>
-
主库密码
下面master-password为主库的密码 masterauth<master-password>
6380和6381加入防火墙白名单
操作 效果 类型 firewall-cmd --permanent --zone=public --add-port=6380/tcp 开放端口 命令 firewall-cmd --permanent --zone=public --add-port=6381/tcp 开放端口 命令 firewall-cmd --reload 重启防火墙 命令 -
启动
先启动主库,后启动从库,启动方式与之前一致
Linux启动
进入src文件夹,执行指令./redis-server …/redis.conf &
-
测试
-
进入主库客户端
输入指令 info replication
日志中可以看见,当前角色是master,两个从库分别是端口6380和6381
-
进入从库客户端
日志中可以看出,当前角色是slave,master的ip和port都已经显示出来
- conf文件中的配置,从库只能读取不能写
-
2.2Redis主从复制的原理
-
当设置好slave服务器后,slave会建立和master的连接,然后发送sync命令。
-
Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
-
全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。(第一次全量)
-
增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。(之后增量)
-
但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
Redis 主从同步有两种方式(或者所两个阶段):全同步和部分同步。
主从刚刚连接的时候,进行全同步;全同步结束后,进行部分同步。当然,如果有需要,Slave 在任何时候都可以发起全同步。Redis 策略是,无论如何,首先会尝试进行部分同步,如不成功,要求从机进行全同步,并启动 BGSAVE……BGSAVE 结束后,传输 RDB 文件;如果成功,允许从机进行部分同步,并传输积压空间(更新缓存)中的数据。
Redis主从复制(一主两从/一主多从)的分析
-
IO剧增
每次slave断开以后(无论是主动断开,还是网路故障)再连接master都要将master全部dump出来rdb,在aof,即同步的过程都要重新执行一遍;所以要记住多台slave不要一下都启动起来,否则master可能IO剧增(间隔1-2分)
-
复制延迟
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
-
可用性不高
当有主节点发生异常情况,就会导致不能写入,导致业务出错!
注意:
Redis 集群不保证数据的强一致性(strong consistency)Redis 集群的一致性保证(guarantee): 在特定条件下, Redis 集群可能会丢失已经被执行过的写命令。
2.4.5 安装mysql
作用 | 命令 |
---|---|
创建mysql文件夹 | ./mycat start |
解压mysql的压缩包(-C 表示解压到指定的目录) | tar xvf mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar -C mysql/ |
删除Mysql的MariaDB依赖 | rpm -qa|grep mariadb [查找mariadb] |
rpm -e mariadb包全名 --nodeps | |
依次安装mysql的rpm包(common,libs,client,server)安装1 | rpm -ivh mysql-community-common-5.7.20-1.el7.x86_64.rpm |
安装2 | rpm -ivh mysql-community-libs-5.7.20-1.el7.x86_64.rpm |
安装3 | rpm -ivh mysql-community-client-5.7.20-1.el7.x86_64.rpm |
安装4 | rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm |
启动mysql | service mysqld start |
查找初始密码 | vim /var/log/mysqld.log 或 grep password /var/log/mysqld.log |
连接mysql | mysql -u root -p |
修改密码 | ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘Javasm123!’; |
修改mysql访问权限:查看库 | show databases; |
进入mysql数据库 | use mysql; |
查看 库中有哪些表 | show tables; |
更改用户的访问权限 | update user set host=’%’ where user = ‘root’; |
刷新权限缓存 | flush privileges; |
3306加入白名单 | firewall-cmd --permanent --zone=public --add-port=3306/tcp |
重启防火墙 | firewall-cmd --reload |
2.4.6 安装Mycat
-
从定义和分类来看,它是一个开源的分布式数据库系统,是一个实现了 MySQL 协议的Server,前端用户可以把它看作是一个数据库代理,用 MySQL客户端和命令行访问,MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是读写分离,分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里。
-
Mycat是一个Java应用,所以安装环境需要依赖JDK.
-
Mycat是阿里巴巴开源的一个项目
效果 | 命令 |
---|---|
解压Mycat安装包 | tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz |
将文件夹移至/usr/local/ | mv mycat /usr/local/ |
进入mycat/conf目录 | vim server.xml 修改user相关信息(也可以使用默认信息) |
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property>
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墙设置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<!-- =====================以下内容为需要修改===================== -->
<user name="root"><!-- mycat用户名 -->
<property name="password">root</property><!-- mycat用户密码 -->
<property name="schemas">javasm</property><!-- mycat数据库名 -->
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">javasm</property>
<property name="readOnly">true</property>
</user>
<!-- 注意每个user都需要修改即使不使用 -->
<!-- =====================以上内容为需要修改===================== -->
</mycat:server>
schema.xml
- schema配置文件是用来描述逻辑数据库中的数据节点和读写库配置信息
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- name表示的是数据库名需要和上面service.xml的对应 -->
<schema name="javasm" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="supermarket110" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.14.196:3306" user="root"
password="Javasm123!">
<readHost host="hostS2" url="192.168.14.164:3306" user="root" password="Javasm123!" />
</writeHost>
</dataHost>
</mycat:schema>
- 测试Mycat
- bin目录下Mycat 运行命令
作用 | 命令 |
---|---|
启动 | ./mycat start |
停止 | ./mycat stop |
重新启动 | ./mycat restart |
查看Mycat运行日志 | tail –f mycat.log |
调整日志等级 | 修改log4j2.xml的日志等级为debug |
- 连接命令
作用 | |
---|---|
使用mysql命令登入Mycat | mysql -u root -p -P8066 -h 127.0.0.1 |
n mycat默认端口号为8066 | |
开放端口 | firewall-cmd --permanent --zone=public --add-port=8066/tcp |
重启防火墙 | firewall-cmd --reload |
- 常见错误
- Schema标签里的dataNote属性不要忘记
- 主从数据库中都要有配置的库
1 主从同步
1.1 设置主库mysql的配置文件
- 编辑/etc/my.cnf
操作 | 内容 |
---|---|
添加服务id配置 在/etc/my.cnf里面添加 | server-id=1 (保证唯一) |
开启二进制日志文件 在/etc/my.cnf里面添加 | log-bin=/var/lib/mysql/mysql-bin |
- sql操作
效果 | 命令 |
---|---|
重启mysql | service mysqld restart |
连接数据库 | mysql -u root -p [密码] |
执行sql查询信息 | show master status; |
注意:复制File和Position的值,需要给slave(从库)使用
1.2 设置从库mysql的配置文件
- 编辑/etc/my.cnf
操作 | 内容 |
---|---|
添加服务id配置 在/etc/my.cnf里面添加 | server-id=2(保证唯一) |
- sql操作
效果 | 命令 |
---|---|
重启mysql | service mysqld restart |
连接数据库 | mysql -u root -p [密码] |
执行sql关闭slave | stop slave; |
- 执行下边指令注意汉字部分需要替换,File和Position的值为配置主库时复制的信息
change master to master_host='主库IP',
master_port=3306, master_user='主库用户名',
master_password='主库密码',
master_log_file='主库刚刚查到的File值',
master_log_pos= Position值;
- 重新打开slave
效果 | 命令 |
---|---|
启动slave | start slave; |
查看slave状态 | show slave status\G; |
注意:上边查看重点是Slave_IO_Running=yes Slave_SQL_Running=yes和配置的主库信息是否正确。
2 系统切分及解决方案
-
数据切分:
简单来说,就是指通过某种特定的条件,按照某个维度,将我们存放在同一个数据库中的数据分散存放到多个数据库(主机)上面以达到分散单库(主机)负载的效果。
mycat来进行数据切分十分简单只需要修改xml格式配置文件即可。修改mycat安装路径下conf下的shema.xml文件。
2.1 垂直切分
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="javasm" checkSQLschema="false" sqlMaxLimit="100">
<!--menu_test表 会在dn1和dn2两个库中随机访问 -->
<table name="menu_test" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!--goods_test表 只访问dn1 -->
<table name="goods_test" primaryKey="ID" type="global" dataNode="dn1" />
</schema>
<!--database是必须真实存在的 库 上面配置的表 必须真实存在库里-->
<dataNode name="dn1" dataHost="localhost1" database="goods" />
<dataNode name="dn2" dataHost="localhost2" database="menu" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.173:3306" user="root"
password="Javasm123!">
</writeHost>
</dataHost>
<dataHost name="localhost2" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.174:3306" user="root"
password="Javasm123!">
</writeHost>
</dataHost>
</mycat:schema>
2.2 水平切分
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="javasm" checkSQLschema="false" sqlMaxLimit="100">
<table name="goods_test" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="goods-1" />
<dataNode name="dn2" dataHost="localhost1" database="goods-2" />
<dataNode name="dn3" dataHost="localhost1" database="goods-3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.12.173:3306" user="root"
password="Javasm123!">
<readHost host="hostS2" url="192.168.12.174:3306" user="root" password="Javasm123!" />
</writeHost>
</dataHost>
</mycat:schema>
2.4.7 安装solr
通过工具将solr压缩包放入linux下
1 安装流程
- 准备安装包
作用 | 命令 |
---|---|
解压solr压缩包 | tar zxvf solr-5.5.5.tgz |
创建Solr数据和安装目录 | mkdir -p /data/solr /usr/local/solr |
安装Solr(进入 solr-5.5.5/bin/ 目录) | ./install_solr_service.sh /opt/solr-5.5.5.tgz -d /data/solr -i /usr/local/solr/ |
-
Solr安装时,会自动创建一个solr用户,可以进入/etc/passwd中查看
如果未创建则执行如下命令手动创建
作用 | 命令 |
---|---|
创建用户组 | groupadd solr |
创建用户 | useradd -g solr solr |
给solr用户授权 | chown -R solr.solr /data/solr /usr/local/solr |
- 启动命令
作用 | 命令 |
---|---|
启动 | service solr start |
停止 | service solr stop |
重新启动 | service solr restart |
n 创建一个新的core(javasm) | su - solr -c “/usr/local/solr/solr/bin/solr create -c javasm -n data_driven_schema_configs” |
注意:core相当于一个文档集,存放着文档,文档字段类型配置,索引等等信息。
- 访问Solr管理界面
- http://localhost:8983/solr
2 SpringBoot中的使用
- 引入SpringBootStart
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
</dependency>
- 配置文件
spring:
data:
solr:
host: http://192.168.11.217:8983/solr
2.4.8 yum
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。
yum常用命令
作用 | 命令 |
---|---|
查找包 | yum search 指令名 |
安装包 | yum install 搜索出来的包名 |
卸载包 | yum remove 包名 |
默认yes安装 | yum -y install 包名 |