5.1linux整理
虛擬機下linux的安裝與使用
- 1 虛擬機下linux的安裝與使用
- 1.1 安裝虛擬機
- 1.2 啟動虛擬機的linux系統
- 1.3 Xshell與虛擬機鏈接
- 1.3.1 為什么要用Xshell工具
- 1.3.2 Xshell的安裝
- 1.3.3 Xshell的使用
- 2 linux
- 2.1 什么是Linux
- 2.2 常用發行版本
- 2.3 常用命令
- 2.3.1 退出命令行
- 2.3.2 查看IP
- 2.3.3 查看當前目錄文件
- 2.3.4 編輯文件
- 2.3.5 操作目錄
- 2.3.6 查找文件
- 2.3.7 壓縮包及解壓包
- 2.3.8 開放服務器端口
- 2.3.9 用戶添加
- 2.3.10 查看進程
- 2.4 軟件安裝
- 2.4.1 安裝JDK
- 2.4.2 安裝tomcat
- 2.4.3 安裝Nginx
- 1 介紹
- 2 反向代理服務器/負載均衡服務器
- 3 流量限制
- 3.1 根據ip控制速率
- 3.2 控制并發連接數
- 4 靜態資源服務器
- 5 跨域配置
- 5.1 允許全局的跨域
- 5.2 允許指定路徑跨域
- 6 SpringSession
- 1. HttpSession介紹
- 2 SpringSession介紹
- 3 SpringBoot+SpringSession+Redis示例
- 2.4.4 安裝redis
- 1 redis的安裝與基本測試
- 2 redis集群
- 2.1 Linux環境如何搭建Redis集群
- 2.2Redis主從復制的原理
- 2.4.5 安裝mysql
- 2.4.6 安裝Mycat
- 1 主從同步
- 1.1 設置主庫mysql的配置文件
- 1.2 設置從庫mysql的配置文件
- 2 系統切分及解決方案
- 2.1 垂直切分
- 2.2 水平切分
- 2.4.7 安裝solr
- 1 安裝流程
- 2 SpringBoot中的使用
- 2.4.8 yum
- yum常用命令
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 壓縮包及解壓包
| .tar | tar xvf FileName.tar | 解包 | 命令 |
| .tar | tar cvf FileName.tar DirName | 打包 | 命令 |
| .gz | gzip -d FileName.gz | 解包 | 命令 |
| .gz | gzip FileName | 打包 | 命令 |
| .tar.gz | tar zxvf FileName.tar.gz | 解包 | 命令 |
| .tar.gz | tar zcvf FileName.tar.gz DirName | 打包 | 命令 |
| .zip | unzip FileName.zip | 解包 | 命令 |
| .zip | zip 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-path | nginx的進程文件存放目錄 | 命令 |
| –error-log-path | 錯誤日志存放目錄 | 命令 |
| –http-log-path | 請求日志存放目錄 | 命令 |
| module | Nginx中的功能,基本上都是以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綁定在一起。
- 校驗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);//支持安全證書??缬驍y帶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.1password: javasmport: 6379timeout: 3000session: store-type: redis3.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/src | 1. 進入源碼src目錄 | 命令 |
| make | 編譯redis源碼 | 命令 |
| make test | 1. 測試編譯結果 | 命令 |
| 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 javasm | s輸入密碼-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主從復制的常用的幾種方式
-
一主二仆 A(B、C) 一個Master兩個Slave
-
薪火相傳(去中心化)A - B - C ,B既是主節點(C的主節點),又是從節點(A的從節點)
-
反客為主(主節點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)安裝1 | rpm -ivh mysql-community-common-5.7.20-1.el7.x86_64.rpm |
| 安裝2 | rpm -ivh mysql-community-libs-5.7.20-1.el7.x86_64.rpm |
| 安裝3 | rpm -ivh mysql-community-client-5.7.20-1.el7.x86_64.rpm |
| 安裝4 | rpm -ivh mysql-community-server-5.7.20-1.el7.x86_64.rpm |
| 啟動mysql | service mysqld start |
| 查找初始密碼 | vim /var/log/mysqld.log 或 grep password /var/log/mysqld.log |
| 連接mysql | mysql -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配置文件是用來描述邏輯數據庫中的數據節點和讀寫庫配置信息
- 測試Mycat
- bin目錄下Mycat 運行命令
| 啟動 | ./mycat start |
| 停止 | ./mycat stop |
| 重新啟動 | ./mycat restart |
| 查看Mycat運行日志 | tail –f mycat.log |
| 調整日志等級 | 修改log4j2.xml的日志等級為debug |
- 連接命令
| 使用mysql命令登入Mycat | mysql -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操作
| 重啟mysql | service 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操作
| 重啟mysql | service mysqld restart |
| 連接數據庫 | mysql -u root -p [密碼] |
| 執行sql關閉slave | stop slave; |
- 執行下邊指令注意漢字部分需要替換,File和Position的值為配置主庫時復制的信息
- 重新打開slave
| 啟動slave | start 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
- 配置文件
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 包名 |
總結
以上是生活随笔為你收集整理的5.1linux整理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DM8:Linux下实现disql命令上
- 下一篇: 微信小程序如何设置自定义tabBar