NoSQL_Nginx

Redis安装与简介

参考:https://www.jianshu.com/p/c4bba1df95c5
数据操作(哈希,列表,集合等)

Mongodb

简介:
-----MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库。数据以二进制JSON(javascript Object Notation)格式存储在BSON文件中。它是属于NoSQL的一种。
---NoSQL(not only SQL)泛指非关系性数据库。NoSQL用于超大规模数据的存储。
-----这些类型的数据库存储不需要固定的格式,无需多余操作就可以横向扩展。没有声明性查询语言,非结构化和不可预知的数据。多种存储方式,键值对,列存储,文档存储,图形数据库。最终一致性,而非ACID属性。CAP定理,CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(consistency),可用性,分区容错性。这三个要素最多只能同时实现两点,不可能三者都有。高性能,高可用性和伸缩性。
----mongoDB的主要特点
1.面向文档。数据格式更灵活,易于使用和扩展。
2.分布式数据库,易于横向扩展,能够应对大规模数据
3.功能丰富,支持索引,聚合,文件存储,地理位置存储
4.性能桌越,能对文档进行动态填充,也能预分配数据以利用额外的空间获取稳定的性能。

安装mongoDB

  1. windows下安装
    11.安装版4.0.XX版对win7有用。


    image.png

https://www.mongodb.com/try/download/community---https://www.mongodb.com/download-center/community/releases/archive,下载了免安装版,并且是3.4.7版,因为最新版本,要求安装系统为win10.
解压后,在根目录下建两个文件夹,data, logs
首先:进入bin目录,打开comd输入:*

mongod.exe --dbpath C:\mongodb-win32-x86_64-windows-3.4.7\data --logpath C:\mongodb-win32-x86_64-3.4.7\logs\mongodb.log

启动成功后data目录下会自动生成MongoDB数据库的一些信息,logs目录下存的则是日志文件,文件内容是启动信息

  1. liunx下安装Mongodb
    -----本人虚拟机安装了ubuntu18.x.lts,centos 7
    ubuntu方式一:通过apt安装
    <1>添加签名到APT.
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc |sudo apt-key add -

<2>创建list文件并写入命令

echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

当我的Ubuntu install某个东西时,给出下面提示

E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarly unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is an other process using it?

删除锁定文件,行了

sudo rm /var/lib/dpkg/lock-frontend       
sudo rm /var/lib/dpkg/lock

<3>更新软件源列表

sudo apt-get update

<4>安装mongodb,默认安装稳定版本

sudo apt-get install -y mongodb-org

<5>启动,停止,重启,状态查看。

sudo service mongod start/stop/restart/status

<6>验证服务是否启动成功(启动mongodb shell)

mongo
>db         //显示处在什么库中
test
>show dbs   //查看当前有什么系统数据库

----Centos7中安装

《1》。下载


image.png
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.28.tgz

《2》。解压,并反解压的根目录重命名,以便操作

tar -zxvf mongodb-linux-x86_64-rhel70-4.0.28.tgz 
mv mongodb-linux-x86_64-rhel70-4.0.28 mongodb

《3》。在解压的并重命的根目录下,建两个文件夹

[root@localhost mongodb]cd mongodb
[root@localhost mongodb]mkdir db
[root@localhost mongodb]# mkdir logs
[root@localhost mongodb]# cd bin

《4》。进入bin目录中,建一个mongo.conf文件,且编辑,写上如下内容

touch mongo.conf
vi mongo.conf
-------------------------------------------------------------------------------------------------------------------
dbpath=/root/mongodb/db
logpath=/root/mongodb/logs/mongodb.log
port=27017
fork=true

fork=true表示以守护线程的方式启动mongodb,即允许在后台运行
《5》。启动和关闭mongodb
启动

cd bin
./mongod -f mongo.conf --bind_ip_all
./mongo
db.version()   //可查看版本号

关闭

use admin;
db.shutdownServer();
exit

-----默认情况下,启动后连接的是test库,而关闭的命令要在admin库中执行,因此半闭它需要首先切抽换到admin库,然后执行关闭命令。
《6》。安全管理
**---默认情况下,启动的mongodb没有登录密码,在生产环境中这是不允许的,mongodb中每个库都有独立的密码,在哪一个库中创建用户就要在哪个库中验证密码。要配置密码,首先要创建一个用户,例如在amdin库中创建一个用户代码如下:它的功能是,sang对test库有读写权限。用户创成功后,要重启服务。

use admin;
db.createUser({user:"sang",pwd:"123",roles:{[role:"readWrite",db:"test"}]})
./mongod -f mongo.conf --bind_ip_all

《7》。验证用户是否成功,返回1表示成功。

./mongo
db.auth("sang","123")

《8》。如果远程方问不了,极大可能是系统中的防火墙没有关闭。我们要关闭之。

systemctl stop firewalld.service
systemctl disable firewalld.service //重统重启自动关闭防火墙

ubuntu方式二,curl命令下载,解压.这个安装现在还处于失败中

<1>下载,没有curl命令,则要sudo apt-get install -y curl安装之。

sudo curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.0.tgz  
//下载

<2>解压缩

tar zxvf mongodb-linux-x86_64-ubuntu1804-4.2.0.tgz 

<3>把解压的文件移动到/usr/local/下,再移动一下改名,不移它处。

sudo mv  mongodb-linux-x86_64-ubuntu1804-4.2.0 /usr/local/
cd /usr/local
sudo mv mongodb-linux-x86_64-ubuntu1804-4.2.0 mongodb

<4>bin目录加到环境变量中。以便任何地方都可用到它里面的命令。

export PATH=/usr/local/mongodb/bin:PATH

<5>创建/data/db数据目录,并赋读写权限,再启动mongodb服务

rootx@ubuntu:~$ sudo mkdir -p /data/db
[sudo] password for rootx: xiong
rootx@ubuntu:~$ sudo chmod 755 /data/*
rootx@ubuntu:~$ sudo mongod

<6>验证是事启动成功,再打开一个终端,输入

rootx@ubuntu:~$ mongo
eMonitoring()
---

> db
test
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

redis集群

-----首先上面的4.0版的redis配置集群要安装rvm工具,现在centos中,rvm版本过底,要下载高版本(2.3以上)需要翻qiang。但5.0版本的redis可以直接用redis-cli(客户端工)创建。
部署主要步骤:

  1. 部署单机版redis
    首先:下载redis.5.0x版本,复制链地址到CENTOS 8终端上,再解压,复制到/usr/local,并用mv重命名解压的根目录以便好用,进入根目录,输入make,make install。
    image.png
wget https://download.redis.io/releases/redis-5.0.14.tar.gz
tax -zxvf redis-5.0.14.tar.gz
//安装所需tcl rpm包
rpm -qa|grep tcl                      //查看安装否tcl,如果有,不用,我这里有,如果没有则
rpm -ivh tcl-8.5.13-4.el7.x86_64.rpm  --nodeps --force
mv redis-5.0.14  /usr/local/
cd /usr/local
mv redis-5.0.14 redis
yum -y install gcc gcc-c++
make 
make install

然后:配置mogod.conf

daemonizeyes             
#bind 127.0.0.1
requirepass 123@456
protected-mode no
-----------------------------------------------------------------------------------------------------------------------------------------------
第1行配置表示允许Redis在后台运行
第2行配配置表示允许连接该Redis实例的地址,默认情况下只允许本地连接,将默认地址注释掉,外网就可以访问它了。
第3行配置表示登录该Redis的所需的密码
第4行配置,表示由于有第3行的密码登录,就可以不用保护了。

再后:关闭防火啬,进入bin目录下,启动服务和客户端,关闭服务

systemctl stop firewalld.service
systemctl disable firewalld.service
cd /usr/local/redis/bin
redis-server redis.conf                  //启动redis服务
redis-cli -a 123@456                    //客户端连接
redis-cli -p 6379 -a 123@456 shutdown   //关闭服务
  1. 将已部署好的单机版redis复制多个副本(6个)
    首先: 创建集群文件夹redis-cluster,并复制已创建的redis 6个副本.执行如下命令创建6个节点所需部署路径文件夹及数据文件夹,及启动文件目录(bin)
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6371/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6372/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6373/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6374/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6375/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/6376/data/
[root@centos01 redis-cluster]# mkdir -p /usr/local/redis-cluster/bin/

*然后:进入源码编译目录/usr/local/redis/src/ 将脚本mkreleasehdr.sh ...等复制到集群bin目录/usr/local/redis-cluster/bin下,也可以直接将整个src目录复制到bin目录

cp /usr/local/redis/src/mkreleasehdr.sh redis-benchmark redis-check-aof  redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin/
cp /usr/local/redis/src/* /usr/local/redis-cluster/bin/

再后:执行如下语句分别将已安装成功的redis复制到6个节点文件夹

[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6371/
[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6372/
[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6373/
[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6374/
[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6375/
[root@centos01 redis-cluster]# cp -r /usr/local/redis-5.0.13/* /usr/local/redis-cluster/6376/

再然后: 修改每一个节点下redis.conf配置文件。如下所示,6371是当前节点的端口号,请根据节点进行更改,再验证各节点---启动各节点服务。进入任意节点下的src目录 登陆如下表示正常

port 6371   #端口
pidfile /var/run/redis_6371.pid   
dir /usr/local/redis-cluster/6371/data/ #数据存放目录
cluster-config-file nodes-6371.conf   #节点信息
#bind 127.0.0.1  # ip限制   不限制就注释掉
daemonize yes     #后台启动模式
requirepass 123@456   #redis登陆密码,不要密码请注释
appendonly yes
appendfsync always
cluster-enabled yes   开启集群
-------------------------------------------------验证各节点的成功启动否--------------
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6371/redis.conf 
 /usr/local/redis-cluster/bin/redis-server /usr/local/redis- /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6373/redis.conf 
 /usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6374/redis.conf 
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6375/redis.conf 
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6376/redis.conf
-------------------------------------------------------任意节点src下-------------------
./redis-cli -p 6371 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6371>
————————————————
版权声明:本文为CSDN博主「夜灬狼丶」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010976445/article/details/119331006
---------------------------------------------停止对应端口号的服务--------------------

redis-cli -p 6371 -a 123@456 shutdown
  1. 创建集群
    ----redis5.0之前的版本创建集群使用redis-trib.rb命令,5.0之后的版本直接使用redis-cli命令,也不用ruby命令
# /usr/local/redis-cluster/bin/redis-cli --cluster create  192.168.19.128:6371 192.168.19.128:6372 192.168.19.128:6373 192.168.19.128:6374 192.168.19.128:6375 192.168.19.128:6376 --cluster-replicas 1 -a 123@456
//--cluster-replicas 1  :表示主从复制比例为 1:1,即一个主节点对应一个从节点,我们有6个节点,即默认前3个为主,后3个为从
//执行后会有提示需要输入”yes“,   之后打印如下信息标识创建完成
  1. 集群验证
    ----集群规划(测试环境ip192.168.19.128,一台部署6个节点,正式环境和测试环境一样的部署方式,无非把节点分配到其他服务器)
    image.png

    首先:任意节点创建key 任意节点登陆redi创建一个名字为name的key,并设置值为text
/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.19.128 -p 6371 -a 123@456
192.168.19.128:6371> set name text
-> Redirected to slot [5798] located at 192.168.19.128:6372
OK
192.168.19.128:6372>

然后:登陆其他节点(非4.1中登陆的节点),查看数据,可以看见如下图所示,登陆节点5(6375)能正常查看到4.1步骤在节点1(6371)创建的名为name值为text的key,至此标识集群创建成功。

# /usr/local/redis-cluster/bin/redis-cli -c -h 192.168.19.128 -p 6375 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.19.128:6375> get name
-> Redirected to slot [5798] located at 192.168.19.128:6372
"text"

redis集群补充优化上面的做法

-------不用复制所有根目录文件到节点根目录中,只需redis.conf文件。
首先下载redis-6.2.10.tar.gz,再wincrp上传到Centos 7上。
如果提示无gcc,首先需要安装gcc
查看gcc版本,Centos版本默认安装的是4.8.5版本的gcc,版本过低,升级完成后查看gcc版本

gcc -v
yum install -y centos-release-scl
yum install -y devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
yum install -y systemd-devel
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
source /etc/profile

解压安装tar -zxvf redis,下面进行Redis的编译安装, 因Redis版本原因需要安装或者更新tcl版本大于8.5

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
tar -xzvf tcl8.6.1-src.tar.gz -C /usr/local/
cd /usr/local/tcl8.6.1/unix/
./configure
make
make install

下面进入redis目录执行编译redis need systemd-devel

cd /usr/local/redis-6.2.10/src/
make BUILD_WITH_SYSTEMD=yes USE_SYSTEMD=yes
make install

安装完成后查看redis版本,如果只启动6379端口号的主服务器,则需redis-server ../redis-6.2.10/redis.conf.配置文件见上面的描述

redis-cli --version
redis-server --version
cd /usr/local
redis-server ../redis-6.2.10/redis.conf

集群创建
1.创建六个节点(cd /usr/local/redis-cluster)

[root@xsw redis-cluster]# mkdir -p 6371/data
[root@xsw redis-cluster]# mkdir -p 6372/data
[root@xsw redis-cluster]# mkdir -p 6373/data
[root@xsw redis-cluster]# mkdir -p 6374/data
[root@xsw redis-cluster]# mkdir -p 6375/data
[root@xsw redis-cluster]# mkdir -p 6376/data
[root@xsw redis-cluster]# mkdir -p bin

2.把安装redis后产生的bin(6.x版本中是src)目录拷贝放到 /usr/local/redis-cluster/bin下

cd /usr/local/redis-6.2.10
cp src/* /usr/local/redis-cluster/bin/

3.在各节点之中建redis.conf文件,下面是示例。

bind 0.0.0.0
protected-mode no
port 6373
daemonize yes
pidfile /var/run/redis_6373.pid
logfile /usr/local/redis-cluster/6373/redis_6373.log
dbfilename dump_6373.rdb
dir /usr/local/redis-cluster/6373/
masterauth 123456
requirepass 123456
cluster-enabled yes
cluster-config-file nodes-6373.conf

4.编写启动脚本(随便在什么地方建,但运行时,要到这儿来。本人放在redis-cluster目录下,执行后,会启动六个节点。

vi start.sh
---------------------------------------------------------------------------------------------------
#!/bin/bash
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6371/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6372/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6373/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6374/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6375/redis.conf
/usr/local/redis-cluster/bin/redis-server /usr/local/redis-cluster/6376/redis.conf
---------------------------------------------运行sh文件----------------------------------
bash start.sh

5.查看进行

ps -ef | grep redis
7fa77e6858016d91882132a0806d2969_20210212163107897.png

6.创建集群

redis-cli -a 123456 --cluster create 10.170.11.61:6371 10.170.11.61:6372 10.170.11.61:6373 10.170.11.61:6374 10.170.11.61:6375 10.170.11.61:6376 --cluster-replicas 1
  1. 测试成功否
    -----分别登录6371,6376
redis-cli -c -p 6371 -a 123456
>set name xiong
redis-cli -c -p 6376 -a 123456
get name

8.删除集群节点
-------redis集群里的节点支持动态删除,但是一般情况下不会这么做,只有在节点软硬件升级的时候才会主动让节点下线。删除节点的方式就是redis-cli客户端连接到服务器,然后执行cluster forget node-id就可以了,如果是删除一个从节点的话,集群仍然是可用状态,如果是删除一个主节点的话,集群的槽位不足,就会变成不可用状态。
首先:查看节点信息,再停止所有节点服务
stop.sh

#!/bin/bash
/usr/local/redis-cluster/bin/redis-cli -c -p 6371 -a 123@456 shutdown
/usr/local/redis-cluster/bin/redis-cli -c -p 6372 -a 123@456 shutdown
/usr/local/redis-cluster/bin/redis-cli -c -p 6373 -a 123@456 shutdown
/usr/local/redis-cluster/bin/redis-cli -c -p 6374 -a 123@456 shutdown
/usr/local/redis-cluster/bin/redis-cli -c -p 6375 -a 123@456 shutdown
/usr/local/redis-cluster/bin/redis-cli -c -p 6376 -a 123@456 shutdown
127.0.0.1:7000> cluster info
127.0.0.1:7000> cluster nodes
--------------------------------------------------------------------------------------------------
930daea84150b5fabd32a95592781b27ceab1b71 192.168.39.153:7001 master - 0 1479044139420 2 connected 5461-10922
8a6707d5b9269b6260315b47f300c1ab599733b7 192.168.39.153:7005 slave bdb62bb6ffce71588961f513c74b0d5a1a7145ea 0 1479044141441 6 connected
bdb62bb6ffce71588961f513c74b0d5a1a7145ea 192.168.39.153:7002 master - 0 1479044139925 3 connected 10923-16383
81c884ebfc919ad293f02d797aff1033025ac27e 192.168.39.153:7004 slave 930daea84150b5fabd32a95592781b27ceab1b71 0 1479044140937 2 connected
099cfc6fbb785449a8bf5369a53d21a9e127fa42 192.168.39.153:7000 myself,slave a8081e97862d9cf76c72d364f9a173187376f215 0 0 1 connected
a8081e97862d9cf76c72d364f9a173187376f215 192.168.39.153:7003 master - 0 1479044140430 7 connected 0-5460

然后:我们删除从节点192.168.39.153:7004
------我们看看redis源代码,看看forget删除节点是怎么实现的,在redis/cluster.c文件里,客户端传入的forget参数会进

127.0.0.1:7000> cluster forget 81c884ebfc919ad293f02d797aff1033025ac27e

9.重新搭建集群
首先:关闭所有节点
----使用kill命令杀掉相应的进程即可。

ps -ef | grep redis
kill -i pid

云服务器redis集群问题

https://www.jianshu.com/p/9d6a55a42a8b
主要是 公网不能访问到私网中的redis数据。
-----连接客户端我们用的是Lettuce,这里发现指定的公网ip竟然变成私网ip了,客户端获取的IP地址信息是从Redis集群获取的,所以我们得让集群返回给我们公网ip。
-----手动指定了公网ip后,Redis集群中的节点会通过公网IP进行通信,也就是外网访问。因此相关的总线端口(+10000),如下面的16371-16376等总线端口必须在云服务器中的安全组中放开,不然集群会处于fail状态。

image.png

  1. 修改配置文件
# 配置文件进行了精简,完整配置可自行和官方提供的完整conf文件进行对照。端口号自行对应修改
#后台启动的意思
daemonize yes 
#端口号
port 6371
# IP绑定,redis不建议对公网开放,这里绑定了服务器私网IP及环回地址
bind 172.17.0.13 127.0.0.1
# redis数据文件存放的目录
dir /redis/workingDir
# 日志文件
logfile "/redis/logs/cluster-node-6381.log"
# 开启AOF
appendonly yes
 # 开启集群
cluster-enabled yes
# 集群持久化配置文件,内容包含其它节点的状态,持久化变量等,会自动生成在上面配置的dir目录下
cluster-config-file cluster-node-6381.conf
# 集群节点不可用的最大时间(毫秒),如果主节点在指定时间内不可达,那么会进行故障转移
cluster-node-timeout 5000

# 云服务器上部署需指定公网ip
cluster-announce-ip 122.51.151.130
# Redis总线端口,用于与其它节点通信
cluster-announce-bus-port 16381
----------------------------------------------------------------实测成功的配置--------------------------------------
protected-mode no
bind 0.0.0.0 10.170.11.61      #(10.170.11.61青云云主机内网IP--2023.3--2023.6)
port 6371
daemonize yes
pidfile /usr/local/redis-cluster/6371/redis.pid
logfile "/usr/local/redis-cluster/6371/redis.log"
dbfilename dump6371.rdb
dir /usr/local/redis-cluster/6371/data
appendonly yes
appendfilename "appendonly_6371.aof"
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/6371/nodes.conf
cluster-node-timeout 15000
cluster-replica-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage no
requirepass 123456
  1. 重新启动Redis服务并创建集群,节点ip要用公网ip,不是内网IP
redis-cli --cluster  create 139.198.11.194:6371 139.198.11.194:6372
 139.198.11.194:6373 139.198.11.194:6374 139.198.11.194:6375 
139.198.11.194:6376 --cluster-replicas 1 -a 123456

Centos7 jdk安装

  1. 确定系统上是否安装jdk
#1.检查当前机器是否有自带的JDK
rpm -qa |grep java
rpm -qa |grep jdk
rpm -qa |grep gcj
#2.如果没有 则跳至安装步骤,有的话 进行卸载
rpm -qa | grep java | xargs rpm -e --nodeps
#3.检测卸载是否成功
java -version
#出现一下提示则说明没有安装JDK或者已经卸载成功
-bash: java: command not found

  1. 安装
    1.下载提示:将下载好的压缩包通过FTP工具上传到服务器的/usr/local/java目录中,上传的过程就不描述了,有很多种上传方式的,例如使用ftp工具、Xshell的文件上传工具、cmd命令下使用SCP命令上传、宝塔面板上使用上传文件功能、WinSCP工具等等,这里选tar.gz.
    Oracle官网下载:Java Downloads | Oracle
    image.png

    2.解压
tar -zxvf jdk-8u333-linux-x64.tar.gz

3.编辑配置文件,加bin到环境变量中

vim /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_333
export JRE_HOME=$JAVA_HOME/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JRE_HOME/lib
#按esc退出按wq!保存退出
#刷新配置
source /etc/profile

Redis应用之Session共享

----正常情况下,Httpsession是通过Servlet容器创建并管理的,创建成功之后都是保存在内存中,如果开发者需要对项目进行横向扩展搭建集群,那么可以利用一些硬件或者软件工具来做负载均衡,此时,来自同一用户的HTTP请求就有可能被分发到不同的实例上,如何保存各个实例之间的session的同步就成为一个必须解决的问题。使用Redis 解决共享问题的原理非常简单,就是把原本存储在不同服务器上的session拿出来放在一个独立的服务器上。
----当一个请求到达Nginx服务器后,首先进行请求分发,假设请求被real server处理了,real server 1在处理请求时,无论是存储在session还是读取session,都去操作session服务器而不是操作自身内存中的session,其它real server在处理请求时也是如此,这样就实现了session共享。
举例:IDEA创建一个springboot项目'session'

  1. 导包
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.session</groupId>
            <artifactId>spring-session-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

  1. application.properties
spring.redis.database=0
spring.redis.host=redis服务的ip
spring.redis.port=6379
spring.redis.password=123456
spring.redis.jedis.pool.max-active=8
spring.redis.jedis.pool.max-idle=8
spring.redis.jedis.pool.max-wait=-1ms
spring.redis.jedis.pool.min-idle=0
  1. 创建一个控制类来测试
    这里创建了两个方法,一个save接口用来向session中存储数据,还有一个get是用来从session中获取数据,这里注入了项目启动端口server.port,主要是为了区分到底是哪个服务器提供服务。另外,虽然还是操作的Httpsession,但实际上Httpsession容器已经被透明替换,真正的session存储在Redis服务器上。
@RestController
public class HelloController {
    @Value("${server.port}")
    String port;
    @PostMapping("/save")
    public String saveName(String name, HttpSession session) {
        session.setAttribute("name", name);
        return port;
    }
    @GetMapping("/get")
    public String getName(HttpSession session) {
        return port + ":"
                + session.getAttribute("name").toString();
    }
}
  1. 项目配好后,打包,上传到Centos服务器上(Redis,nginx都在这上面,已配好jdk,Redis,Nginx,tomcat),后,再执行如下代码。
    注意:nohup表示不挂断程序运行,最终端口关闭后,程序仍可在运行,&表示让程序在后台运行,接下来就要运行负截均衡了,redis了。分别开两个窗口运行之,不要关 闭窗口
nohup java -jar session0.0.1-SNAPSHOT.jar --server.port=8084 &
nohup java -jar session0.0.1-SNAPSHOT.jar --server.port=8085 &

image.png

image.png

5.nginx的配置/etc/nginx/conf.d/proxy.conf,重启nignx -s reload,8088是代理服务器,常用的8080端口服务器做了文件服务器。

upstream sessionshare-server {
         server 139.198.11.194:8084 weight=1;
         server 139.198.11.194:8085 weight=1;
         }
server {
    listen       8088;
    server_name  localhost;


    location / {
        proxy_pass http://sessionshare-server;
        proxy_redirect default;
    }



}


运行后,可以分别登录ip+端口号测试,当然了浏览器不好测试,没有post请求,我们用了postman工具来测试

nginx搭建

简介
Nginx(engine x)是一个高性能的HTTP反向代理服务器,也是一个IMAP/POP3/SMTP服务器,可以作为一个WEB服务器进行网站发布,也可以用为反向代理服务器进行负载均衡的实现---如与Tomcat(web服务器)一起实现负载均衡。
特点
占用内存少,并发能力强。

  1. 安装nginx方式一(通过yum安装--这是我喜欢的方式)
    1.把 nginx 的源加入 yum 中
    直接通过 yum install nginx 肯定是不行的,因为yum没有nginx,所以首先把 nginx 的源加入 yum 中。
 rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm

2.查看nginx信息

 yum info nginx

3.使用yum安装ngnix

yum install nginx

4.启动与重启nginx,并查看安装目录分别在那里

#systemctl start/restart nginx.service
//重启服务还可以
#/usr/sbin/nginx -s reload
#whereis nginx
nginx: /usr/sbin/nginx /usr/lib64/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

5.查看nginx版本,测试成功否

nginx -v
curl -i localhost

6.nginx配置文件位置在/etc/nginx/conf.d/default.conf可以更改端口号

  1. 安装nginx方式二(源码安装)
    ----下载:http://nginx.org/en/linux_packages.html
    1.源代码安装(要make makeinstall)
    image.png
需要编译
./configure -----make----- makeinstall
wget https://nginx.org/download/nginx-1.14.0.tar.gz
tar -zxvf nginx-1.14.0.tar.gz 
cd nginx-1.14.0
./configure
make 
make install

如果遇到安装nginx报错:make: *** 没有规则可以创建“default”需要的目标“build”。 停止。再重新配置,编译

yum -y install gcc openssl openssl-devel pcre-devel zlib zlib-devel
./configure
make 
make install

安装成功后,自动安装到/usr/local中,进sbin目录下。执行nginx的启动文件

whereis nginx                      #可查看安装到哪里
cd /usr/local/nginx/sbin
./nginx

测试:nginx安装成功否,默认端口号:80

ip回车   或 localhost回车,

image.png

启动,重启,停止nginx服务器

cd /usr/local/nginx/sbin
./nginx
./nginx -s stop
./ nginx reload

查看端口号占用情况,如果没有netstat命令,则yum install net-tools

netstat -tnlp | grep 80  #因为nginx默认端口号是80,这里我们查一下他有没有被其它应用占用

2.配成http服务器即虚拟主机(/usr/local/nginx/conf/nginx.conf)
-------Centos中安装nginx,它安装的文件全在一个目录下,不同于ubuntu,分布在不同的文件夹中,这一点centos要方便多了。
nginx.conf

#user  nobody; 工作进程的数量,可以根据cpu的核心总数来设置
worker_processes  1;

#error_log  logs/error.log;
error_log /usr/local/nginx/error.log warn;
#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函数来输出文件
    sendfile        on;
    #tcp_nopush     on;
  
    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

}

1.创建虚拟主机目录(/tmp/nginxhttp/mus和sms)

cd /tmp 
mkdir nginxhttp
cd nginxhttp
mkdir mus
mkdir sms
pwd             #查看当前目录绝对路径

2.实现虚拟主机的三种方式
基于不同的IP----最常用
基于不同的域名----要购买域名
基于不同的端口号--一般用于测试用,实际生产中不可能这样用
-----本人在这是基于域名的创建虚拟主机,当然了不是买的,是本地虚拟的
首先:修改配置文件,这里我从安装目录的conf目录找到nginx.conf。再打开修改,这里我们只要在http{}中加两个server即可。注:一定要养成备份的习惯。

cd /usr/local/ngixn/conf                 #nginx安装自动部署到该位置,不是我做的

-----------------------------------------------------------------------------------------------
server {

        listen       80;
        server_name  www.mus.com;              #www.mus.com和www.sms.com 都是自设域名

        location / {
            root   /tmp/nginxhttp/mus;        #  root   /tmp/nginxhttp/sms;
            index  index.html index.htm;
        }
}
server {

        listen       80;
        server_name  www.sms.com;              #www.mus.com和www.sms.com 都是自设域名

        location / {
            root   /tmp/nginxhttp/sms;        #  root   /tmp/nginxhttp/sms;
            index  index.html index.htm;
        }
}

  1. 重启nginx服务器,并把对应的vmware nat ip地址复制好,可以用ip addr查询之,放进 c:/windows/system32/drivers/etc/hosts文件中,如下所示。
cd /usr/local/nginx/sbin
./nginx -s reload
---------------------------------------------------------------windows中hosts------------------------------------------------------------
192.168.72.135 www.ums.com
192.168.72.135   www.sms.com

4.测试:https://www.ums.com/http://www.sms.com回车

Nginx作为文件服务器下载功能

  1. 上传通过ftp或sftp(Winscp工具)
  2. 下载功能实现
    首先:,创建文件目录 (/home/xiong/www/image/)
cd /home/xiong
mkdir www
cd www
mkdir image

然后: 配置nginx.conf文件(/usr/local/nginx/conf/nginx.conf,安装nginx时自动放在这的)(yum安装方式/etc/nginx/conf.d/default.conf,但nginx/nginx.conf有一个/etc/nginx/conf.d/*.conf;会把conf.d中的所有conf文件包含 进来),此时只在主服务器上加如下代码即可。

//原来的代码
 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }
}
-------------------------------------------------------------------修改后的代码---------------------------------------------------------------------
 server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }

       location /image {
               root /home/xiong/www;
               autoindex on;
             autoindex_exact_size off;
             autoindex_localtime on;
         }

再然后:重启nginx

cd /usr/local/nginx/sbin
./nginx -s reload

最后测试:
http://ip/image回车
问题
403 Forbidden
分析:
一、由于启动用户和nginx工作用户不一致所致,所以要修改nginx.conf

ps aux | grep "nginx: worker process" | awk'{print $1}'  #查看启动nginx的启动用户,这里是root,但这处修改没用
a2f6b28d4defcf0f11f84cb6ab7ca016_Center.png

b3b5f4c542f6d7d120e9afe42fd53a73_Center.png

二,权限问题,如果nginx没有web目录的操作权限,也会出现403错误。

chmod -R 777 /home/xiong/

Nginx用作反向代理

先介绍一下正向代理
-----正向代理现实中一般用在翻墙,作缓存用的,加速资源的访问,如公司里很多人会访问新浪网,可以把它缓存到代理服务器,对客户端上网进行认证授权,还有上网行为管理,如翻墙时原始服务器并不知道谁访问他了, 这样可以陒藏客户信息。

image.png

反向代理简介
------有这么一个场景,现在有一个服务器集群(分布式),当客端访问服务器时,它是怎样访问到服务器的,处理方法:在服务器集群前有一个反向代理服务器,用于分配访问资源访问,反向代理不是客户端设置的。分配策略(负载均衡)后面介绍。
反向代理作用:
1.实现负载均衡,提高处理和响应速度
2.保证内网的安全。隐藏服务器信息。
image.png

Nginx作为反向代理的配置
首先:我们用tomcat作为内部原始服务器,启动之,端口号:8081,8080已被nginx用了,这是在云主机上寮现的,没有备案,所以80 443端被禁用了。
image.png

----下载后tomcat winscp传到Llinux的/usr/local中
解压,进入解压后的目录,修改端口号为8081(根目录下的conf目录下的server.xml),执行./startup.sh

tar -zxvf apache-....tar.gz
mv apache-   tomcat9    #改一下根目录名,好方便操作
cd tomcat9/conf
vi server.xml

image.png

注意:修改好端号8080--8081好后,关闭一于服务器,再启动下

# ./usr/local/tomcat9/bin/shutdown.sh
# ./usr/local/tomcat9/bin/startup.sh

测试tomcat启动否,有用否.我现在有两种 方法。
方法一,---可以从Eclipse(或STS)中运行并部署到tomcat的webapps中的项目(upload)文件全部上传到linux中安装的根录目录下的webapps中,

image.png

image.png

image.png

方法二,----ECLIPSE中右点项目(upload)---export-----web.war文件,导出为扩展名为war的文件,再上传到linux中的webapps中,该文件还可以自定义名字。再关闭tomcat服务,又启动tomcat服务,相当于重启服务
image.png

------------------测试:http://ip:端口号/upload/index.jsp
然后:进入nginx安装根目录下,找到conf中的配置文件nginx.conf,最好先备份一份。再编辑,直接在主server后面加一个服务,yum方式安装的nginx在/etc/nginx/conf.d/中复制default.conf为proxy.conf。



#后台服务器列表
upstream tomcat-server {
         server 139.198.11.194:8081;  #真实服务器的端口8081

         }
server {
    listen       8086;  #代理端口8086
    server_name  localhost;


    location / {
        proxy_pass http://tomcat-server; #指定代理的后台服务器
    }
}

这里我们的niginx的8086端口服务反向代理tomcat的服务。注意:自定义的服务名中不能有_下划线。
最后:重启nginx,测试。nginx命令安装时自动载入到环境变量中,所以在任何地方都可以重启

nginx -s reload

浏览器中输入:http://ip:代理端口/

nginx实现负载均衡

------将任务通过某种策略分配到多个实体上去,实现负载在不同实体间的平衡。
-------在nginx实现反向代理的基础上实现负截均衡
首先:模拟建设多台实在服务器(tomcat服务),即我们在一台机上复制多个(2个)tomcat安装目录,分别改成不同的端口号(8082,8083。8081被原始tomcat用了),还有《Server

cd /usr/local
cp -r tomcat9 taobao1
cp -r tomcat9 taobao2
vi taobao1/conf/server.xml
vi taobao1/conf/server.xml

分别两处要改的地方:

//1处,原port="8005"
<Server port="8012" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
 //2处 原port="80"
 <Connector port="8082" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

然后:到/etc/nginx/conf.d/中复制原来做的反向代理服务的proxy.conf 文件,或者就用这个文件配负载均衡权重

upstream tomcat-server {
         server 139.198.11.194:8081 weight=3;
         server 139.198.11.194:8082 weight=1;
         server 139.198.11.194:8083 weight=1;
         }
server {
    listen       8086;
    server_name  localhost;


    location / {
        proxy_pass http://tomcat-server;
        #proxy_set_header Host $http_host;
    }



}

测试负载均衡效果:http://ip:8086/,不停的刷新网页, 可以看到权重大的运行的次数多
注:这里我改了tomcat的默认项目下面的index.jsp页面,该页面在webapps/ROOT/下

nginx实现动静分离

--------一个项目中有动态资源和静态资源,tomcat作为动态服务器是很历害的,但他处理静态资源不如nginx,这就要我们把静态资源放到nignx服务器中,再用nginx反向代理传给tomcat服务器。

  1. 在是上面反向代理示例中的例子代码改下,我们先把访问静态资源的功能做空(即设置的目录中没有资源),看看页面效果。
upstream tomcat-server {
         server 139.198.11.194:8081 weight=3;
         server 139.198.11.194:8082 weight=1;
         server 139.198.11.194:8083 weight=1;
         }
server {
    listen       8086;
    server_name  localhost;

   #处理动态资源
    location / {
        proxy_pass http://tomcat-server;
        #proxy_set_header Host $http_host;
    }
    
    #处理静态资源
    location ~ .*\.(js|css|ico|png|eot|jpg|ttf|svg|woff) {    #这样写上的话,服务找这些文件,会被动态服务器拒绝
         root /usr/local/www/static;
     }

}

测试效果,http://192.168.1.13:8086/,如果没有出现如下效果,则有可能是网页没有清理缓存数据。

image.png

  1. 我们把静态资源复制到/usr/local/www/static中
cd /usr/local/tomcat9/webapps/ROOT/
cp tomcat.svg tomcat.css /usr/local/www/static/

测试效果:http://192.168.1.13:8086/如下图所示。如果没有出现如下效果,极有可能是没有读取权限,为nginx启动会自建用户nginx,所以设置static下所有文件有777权限

static]#chmod 777 *
image.png

nginx高并发处理

  1. 负载均衡:集群
  2. 动静分离,自已没有nignx服务器的话,可以考虑有很多网络上的第三方服务CDN(内容分发网络),比如bootstartp
  3. 限流,流量控制(把超出的流量放进一个队列,如果队列装不下,可以直接拒绝)
  4. 降级:服务降载(比如,日志不记录正确的日志)
  5. 缓存:以空间换时间,提高系统效率
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容