第十四天:
- 1、Linux上mysql的安裝
- 2、系統的部署
- 3、mycat的介紹
- 4、項目總結
- 5、面試中的問題
1、開發流程淺解

2、項目發布前的准備
1、測試
a) 本地單元測試
b) 測試環境測試(1,2,3,4,5)
c) 用戶測試(仿真環境:UAT環境)
2、確認服務器的資源
a) 硬件資源(CPU、內存、硬盤)
b) 軟件資源(Linux、Windows)
c) 網絡資源(寬帶、機房、雲服務器)
3、相關參與的人員確認
a) 測試人員
b) 開發人員
4、數據庫腳本的准備
a) 初始化數據的sql腳本(DBA、運維)
b) 權限的sql腳本等
5、編寫發布的文檔
a) 開發人員編寫各自負責的功能模塊的發布文檔
信息
b) 測試的文檔(測試用例)
c) 全員參與
6、打包
a) 專門負責的人員進行打包處理(運維)
7、准備回滾方案
3、項目部署
3.1、Linux下安裝mysql
第一步:查看mysql是否安裝。
rpm -qa | grep mysql
第二步:如果mysql的版本不是想要的版本。需要把原來的mysql卸載。
yum remove mysql mysql-server mysql-libs mysql-common
rm -rf /var/lib/mysql
rm -f /etc/my.cnf
注意:使用yum命令卸載,因為yum命令可以自動刪除與mysql相關的依賴;如果使用rpm命令卸載,則還需要手動去刪除和mysql相關的文件。
第三步:安裝mysql。需要使用yum命令安裝。在安裝mysql之前需要安裝mysql的下載源。需要從oracle的官方網站下載。
1)下載mysql的源包:
我們是centos6.4對應的rpm包為:mysql-community-release-el6-5.noarch.rpm
命令:wget http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
2)安裝mysql下載源:
yum localinstall mysql-community-release-el6-5.noarch.rpm
3)在線安裝社區版的mysql:
yum install mysql-community-server
或者在線安裝收費版本的mysql:
yum install mysql-server
兩種方式均可,建議安裝社區版。
rpm包位置:

第四步:啟動mysql。
service mysqld start
第五步:需要給root用戶設置密碼。
/usr/bin/mysqladmin -u root password 'new-password' #為root賬號設置密碼
第六步:登錄mysql。
[root@localhost temp]# mysql -uroot -pitcast
第七步:需要先登錄到mysql,遠程連接授權。
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
注意:'myuser'
、'mypassword'
需要替換成實際的用戶名和密碼。
mysql安裝好了之后,啟動服務,建立連接,導入taotao數據庫文件。
詳細鏈接文章:https://www.cnblogs.com/chenmingjun/p/10192987.html
3.2、項目架構講解

3.3、系統功能介紹

3.4、網絡拓撲圖

3.5、系統部署
3.5.1、部署分析
工程共13個,如下所示,本着高可用的原則,每個工程至少有兩台服務器。13個工程至少需要26台服務器。
taotao-manager 8080
taotao-manager-web 8081
taotao-portal-web 8082
taotao-content 8083
taotao-search 8084
taotao-search-web 8085
taotao-item-web 8086
taotao-sso 8087
taotao-sso-web 8088
taotao-cart 8089
taotao-cart-web 8090
taotao-order 8091
taotao-order-web 8092
即淘淘商城在真實環境中要部署的話需要26台服務器。
服務 | 服務器個數 |
---|---|
Mysql(主備) | 2 |
Solr(集群3+4兩片) | 7 |
Redis(集群3個節點) | 6 |
圖片服務器(T/S) | 2 |
Nginx(主備) | 2 |
zookeeper注冊中心(集群) | 3 |
Activemq(集群) | 2 |
總共需要26+24=50台服務器。但我們都知道,一般的小公司是絕不可能弄這么多服務器的,太昂貴了,比較可行的是采用偽分布式
。
3.5.2、服務器規划
如下圖所示,搭建服務原來需要24台服務器,現在只需要7台即可。

搭建工程規划使用5台服務器便可,如下圖所示:

這樣規划的話,我們只需要7+5=12台服務器即可。
當然了,12台服務器在一般的公司來說,也是達不到的,那么我們便可以進一步壓縮:
把更多的服務合並到一台服務器上,我們
將所有服務精簡成一台服務器
:
192.168.25.133
內存至少給2G以上。下圖是所有服務端口的規划表:

把更多的工程合並到一台服務器上。我們
將所有工程精簡成一台服務器
:
192.168.25.133
內存至少給2G以上。下圖是所有工程端口的規划表:
3.5.3、工程規划
工程規划表:

tomcat端口更新映射表:

3.5.4、域名規划
域名規划表:

3.5.5、tomcat熱部署
可以使用maven的tomcat插件實現tomcat熱部署。即在tomcat啟動時部署工程
。
tomcat有個后台管理功能
,可以實現工程熱部署。部署完成后,我們不需要啟動tomcat了,tomcat會自動把war包解壓到ROOT目錄下。tomcat后台管理功能
有兩種方式可以訪問,第一種是通過圖形化界面
的方式,第二種是通過命令行
的方式,這兩種方式需要配置相應的權限。
第一種方式需要將工程打成war包,再手動上傳,稍微有一些麻煩,第二種方式相對簡單些。我們下面演示的是第二種方式。
這里僅以taotao-content及taotao-portal-web為例子演示:
演示使用的Linux的ip地址為:192.168.25.133
在Linux下,我們新建有13個tomcat放置13工程:

先啟動服務:啟動zookeeper,啟動redis,啟動solr,啟動activemq,啟動mysql。
部署方法:
先部署服務層工程,再部署表現層工程。
a) 部署taotao-content
linux系統上的配置:
第一步:需要修改linux系統中對應的tomcat9002的conf/tomcat-users.xml配置文件。添加用戶名、密碼、權限。
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
我們要將war包放在對應的tomcat9002中的webapps目錄下的ROOT目錄下,所以我們先在webapps目錄下創建ROOT目錄:
[root@localhost webapps]# mkdir ROOT
第二步:重新啟動對應的tomcat9002。
[root@localhost ~]# pwd
/usr/local/taotao-projects/tomcat9002/bin
[root@localhost bin]# ./startup.sh
第三步:查看tomcat9002的啟動日志。
[root@localhost tomcat9002]# tail -f logs/catalina.out
開發機器上(windows系統)的配置:
第一步:修改配置文件。
修改taotao-content工程中的相應的配置文件db.properties
中數據庫的ip地址、端口、實例名、用戶名、密碼。如下:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.165.25.133:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
修改applicationContenxt-redis.xml
中的ip地址、端口。(即:將原來的localhost修改為mysql所在的服務器的IP地址。)
修改taotao-content工程中的發布服務的配置文件applicationContenxt-service.xml
中注冊中心的地址,改成linux系統中的zookeeper的地址192.168.25.167
以及暴露服務的端口。
第二步:配置maven的tomcat插件,需要修改taotao-content工程的pom.xml文件。
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8083</port>
<path>/</path>
<url>http://192.168.25.133:9002/manager/text</url>
<username>tomcat</username>
<password>tomcat</password>
</configuration>
</plugin>
</plugins>
</build>
注意:添加了三行配置,<url>
里面的tomcat熱部署地址的端口號有所變化,現在是9002。大家可能會有疑問,<url>
配置上面的那個<port>8083</port>
有什么用?會不會對部署產生壞的影響。這個其實不用擔心,這個port
對熱部署來說,沒有用,這里之所以沒有把它刪掉是因為我們在Windows系統下開發
的時候給這個工程規划的端口是8083
,如果需要在Windows系統下啟動該工程的
話,這個port就是有用的,因此這個<port>8083</port>
配置我們不必理會,擱那兒就行。
第三步:使用maven命令進行部署。
選中taotao-content工程,右鍵 --> Run As --> Maven build…
clean tomcat7:deploy #部署
clean tomcat7:redeploy #重新部署
部署的路徑是“/”
會把系統部署到webapps/ROOT目錄下
。
部署工程跳過測試
:
clean tomcat7:redeploy -DskipTests
第四步:在Linux下查看toamcat9002的日志
[root@localhost tomcat9002]# tail -f logs/catalina.out
日志輸出內容如下圖所示:

注意:每次
部署完服務后
,都會停在如上圖所示的位置上,需要我們
重新啟動tomcat9002
。暫時不知道為什么。
第五步:重新啟動tomcat9002。
第六步:查看dubbo監控中心。
部署完服務層工程taotao-content后,我們到
dubbo服務治理
-->
服務頁面
,發現多了兩個服務,分別是com.taotao.content.service.ContentCategoryService和com.taotao.content.service.ContentService。說明我們的taotao-content工程部署成功。
b) 部署taotao-portal-web
注意:首先要確保新的服務器192.168.25.133
上安裝的jdk是否與Eclipse開發時所用的jdk版本一致,我Eclipse開發時用的jdk1.7,因此服務器上的安裝的jdk版本也要是1.7才行。不然會出現問題!!!(是個坑)
Linux上安裝jdk過程鏈接:https://www.cnblogs.com/chenmingjun/p/9931593.html
linux系統上的配置:
第一步:需要修改linux系統中對應的tomcat9003的conf/tomcat-users.xml配置文件。添加用戶名、密碼、權限。
<role rolename="manager-gui" />
<role rolename="manager-script" />
<user username="tomcat" password="tomcat" roles="manager-gui, manager-script"/>
我們要將war包放在對應的tomcat9003中的webapps目錄下的ROOT目錄下,所以我們先在webapps目錄下創建ROOT目錄:
[root@localhost webapps]# mkdir ROOT
第二步:重新啟動對應的tomcat9003。
[root@localhost ~]# pwd
/usr/local/taotao-projects/tomcat9003/bin
[root@localhost bin]# ./startup.sh
第三步:查看tomcat9003的啟動日志。
[root@localhost tomcat9003]# tail -f logs/catalina.out
開發機器上(windows系統)的配置:
第一步:修改配置文件。
修改taotao-portal-web工程中的引用服務的配置文件springmvc.xml中注冊中心的地址,改成linux系統中的zookeeper的ip地址192.168.25.133
。
第二步:配置maven的tomcat插件,需要修改taotao-portal-web工程的pom.xml文件。
<build>
<plugins>
<!-- 配置Tomcat插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8082</port>
<path>/</path>
<url>http://192.168.25.133:9003/manager/text</url>
<username>tomcat</username>
<password>tomcat</password>
</configuration>
</plugin>
</plugins>
</build>
第三步:使用maven命令進行部署。
選中taotao-portal-web工程,右鍵 --> Run As --> Maven build…
tomcat7:deploy #部署
tomcat7:redeploy #重新部署
部署的路徑是“/”
會把系統部署到webapps/ROOT目錄下。
部署工程跳過測試
:
clean tomcat7:redeploy -DskipTests
第四步:在Linux下查看toamcat9003的日志
[root@localhost tomcat9003]# tail -f logs/catalina.out
第五步:重新啟動tomcat9003。
第六步:查看dubbo監控中心。
部署完服務層工程taotao-portal-web后,我們到dubbo服務治理
--> 應用頁面
,發現多了兩個應用,分別是taotao-content和taotao-portal-web。說明我們的taotao-portal-web工程部署成功。
3.5.6、其他工程部署
同上 a) 部署taotao-content
和 b) 部署taotao-portal-web
步驟。
注意1:在工程部署之前需要啟動所有的服務:zookeeper、redis、solr、mysql、activemq
注意2:每個工程運行在不同的tomcat上,需要修改tomcat的端口號。
注意3:先部署服務層工程,再部署表現層工程。
注意4:當部署使用到activemq的工程時,需要將原來的pom.xml文件的activemq的依賴配置項修改為新的,如下:
原來的:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
</dependency>
新的:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
</dependency>
如果不修改成新的在部署的時候會報錯,但是在開發使用原來的沒有問題。(這是一個坑
)
部署大致步驟如下:
第一步:修改工程中的服務器的地址都改為192.168.25.133(在所有的jsp和xml中)
第二步:修改所有localhost對應正確的域名
例如:http://localhost:8088 --> http://sso.taotao.com
第三步:修改所有db.properties中的localhost:3306/taotao
為192.168.25.133:3306/taotao
,以及用戶名和密碼。
第四步:如果在數據庫中沒有創建taotao,需要創建一個,再導入數據。
第五步:反向代理配置如下3.6、反向代理的配置
所示:
第六步:測試,需要先將本地hosts切換為如下圖所示配置:

3.6、反向代理的配置
linux系統上的配置:
Linux系統上nginx配置反向代理,反向代理配置的是表現層工程對應的端口
,注意:配置upstream時不要有空格。
[root@localhost conf]# pwd
/usr/local/nginx/conf
[root@localhost conf]# vim nginx.conf
nginx.conf
#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;
upstream manager.taotao.com {
server 192.168.25.133:9001;
}
upstream www.taotao.com {
server 192.168.25.133:9003;
}
upstream search.taotao.com {
server 192.168.25.133:9005;
}
upstream item.taotao.com {
server 192.168.25.133:9006;
}
upstream sso.taotao.com {
server 192.168.25.133:9008;
}
upstream order.taotao.com {
server 192.168.25.133:9010;
}
upstream cart.taotao.com {
server 192.168.25.133:9012;
}
server {
listen 80;
server_name manager.taotao.com;
location / {
proxy_pass http://manager.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name www.taotao.com;
location / {
proxy_pass http://www.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name search.taotao.com;
location / {
proxy_pass http://search.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name item.taotao.com;
location / {
proxy_pass http://item.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name sso.taotao.com;
location / {
proxy_pass http://sso.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name order.taotao.com;
location / {
proxy_pass http://order.taotao.com;
index index.html index.htm;
}
}
server {
listen 80;
server_name cart.taotao.com;
location / {
proxy_pass http://cart.taotao.com;
index index.html index.htm;
}
}
}
注意:修改好之后,需要重新加載(reload)nginx的配置文件
。
開發機器上(windows系統)的配置:
測試時使用域名訪問網站,需要修改本地電腦(windows)hosts
文件。
所有的域名應該指向反向代理服務器nginx
。
配置hosts文件,內容如下:
192.168.25.133 manager.taotao.com
192.168.25.133 www.taotao.com
192.168.25.133 search.taotao.com
192.168.25.133 item.taotao.com
192.168.25.133 sso.taotao.com
192.168.25.133 cart.taotao.com
192.168.25.133 order.taotao.com
我們可以使用一個軟件來配置本地電腦(windows)hosts文件,以管理員身份運行SwitchHosts軟件:

以上都配置好后,我們就可以進行測試訪問。
3.7、數據庫的讀寫分離與分庫分表
項目中:執行查詢的命令要比修改、刪除、這些命令要多的多。所以為了保證數據庫的讀寫性能
和數據庫的完整性
。需要做讀寫分離
。
什么是讀寫分離?
通俗的講就是讀取的命令在一個數據庫中,而寫入的命令在另外一個庫中。兩個庫中的數據必須同步
。
Mysql提供的解決方案:使用binlog進行數據庫同步
。需要配置mysql。
代碼中實現讀寫分類:
1、可以使用aop實現一個切面。動態切換數據源。需要編程實現。
2、使用數據庫中間件實現讀寫分離
,分庫分表
。(學習這個)

什么是分庫分表?
當數據庫的表中數據非常大的時候例如上千萬條數據。查詢性能非常低。可以把一張表數據保存到不同的數據庫中的不同表中。根據經驗
mysql 2000萬以上
和
oracle11G 1億以上
時需要分庫分表。
可以使用一個
數據庫中間件Mycat
。國產開源項目,前身是
cobar項目
。
分庫分表的方式:
垂直拆分:把不同的表放在不同的數據庫中。(可以解決對某一個表頻繁操作的數據庫壓力問題)
水平拆分:把同一張表放在不同的數據庫中。(可以解決數據量大的問題)
4、Mycat的學習
4.1、Mycat的介紹

4.2、什么是Mycat
簡單的說,Mycat就是:
- 一個徹底開源的,面向企業應用開發的“大數據庫集群”
- 支持事務、ACID(4種特新)、可以替代Mysql的加強版數據庫
- 一個可以視為“Mysql”集群的企業級數據庫,用來替代昂貴的Oracle集群
- 一個融合內存緩存技術、Nosql技術、HDFS大數據的新型SQL Server
- 結合傳統數據庫和新型分布式數據倉庫的新一代企業級數據庫產品
- 一個新穎的數據庫中間件產品
Mycat的目標是:低成本的將現有的單機數據庫和應用平滑遷移
到“雲”端,解決數據存儲和業務規模迅速增長情況下的數據瓶頸
問題。
4.3、Mycat的關鍵特性
- 支持 SQL 92標准
- 支持Mysql集群,可以作為Proxy使用
- 支持JDBC連接ORACLE、DB2、SQL Server,將其模擬為MySQL Server使用
- 支持galera for mysql集群,percona-cluster 或者 mariadb cluster,提供高可用性數據分片集群
- 自動故障切換,高可用性
- 支持讀寫分離,支持Mysql雙主多從,以及一主多從的模式
- 支持全局表,數據自動分片到多個節點,用於高效表關聯查詢
- 支持獨有的基於E-R 關系的分片策略,實現了高效的表關聯查詢
- 多平台支持,部署和實施簡單
4.4、Mycat對多數據庫的支持

5、Mycat的下載及安裝
5.1、下載Mycat
官方網站:
http://www.mycat.org.cn/
github地址:
https://github.com/MyCATApache
5.2、環境准備
數據庫准備,准備三個MySQL數據庫實例。
在Linux上安裝一個MySQL數據庫進行模擬,再設置三個數據庫,作為集群中的庫進行使用。
分片規則:

實現這個效果:需要在mycat中做一個配置。
5.3、Mycat安裝
5.3.1、第一步:上傳mycat的文件到linux中

5.3.2、第二步:移動並解壓縮到/usr/local目錄下
[root@localhost ~]# mv Mycat-server-1.4-release-20151019230038-linux.tar.gz /usr/local
[root@localhost ~]# cd /usr/local
[root@localhost local]# tar -zxf Mycat-server-1.4-release-20151019230038-linux.tar.gz
5.3.3、第三步:配置Mycat實現分片
創建3個數據庫實例

查看mycat的conf目錄:
[root@localhost local]# cd /usr/local/mycat/conf
[root@localhost conf]# ll
文件內容詳解如下圖:

配置server.xml,配置的是邏輯庫的名稱和連接該庫的用戶名和密碼
[root@localhost conf]# vim server.xml
配置內容如下:

配置邏輯庫的時候注意:
注意:若是LINUX版本的MYSQL,則需要
設置為MySQL對大小寫不敏感
,否則可能會發生表找不到的問題。
在MySQL的配置文件中/etc/my.cnf 中增加一行代碼:
lower_case_table_names = 1
配置schema.xml,配置的是物理數據庫的節點信息,包括:ip地址、端口、數據庫名稱、分片規則
[root@localhost conf]# vim schema.xml
配置內容如下:

配置rule.xml,配置的是具體的分片規則
[root@localhost conf]# vim rule.xml
配置內容如下:

查找分片算法
配置的分片規則算法,可以參考以下源碼:

源碼位置:Mycat-server-1.4-RELEASE-sources.jar\org\opencloudb\route\function

配置分片算法
根據分片的java代碼,繼續在
rule.xml
配置分片算法
按下圖方式配置分片規則算法:

添加並編輯auto-id.txt文件,可以參考autopartition-long.txt文件
[root@localhost conf]# vim auto-id.txt
文件內容如下:
# K=1000,M=10000
0-127=0
128-255=1
256-511=2
5.4、Mycat測試
5.4.1、第一步:連接mysql數據庫

5.4.2、第二步:創建3個數據庫實例
創建3個數據庫實例,要求和mycat配置的schema.xml中的3個實例名稱一致。

5.4.3.第三步:啟動mycat
啟動命令:./mycat start
停止命令:./mycat stop
重啟命令:./mycat restart
具體操作:
[root@localhost ~]# cd /usr/local/mycat/bin
[root@localhost bin]# ./mycat start
內容如下:

查看啟動日志
[root@localhost logs]# vim wrapper.log
5.4.4、第四步:連接mycat server
注意:可以使用mysql的客戶端直接連接mycat服務。默認服務端口為8066

5.4.5、測試
在mycat中創建數據庫表,發現使用的三個庫都創建了表。
在mycat中插入數據,發現按照規則給三個數據庫分別插入了數據。
6、參考文章
https://blog.csdn.net/u012453843/article/details/73694543
https://blog.csdn.net/u012453843/article/details/73656590