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
-
windows下安装
11.安装版4.0.XX版对win7有用。
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目录下存的则是日志文件,文件内容是启动信息
- 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》。下载
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(客户端工)创建。
部署主要步骤:
- 部署单机版redis
首先:下载redis.5.0x版本,复制链地址到CENTOS 8终端上,再解压,复制到/usr/local,并用mv重命名解压的根目录以便好用,进入根目录,输入make,make install。
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 //关闭服务
- 将已部署好的单机版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
- 创建集群
----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“, 之后打印如下信息标识创建完成
- 集群验证
----集群规划(测试环境ip192.168.19.128,一台部署6个节点,正式环境和测试环境一样的部署方式,无非把节点分配到其他服务器)
首先:任意节点创建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
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
- 测试成功否
-----分别登录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状态。
- 修改配置文件
# 配置文件进行了精简,完整配置可自行和官方提供的完整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
- 重新启动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安装
- 确定系统上是否安装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.下载,提示:将下载好的压缩包通过FTP工具上传到服务器的/usr/local/java目录中,上传的过程就不描述了,有很多种上传方式的,例如使用ftp工具、Xshell的文件上传工具、cmd命令下使用SCP命令上传、宝塔面板上使用上传文件功能、WinSCP工具等等,这里选tar.gz.
Oracle官网下载:Java Downloads | Oracle
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'
- 导包
<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>
- 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
- 创建一个控制类来测试
这里创建了两个方法,一个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();
}
}
- 项目配好后,打包,上传到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 &
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服务器)一起实现负载均衡。
特点
占用内存少,并发能力强。
- 安装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可以更改端口号
- 安装nginx方式二(源码安装)
----下载:http://nginx.org/en/linux_packages.html
1.源代码安装(要make makeinstall)
需要编译
./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回车,
启动,重启,停止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;
}
}
- 重启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作为文件服务器下载功能
- 上传通过ftp或sftp(Winscp工具)
- 下载功能实现
首先:,创建文件目录 (/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,但这处修改没用
二,权限问题,如果nginx没有web目录的操作权限,也会出现403错误。
chmod -R 777 /home/xiong/
Nginx用作反向代理
先介绍一下正向代理
-----正向代理现实中一般用在翻墙,作缓存用的,加速资源的访问,如公司里很多人会访问新浪网,可以把它缓存到代理服务器,对客户端上网进行认证授权,还有上网行为管理,如翻墙时原始服务器并不知道谁访问他了, 这样可以陒藏客户信息。
反向代理简介
------有这么一个场景,现在有一个服务器集群(分布式),当客端访问服务器时,它是怎样访问到服务器的,处理方法:在服务器集群前有一个反向代理服务器,用于分配访问资源访问,反向代理不是客户端设置的。分配策略(负载均衡)后面介绍。
反向代理作用:
1.实现负载均衡,提高处理和响应速度
2.保证内网的安全。隐藏服务器信息。
Nginx作为反向代理的配置
首先:我们用tomcat作为内部原始服务器,启动之,端口号:8081,8080已被nginx用了,这是在云主机上寮现的,没有备案,所以80 443端被禁用了。
----下载后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
注意:修改好端号8080--8081好后,关闭一于服务器,再启动下
# ./usr/local/tomcat9/bin/shutdown.sh
# ./usr/local/tomcat9/bin/startup.sh
测试tomcat启动否,有用否.我现在有两种 方法。
方法一,---可以从Eclipse(或STS)中运行并部署到tomcat的webapps中的项目(upload)文件全部上传到linux中安装的根录目录下的webapps中,
方法二,----ECLIPSE中右点项目(upload)---export-----web.war文件,导出为扩展名为war的文件,再上传到linux中的webapps中,该文件还可以自定义名字。再关闭tomcat服务,又启动tomcat服务,相当于重启服务
------------------测试: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服务器。
- 在是上面反向代理示例中的例子代码改下,我们先把访问静态资源的功能做空(即设置的目录中没有资源),看看页面效果。
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/,如果没有出现如下效果,则有可能是网页没有清理缓存数据。
- 我们把静态资源复制到/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 *
nginx高并发处理
- 负载均衡:集群
- 动静分离,自已没有nignx服务器的话,可以考虑有很多网络上的第三方服务CDN(内容分发网络),比如bootstartp
- 限流,流量控制(把超出的流量放进一个队列,如果队列装不下,可以直接拒绝)
- 降级:服务降载(比如,日志不记录正确的日志)
- 缓存:以空间换时间,提高系统效率