虚拟机下linux的安装与使用

  • 1 虚拟机下linux的安装与使用
    • 1.1 安装虚拟机
    • 1.2 启动虚拟机的linux系统
    • 1.3 Xshell与虚拟机链接
      • 1.3.1 为什么要用Xshell工具
      • 1.3.2 Xshell的安装
      • 1.3.3 Xshell的使用
  • 2 linux
    • 2.1 什么是Linux
    • 2.2 常用发行版本
    • 2.3 常用命令
      • 2.3.1 退出命令行
      • 2.3.2 查看IP
      • 2.3.3 查看当前目录文件
      • 2.3.4 编辑文件
      • 2.3.5 操作目录
      • 2.3.6 查找文件
      • 2.3.7 压缩包及解压包
      • 2.3.8 开放服务器端口
      • 2.3.9 用户添加
      • 2.3.10 查看进程
    • 2.4 软件安装
      • 2.4.1 安装JDK
      • 2.4.2 安装tomcat
      • 2.4.3 安装Nginx
        • 1 介绍
        • 2 反向代理服务器/负载均衡服务器
        • 3 流量限制
          • 3.1 根据ip控制速率
          • 3.2 控制并发连接数
        • 4 静态资源服务器
        • 5 跨域配置
          • 5.1 允许全局的跨域
          • 5.2 允许指定路径跨域
        • 6 SpringSession
          • 1. HttpSession介绍
          • 2 SpringSession介绍
          • 3 SpringBoot+SpringSession+Redis示例
      • 2.4.4 安装redis
        • 1 redis的安装与基本测试
        • 2 redis集群
          • 2.1 Linux环境如何搭建Redis集群
          • 2.2Redis主从复制的原理
      • 2.4.5 安装mysql
      • 2.4.6 安装Mycat
        • 1 主从同步
          • 1.1 设置主库mysql的配置文件
          • 1.2 设置从库mysql的配置文件
        • 2 系统切分及解决方案
          • 2.1 垂直切分
          • 2.2 水平切分
      • 2.4.7 安装solr
        • 1 安装流程
        • 2 SpringBoot中的使用
      • 2.4.8 yum
        • yum常用命令

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表示权重越大权重越大,可替换为downserver 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;#静态资源路径方式1location /img/{root   /home/data/;}#静态资源路径方式2location /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.1password: javasmport: 6379timeout: 3000session:
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主从复制的常用的几种方式

    1. 一主二仆 A(B、C) 一个Master两个Slave

    2. 薪火相传(去中心化)A - B - C ,B既是主节点(C的主节点),又是从节点(A的从节点)

    3. 反客为主(主节点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 包名

5.1linux整理相关推荐

  1. 整理Linux查看系统日志的一些经常使用命令

    整理Linux查看系统日志的一些经常使用命令 last -a 把从何处登入系统的主机名称或ip地址,显示在最后一行. -d 指定记录文件.指定记录文件.将IP地址转换成主机名称. -f <记录文 ...

  2. nacos-server1.4.1linux和windows版本下载

    nacos-server1.4.1linux和windows版本下载 nacos-server1.4.1下载地址 nacos-server1.4.1下载地址 针对nacos下载很慢,特意整理下2021 ...

  3. Map再整理,从底层源码探究HashMap

    前言 本文为对Map集合的再一次整理.内容包括:Map HashMap LinkedHashMap TreeHashMap HashTable ConcurrentHashMap Map Map< ...

  4. List再整理,从代码底层全面解析List(看完后保证收获满满)

    前言 本文为对List集合的再一次整理,从父集接口Collection到顶级接口Iterable再到线程不安全实现类:ArrayList.LinkedList,再到线程安全实现类:Vector(被弃用 ...

  5. LeetCode简单题之整理字符串

    题目 给你一个由大小写英文字母组成的字符串 s . 一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件: 若 s ...

  6. TVM/Relay 的 PartitionGraph()(mod) 函数讨论整理

    TVM/Relay 的 PartitionGraph()(mod) 函数讨论整理 TVM/Relay 的图形分区功能.以下简单示例,错误信息. PartitionGraph() 函数指定图形是用带有 ...

  7. AIFramework基本概念整理

    AIFramework基本概念整理 本文介绍: • 对天元 MegEngine 框架中的 Tensor, Operator, GradManager 等基本概念有一定的了解: • 对深度学习中的前向传 ...

  8. Python库全部整理出来了,非常全面

    库名称简介 Chardet 字符编码探测器,可以自动检测文本.网页.xml的编码. colorama 主要用来给文本添加各种颜色,并且非常简单易用. Prettytable 主要用于在终端或浏览器端构 ...

  9. iOS面试题整理---关键字!!!

    关键字整理 static 1.static全局变量与普通的全局变量有什么区别? 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量.全局变量本身就是静态存储方式, 静态全局变量当 ...

最新文章

  1. 吴恩达机器学习笔记 —— 3 线性回归回顾
  2. qt qml scrollbar 移动APP风格的滚动轴
  3. Javadoc注释规范
  4. elasticsearch最大节点数_ElasticSearch这些概念要明白
  5. 简述php三元运算符的使用,PHP 三元运算符的使用
  6. Linux下samba服务的错误处理
  7. SQL Server:统计数据库中每张表的大小
  8. windows程序消息机制(Winform界面更新有关)
  9. 面试官问:HTTP 的负载均衡你了解么?你不是说了你们用的Nginx么?说一下把。...
  10. 从拉萨骑行到珠峰大本营
  11. preHandle、postHandle与afterCompletion
  12. 5分钟正则表达式,了解一下!
  13. 文档02_JavaScript
  14. android 内嵌web,Android《内嵌浏览器-WebView》
  15. Java实现简单的QQ登录界面
  16. 【ios】为什么要在Other Linker Flags添加Flag (eg:-ObjC、-lc++等)?
  17. Github(Life Restart作者)新作:生火间 网址
  18. STM32调试过程 常见错误及解决方案
  19. hbuilderx安装教程_HBuilderX初级安装使用教程
  20. 第五章.系统安全分析与设计

热门文章

  1. java actioncontext_Action访问ActionContext | 学步园
  2. chrome android 2.3,【安卓2.3谷歌框架单刷包】安卓2.3谷歌GMS服务框架
  3. 企业大数据CDH管理平台搭建方案
  4. python|tkinter实现颜色选择器
  5. Object.prototype
  6. Android不同Module之间Activity跳转(以腾讯IMDemo为例)
  7. Apache 301重定向中RewriteCond规则参数介绍(转)
  8. 基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作
  9. 传马化腾过问“露露事件”启动反腐 腾讯暂无回应
  10. 中海达2020年半年报出炉,要点全在这!