一:redis介紹
redis資料庫:是一個非關系型資料庫。是一個開源的使用C語言編寫支援網絡,可基于記憶體可持久化得日志型的資料庫。為了保證效率,資料都是緩存在記憶體中。
redis伺服器程式是單程序模型,可以在一台伺服器上同時啟動多個redis程序,實際處理速度完全依靠主程序的執行效率。
那麼我們先了解一下關系型資料庫與非關系型資料庫。
(1)關系型資料庫:是一個結構化的資料庫,建立在關系模型基礎上,一般面向記錄。它借助于集合代數等數學概念來處理資料庫中的資料。SQL語句就是一種基于關系型資料庫的語言,用來執行對關系型資料庫中資料的檢索和操作。
主流的關系型資料庫包括:oracle MySQL SQLserver DB2等。
(2)非關系型資料庫:除主流的關系型資料庫以外都是非關系型資料庫。
主流的Nosql(非關系型資料庫)有:redis Monbd hbase等。
非關系型資料庫優勢:非關系型,分布式,開源和橫向擴充。
2>>>>>>:關系型資料庫現有的問題:
1:對資料庫高并發讀寫需求
2:對海量資料高效存儲與通路需求
3:對資料庫高擴充性與高可用性需求
關系型資料庫關注在關系上,非關系型資料庫關注在存儲上。
3>>>>>>:redis優點:
(1):具有極高的資料讀寫速度;資料讀取速度最高可達每秒11萬次。
(2):支援資料類型豐富;
(3):支援資料持久化,可将記憶體中的資料儲存在磁盤中,重新開機的時候可以再次加載進行使用。
(4):支援資料備份。
二、如何保持session會話:
在叢集系統下實作session統一的有如下幾種方案:
1、請求精确定位:sessionsticky,例如基于通路ip的hash政策,即目前使用者的請求都集中定位 到一台伺服器中,這樣單台伺服器儲存了使用者的session登入資訊,如果當機,則等同于單點部 署,會丢失,會話不複制。
2、session複制共享:sessionreplication,如tomcat自帶session共享,主要是指叢集環境下, 多台應用伺服器之間同步session,使session保持一緻,對外透明。 如果其中一台伺服器發生 故障,根據負載均衡的原理,排程器會周遊尋找可用節點,分發請求,由于session已同步,故 能保證使用者的session資訊不會丢失,會話複制,。 此方案的不足之處: 必須在同一種中間件之間完成(如:tomcat-tomcat之間). session複制帶來的性能損失會快速增加.特别是當session中儲存了較大的對象,而且對象變化 較快時, 性能下降更加顯著,會消耗系統性能。這種特性使得web應用的水準擴充受到了限制。 Session内容通過廣播同步給成員,會造成網絡流量瓶頸,即便是内網瓶頸。在大并發下表現并 不好
3、基于cache DB緩存的session共享
基于memcache/redis緩存的 session 共享 即使用cacheDB存取session資訊,應用伺服器接受新請求将session資訊儲存在cache DB中,當 應用伺服器發生故障時,排程器會周遊尋找可用節點,分發請求,當應用伺服器發現session不 在本機記憶體時,則去cache DB中查找,如果找到則複制到本機,這樣實作session共享和高可用。
三、nginx+tomcat+redis實作負載均衡、session共享
1、實驗環境
2、實驗拓撲:
在這個圖中,nginx做為反向代理,實作靜動分離,将客戶動态請求根據權重随機配置設定給兩台tomcat 伺服器,redis做為兩台tomcat的共享session資料伺服器,mysql做為兩台tomcat的後端資料庫。
3、nginx安裝配置
使用Nginx作為Tomcat的負載平衡器,Tomcat的會話Session資料存儲在Redis,能夠實作零當機的 7x24效果。因為将會話存儲在Redis中,是以Nginx就不必配置成stick粘貼某個Tomcat方式,這樣 才能真正實作背景多個Tomcat負載平衡。
安裝nginx:(之前我們有寫過怎樣安裝nginx及各種優化可看之前的博文)
(1):先使用yum安裝缺少的依賴:
[[email protected] ~]# yum -y install pcre-devel
[[email protected] ~]# yum -y install pcre-devel
(2):下載下傳nginx源碼包并編譯安裝:
[[email protected] ~]# tar zxf nginx-1.10.2.tar.gz
[[email protected] ~]#cd nginx-1.10.2/
[[email protected] nginx-1.10.2]# ./configure
[[email protected] nginx-1.10.2]# make && make install
優化nginx程式的執行路徑并啟動:
[[email protected] nginx-1.10.2] ln -s /usr/local/nginx1.10/sbin/nginx /usr/local/sbin/
[[email protected] nginx-1.10.2] nginx
配置nginx反向代理:反向代理+負載均衡+健康探測:
[[email protected] nginx-1.10.2] vim /usr/local/nginx1.10/conf/nginx.conf
重新開機nginx服務,使修改生效:
[[email protected] nginx-1.10.2] nginx -s reload
4、安裝部署tomcat應用程式伺服器(下載下傳安裝tomcat源碼包并編譯安裝)
Tomcat 1 和tomcat 2 配置都要相同:
[[email protected] ~]#tar zxf apache-tomcat-8.5.35.tar.gz
将解壓生成的檔案夾移動到/usr/local/下,并改名為tomcat
[[email protected] ~]# mv apache-tomcat-8.5.35 /usr/local/tomcat
[[email protected] ~]# cd /usr/local/tomcat/
[[email protected] tomcat ~]# /usr/local/tomcat/bin/startup.sh
[[email protected] tomcat ~]# netstat -anput | grep 8080
防火牆規則配置:
[[email protected] ~]# firewall-cmd --permanent --add-port=8080/tcp
success
[[email protected] ~]# firewall-cmd --reload
success
按照相同方法在tomcat-2也安裝。
打開浏覽器分别對tomcat-1和tomcat-2通路測試
如果想關閉tomcat則運作/usr/local/tomcat7/bin/shutdown.sh指令 好了,大家可以看到訪成功。說明我們的tomcat安裝完成,下面我們來修改配置檔案
[[email protected] ~]# vim /usr/local/tomcat/conf/server.xml
修改預設虛拟主機,并将網站檔案路徑指向/web/webapp1,在host段增加context段
增加文檔目錄與測試檔案:
[[email protected] ~]# mkdir -p /web/webapp1
[[email protected] ~]# cd /web/webapp1/
[root@ tomcat webapp1]# vi index.jsp
index.jsp内容如下:
停止tomcat運作,檢查配置檔案并啟動tomcat
Tomcat-2節點與tomcat-1節點配置基本類似,隻是jvmRoute不同,另外為了區分由哪個節點 提供通路,測試頁标題也不同(生産環境兩個tomcat伺服器提供的網頁内容是相同的)。其 他的配置都相同。
用浏覽器通路nginx主機,驗證負載均衡 第一次通路的結果
第二次通路的結果:
從上面的結果能看出兩次通路,nginx把通路請求分别分發給了後端的tomcat-1和tomcat-2, 用戶端的通路請求實作了負載均衡,但sessionid并不一樣。是以,到這裡我們準備工作就全 部完成了,下面我們來配置tomcat通過redis實作會話保持。
5、安裝redis
下載下傳redis源碼,并進行相關操作,如下: wget http://download.redis.io/releases/redis-3.2.3.tar.gz
解壓安裝redis
[[email protected] ~]#tar zxf redis-4.0.14.tar.gz
[[email protected] ~]#cd redis-4.0.14/
[[email protected] redis-4.0.14 ~]# make&& make install
[email protected] redis-4.0.14 ~]#cd utils/
[email protected] utlis~]# ./install_server.sh
通過上圖,我們可以很容易的看出,redis安裝到 /usr/local,/usr/local/bin,/usr/local/share,/usr/local/include,/usr/local/lib,/usr/l ocal/share/man目錄下。
然後再切換到utils目錄下,執行redis初始化腳本install_server.sh,如下:
修改redis配置檔案:
[[email protected] utils]# vim /etc/redis/6379.conf
重新啟動redis服務:
[[email protected] ~]# systemctl restart redis_6379.service
redis配置檔案配置完畢後,我們來啟動redis并進行簡單的操作。如下:
關于redis-cli -h 192.168.1.50 -p 6379 -a 123.com的參數解釋 這條指令是說要連接配接redis伺服器,IP是192.168. 1.50,端口是6379,密碼是123.com。 keys *是檢視redis所有的鍵值對。
6、配置tomcat session redis同步(回到tomcat兩台操作相同)
回到tomcat的lib目錄下添加:
修改tomcat的context.xml:
[[email protected] lib]# vim /usr/local/tomcat/conf/context.xml
重新開機tomcat服務:
說明:
maxInactiveInterval="60":session的失效時間
tomcat-2執行和tomcat-1相同的操作
通過浏覽器通路http://192.168.1.10/index.jsp測試頁
重新整理頁面
可以看出,分别通路了不同的tomcat,但是得到的session卻是相同的,說明達到了叢集的目的。
檢視redis是否有儲存session會話:
7、tomcat連接配接資料庫:
192.168.1.40作為mysql資料庫伺服器
[[email protected] ~]# mysql –u root -p123
mysql> grant all on *.* to javauser@'192.168.1.%' identified by '123.com';
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> create database javatest;
Query OK, 1 row affected (0.01 sec)
mysql> use javatest;
Database changed
mysql> create table testdata(id int not null auto_increment primary key,foo varchar(25),bar int);
Query OK, 0 rows affected (0.02 sec)
插入些資料:
mysql> insert into testdata(foo,bar) values
('lvranbo','123456'),('lrb','654321');
Query OK, 2 rows affected (0.04 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from testdata;
mysql防火牆配置
# firewall-cmd –-permanent –add-port=3306/tcp
# firewall-cmd –reload
配置tomcat伺服器連接配接mysql資料庫(回到tomcat)
[[email protected] lib]# vim /usr/local/tomcat/conf/context.xml
儲存修改并退出:
[[email protected] ~]# mkdir /web/webapp1/WEB-INF
[[email protected] ~]# vi /web/webapp1/WEB-INF/web.xml
添加内容如下:
儲存修改并退出,重新開機tomcat服務(tomcat2相同配置)
[[email protected] ~]# vim /web/webapp1/test.jsp
添加内容如下:
通過浏覽器通路http://192.168.1.10/test.jsp測試頁
總結:這篇博文告訴我們session會話如何保持一緻性。