5.1linux整理

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 压缩包及解压包
格式操作效果类型
.tartar xvf FileName.tar解包命令
.tartar cvf FileName.tar DirName打包命令
.gzgzip -d FileName.gz解包命令
.gzgzip FileName打包命令
.tar.gztar zxvf FileName.tar.gz解包命令
.tar.gztar zcvf FileName.tar.gz DirName打包命令
.zipunzip FileName.zip解包命令
.zipzip 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-pathnginx的进程文件存放目录命令
–error-log-path错误日志存放目录命令
–http-log-path请求日志存放目录命令
moduleNginx中的功能,基本上都是以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/src1. 进入源码src目录命令
make编译redis源码命令
make test1. 测试编译结果命令
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 javasms输入密码-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)安装1rpm -ivh mysql-community-common-5.7.20-1.el7.x86_64.rpm
安装2rpm -ivh mysql-community-libs-5.7.20-1.el7.x86_64.rpm
安装3rpm -ivh mysql-community-client-5.7.20-1.el7.x86_64.rpm
安装4rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm
启动mysqlservice mysqld start
查找初始密码vim /var/log/mysqld.log 或 grep password /var/log/mysqld.log
连接mysqlmysql -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命令登入Mycatmysql -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操作
效果命令
重启mysqlservice 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操作
效果命令
重启mysqlservice mysqld restart
连接数据库mysql -u root -p [密码]
执行sql关闭slavestop 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
效果命令
启动slavestart 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 包名
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值