一、SUDO,PAM配置規(guī)范說明
SUDO
①sudo執(zhí)行命令的流程
將當(dāng)前用戶切換到超級用戶下,或切換到指定的用戶下,
然后以超級用戶或其指定切換到的用戶身份執(zhí)行命令,執(zhí)行完成后,直接退回到當(dāng)前用戶。
具體工作過程如下:
當(dāng)用戶執(zhí)行sudo時,系統(tǒng)會主動尋找/etc/sudoers文件,判斷該用戶是否有執(zhí)行sudo的權(quán)限
–>確認(rèn)用戶具有可執(zhí)行sudo的權(quán)限后,讓用戶輸入用戶自己的密碼確認(rèn)
–>若密碼輸入成功,則開始執(zhí)行sudo后續(xù)的命令
②不需要輸入密碼的情況
1.root執(zhí)行sudo時不需要輸入密碼(eudoers文件中有配置root ALL=(ALL) ALL這樣一條規(guī)則)
2.欲切換的身份與執(zhí)行者的身份相同,不需要輸入密碼
3./etc/sudoers文件設(shè)置為允許用戶在不輸入該用戶的密碼的情況下使用所有命令
如設(shè)置允許wheel用戶組中的用戶在不輸入該用戶的密碼的情況下使用所有命令
( %wheel ALL=(ALL) NOPASSWD: ALL)
4.授權(quán)格式
用戶 登入主機(jī)=(代表用戶) 命令
user host=(runas) command
③實(shí)際案例演示
實(shí)例1:讓普通用戶test具有/etc/init.d/nagios腳本重啟的權(quán)限,可以在/etc/sudoers添加如下設(shè)置:
test ALL=NOPASSWD:/etc/init.d/nagios restart
PAM
①PAM介紹
Linux下可擴(kuò)展的鑒權(quán)模塊,用戶進(jìn)程服務(wù)某服務(wù)進(jìn)程,服務(wù)進(jìn)程先把請求送到PAM模塊進(jìn)行鑒權(quán),PAM根據(jù)服務(wù)名從/etc/pam.d/目錄選擇一個服務(wù)文件,根據(jù)服務(wù)文件的配置內(nèi)容進(jìn)行鑒權(quán)。
②PAM查看命令
通過ldd命令查看服務(wù)名,確定服務(wù)是否使用pam功能(pam服務(wù)對應(yīng)libpam*.so庫文件):
ldd /usr/sbin/sshd
linux-vdso.so.1 => (0x00007fff1b8ef000)
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f579f2d8000)
libpam.so.0 => /lib64/libpam.so.0 (0x00007f579f0cb000)
③Linux系統(tǒng)PAM配置
/lib/security目錄存放pam模塊文件
pam_access.so 控制訪問者地址與賬號名稱
pam_listfile.so 控制訪問者的賬號名稱或登錄位置
pam_limits.so 控制為用戶分配的資源
pam_rootok.so 對管理員(uid=0)無條件允許通過
pam_userdb.so 設(shè)定獨(dú)立用戶賬號數(shù)據(jù)庫認(rèn)證
etc/pam.d目錄存放使用pam的服務(wù)名
ogin -------/etc/pam.d/login
ipop3d -------/etc/pam.d/pop
vsftpd -------/etc/pam.d/ftp(編譯安裝)或/etc/pam.d/vsftpd(rpm安裝)
sshd -------/etc/pam.d/sshd
su -------/etc/pam.d/su
/etc/security/目錄存放pam認(rèn)證、鑒權(quán)時使用的配置文件,如limits.conf
通過配置文件增改刪進(jìn)程的鑒權(quán)規(guī)則,下面介紹兩個常用的pam模塊
pam_access.so模塊的使用―――控制訪問sshd服務(wù)的主機(jī)和用戶
1.修改需使用這個模塊的服務(wù)文件/etc/pam.d/sshd
添加 account required pam_access.so
2.修改模塊的配置文件 /etc/security/access.conf
redhat : ALL EXCEPT 192.168.0. (ip為192.168.0.X的redhat機(jī)器無權(quán)訪問)
結(jié)果:ip為192.168.0.X的redhat機(jī)器執(zhí)行ssh時,無法登錄該機(jī)器。
pam_limits.so 模式使用
1.模塊應(yīng)用到sshd服務(wù),修改服務(wù)文件
vi /etc/pam.d/sshd 添加:
session required pam_limits.so
session控制用戶進(jìn)程的登錄次數(shù),文件大小,通過控制用戶的會話進(jìn)程來限制用戶使用的資源。
2.編緝pam_limits.so的配置文件/etc/security/limits.conf
hard nofile 65536soft nofile 65535
任意用戶進(jìn)程的句柄上限都是65535。
二、chrony搭建私有ntp服務(wù)
搭建環(huán)境
服務(wù)器:192.168.217.132
客戶端:192.168.217.131
服務(wù)器端配置
1、首先本機(jī)查看是或否有chrony軟件,沒有的話安裝
[root@Rocky8-132 ~]#rpm -q chrony && > /dev/null || yum -y install chrony
chrony-4.1-1.el8.x86_64
2、編輯配置文件
[root@Rocky8-132 ~]#vim /etc/chrony.conf
#pool 2.pool.ntp.org iburst #注釋掉自帶的
server ntp.aliyun.com iburst #和阿里云的服務(wù)器同步
server time1.cloud.tencent.com iburst #和騰訊云同步
# Allow NTP client access from local network.
#allow 192.168.0.0/16
allow 192.168.217.0/24 #加上這一行,指定允許同步的網(wǎng)段
# Serve time even if not synchronized to a time source.
#local stratum 10 #將這一行的注釋去掉。表示互聯(lián)網(wǎng)無法連接時,仍然可以為客戶端提供時間同步
3、重啟chronyd服務(wù)
[root@Rocky8-132 ~]#systemctl restart chronyd.service
4、查看服務(wù)端的監(jiān)聽端口123是否開啟
[root@Rocky8-132 ~]#ss -nlu
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
客戶端配置
1、編輯配置文件
[root@Rocky8-131 ~]#vim /etc/chrony.conf
#注釋點(diǎn)默認(rèn)服務(wù)器,添加上之前設(shè)置好的時間服務(wù)器
#pool 2.pool.ntp.org iburst
server 192.168.217.132 iburst
2、重啟chronyd服務(wù)
[root@Rocky8-131 ~]#systemctl restart chronyd.service
3.查看服務(wù)日志
[root@Rocky8-131 ~]#systemctl status chronyd.service
...
Dec 05 21:35:08 Rocky8-131 chronyd[2216]: Selected source 192.168.217.132
...
三、CDN原理
要理解 CDN 這件事情,我們就得先理解瀏覽器發(fā)出一個請求的過程是怎樣的,其整體過程如下。
瀏覽器網(wǎng)絡(luò)請求過程
用戶在瀏覽器中輸入要訪問的網(wǎng)址域名。
瀏覽器向本地 DNS 服務(wù)器請求對域名的解析。
如果本地 DNS 服務(wù)器有域名的解析結(jié)果,那么直接響應(yīng)用戶請求,返回該域名對應(yīng)的 IP 地址。
如果本地 DNS 服務(wù)器沒有域名的解析結(jié)果,那么則會遞歸地向 DNS 系統(tǒng)請求解析,隨后將該結(jié)果返回給用戶。
瀏覽器得到域名解析結(jié)果后,其實(shí)也就是域名對應(yīng)的 IP 地址。
隨后瀏覽器向服務(wù)器請求內(nèi)容。
服務(wù)器將用戶請求內(nèi)容返回給瀏覽器。
通過這么復(fù)雜的步驟,用戶就可以看到頁面內(nèi)容了。但實(shí)際上,在第 6、7 這兩步的時候,其中間也經(jīng)過了非常復(fù)雜的過程。為了更清晰地表述,我們可以將這個過程分為 3 個主要節(jié)點(diǎn)。
服務(wù)器數(shù)據(jù)傳輸過程
網(wǎng)站服務(wù)器通過公網(wǎng)出口,再通過長途骨干網(wǎng),最后通過用戶的寬帶廣貓到達(dá)用戶所在的局域網(wǎng),最終才到達(dá)用戶電腦的瀏覽器。
其中長途骨干網(wǎng)的傳輸是最為耗時的,它需要經(jīng)過網(wǎng)站服務(wù)器所在的機(jī)房、骨干網(wǎng)、用戶所在城域網(wǎng)、用戶所在接入網(wǎng)等,其物理傳輸距離非常遙遠(yuǎn)。
在這種情況下,如果傳輸?shù)臄?shù)據(jù)非常多,訪問的用戶特別大,那么就會出現(xiàn)很長的延時,影響用戶體驗。同時,每請求一次數(shù)據(jù)都需要經(jīng)過漫長的數(shù)據(jù)傳輸,對于長途骨干網(wǎng)來說,都是一次負(fù)擔(dān)。
剛剛說的這個場景,很形象的一個例子是春節(jié)搶票的場景。當(dāng)我們春節(jié)搶票時,我們都會登陸 12306 網(wǎng)站,網(wǎng)站上肯定有不少圖片資源。這時候可能同時會有 1 個億的人,同時去請求一張一模一樣的圖片。
這時候如果我們都按照上面的過程去請求一次圖片數(shù)據(jù),那么將會產(chǎn)生 1 億次的網(wǎng)絡(luò)數(shù)據(jù)傳輸,這對于我們整個國家的互聯(lián)網(wǎng)基礎(chǔ)設(shè)施是個災(zāi)難??!
但事實(shí)情況是:12306 貌似也沒有掛掉呀!
那么他們是如何解決這個問題呢?答案就是:CDN!
什么是 CDN ?
其實(shí) CDN 就是內(nèi)容分發(fā)網(wǎng)絡(luò)的意思,其英文全稱為 Content Delivery Network。簡單地說,CDN 可以提前把數(shù)據(jù)存在離用戶最近的數(shù)據(jù)節(jié)點(diǎn),從而避免長途跋涉經(jīng)過長途骨干網(wǎng),最終達(dá)到減少骨干網(wǎng)負(fù)擔(dān)、提高訪問速度的目的。
按照我們上面的場景,如果沒有 CDN 的話,每次請求都需要從網(wǎng)站服務(wù)器經(jīng)過公網(wǎng)出口、長途骨干網(wǎng)、用戶接入局域網(wǎng),最終到達(dá)瀏覽器。但是當(dāng)有了 CDN 之后,瀏覽器請求圖片數(shù)據(jù)時,會先去 CDN 緩存服務(wù)器獲取。如果獲取到數(shù)據(jù),那么就直接返回。否則才會經(jīng)過長途骨干網(wǎng),最終到達(dá)網(wǎng)站服務(wù)器獲取圖片數(shù)據(jù)。那么只要我們提前在 CDN 緩存服務(wù)器上傳圖片,那么我們就可以極大地減少網(wǎng)絡(luò)流量,同時減少網(wǎng)絡(luò)延遲。
從上述我們可能會覺得:這不就是在長途骨干網(wǎng)和用戶局域網(wǎng)中間,加了一個服務(wù)器嘛。但事實(shí)上可并不是這樣,CDN 其實(shí)還縮短了請求數(shù)據(jù)的距離。
我們知道用戶所處的位置可能是全國各地,為了盡可能地減少網(wǎng)絡(luò)傳輸?shù)难訒r,一般都會在離用戶較近的地方設(shè)置 CDN 緩存服務(wù)器,例如:在華南、華北、華東、西南設(shè)置一個主 CDN 服務(wù)器,這樣各個地區(qū)的用戶就可以直接請求對應(yīng)的 CDN 服務(wù)器,而不需要來回跑大半個中國,極大地提高了效率!
因此,當(dāng)我們說內(nèi)容分發(fā)網(wǎng)絡(luò)的時候,腦海里應(yīng)該有如下這樣一張圖片:遍布全國各地的 CDN 緩存服務(wù)器,組成了我們的內(nèi)容分發(fā)網(wǎng)絡(luò)。****每次用戶請求都會到離他最近的 CDN 服務(wù)器請求數(shù)據(jù),從而極大地提高訪問速度。
CDN 工作原理
到了這里,相信大家都知道 CDN 是什么了。但實(shí)際上 CDN 是如何與 DNS 結(jié)合起來的,這里面還是有點(diǎn)復(fù)雜的。加入了 CDN 之后,瀏覽器的網(wǎng)絡(luò)請求就變成如下圖所示的情況。

CDN 基本工作過程
瀏覽器發(fā)起圖片 URL 請求,經(jīng)過本地 DNS 解析,會將域名解析權(quán)交給域名 CNAME 指向的 CDN 專用 DNS 服務(wù)器。
CDN 的 DNS 服務(wù)器將 CDN 的全局負(fù)載均衡設(shè)備 IP 地址返回給瀏覽器。
瀏覽器向 CDN 全局負(fù)載均衡設(shè)備發(fā)起 URL 請求。
CDN 全局負(fù)載均衡設(shè)備根據(jù)用戶 IP 地址,以及用戶請求的 URL,選擇一臺用戶所屬區(qū)域的區(qū)域負(fù)載均衡設(shè)備,向其發(fā)起請求。
區(qū)域負(fù)載均衡設(shè)備會為用戶選擇最合適的 CDN 緩存服務(wù)器(考慮的依據(jù)包括:服務(wù)器負(fù)載情況,距離用戶的距離等),并返回給全局負(fù)載均衡設(shè)備。
全局負(fù)載均衡設(shè)備將選中的 CDN 緩存服務(wù)器 IP 地址返回給用戶。
用戶向 CDN 緩存服務(wù)器發(fā)起請求,緩存服務(wù)器響應(yīng)用戶請求,最終將用戶所需要偶的內(nèi)容返回給瀏覽器。
使用 CDN 服務(wù)的網(wǎng)站,只需要將域名解析權(quán)交給 CDN 服務(wù)商,接著將需要分發(fā)的內(nèi)容上傳到 CDN,就可以實(shí)現(xiàn)內(nèi)容加速了!
四、搭建智能DNS,實(shí)現(xiàn)不同地域客戶端解析到不同主機(jī)
實(shí)驗環(huán)境
DNS主服務(wù)器: 192.168.217.135,10.0.0.5
web服務(wù)器bj:192.168.217.133
web服務(wù)器sh:10.0.0.2
DNS客戶端: 192.168.217.134, 10.0.0.4
五、DNS解析流程
什么是DNS
官方解釋:DNS(Domain Name System,域名系統(tǒng)),因特網(wǎng)上作為域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使用戶更方便的訪問互聯(lián)網(wǎng),而不用去記住能夠被機(jī)器直接讀取的IP數(shù)串。
通過主機(jī)名,最終得到該主機(jī)名對應(yīng)的IP地址的過程叫做域名解析(或主機(jī)名解析)。
通俗的講,我們更習(xí)慣于記住一個網(wǎng)站的名字,比如www.baidu.com,而不是記住它的ip地址,比如:167.23.10.2。
由此可見,DNS 在日常生活中多么重要。每個人上網(wǎng),都需要訪問它,但是同時,這對它來講也是非常大的挑戰(zhàn)。一旦它出了故障,整個互聯(lián)網(wǎng)都將癱瘓。另外,上網(wǎng)的人分布在全世界各地,如果大家都去同一個地方訪問某一臺服務(wù)器,時延將會非常大。因而,DNS 服務(wù)器,一定要設(shè)置成高可用、高并發(fā)和分布式的。
于是,就有了這樣樹狀的層次結(jié)構(gòu)。

- 根 DNS 服務(wù)器 :返回頂級域 DNS 服務(wù)器的 IP 地址
- 頂級域 DNS 服務(wù)器:返回權(quán)威 DNS 服務(wù)器的 IP 地址
- 權(quán)威 DNS 服務(wù)器 :返回相應(yīng)主機(jī)的 IP 地址
接著讓我們來了解一下域名的結(jié)構(gòu):

DNS 解析流程
為了提高 DNS 的解析性能,很多網(wǎng)絡(luò)都會就近部署 DNS 緩存服務(wù)器。于是,就有了以下的 DNS 解析流程。
電腦先查詢自身的本地DNS緩存,若未查到接著向下查詢。

電腦客戶端會發(fā)出一個 DNS 請求,問 www.baidu.com 的 IP 是啥啊,并發(fā)給本地域名服務(wù)器 (本地DNS)。那本地域名服務(wù)器 (本地 DNS) 是什么呢?如果是通過 DHCP 配置,本地 DNS 由你的網(wǎng)絡(luò)服務(wù)商(ISP),如電信、移動等自動分配,它通常就在你網(wǎng)絡(luò)服務(wù)商的某個機(jī)房。
本地 DNS 收到來自客戶端的請求。你可以想象這臺服務(wù)器上緩存了一張域名與之對應(yīng) IP 地址的大表格。如果能找到 www.baidu.com,它直接就返回 IP 地址。如果沒有,本地 DNS 會去問它的根域名服務(wù)器。根域名服務(wù)器是最高層次的,全球共有 13 套。它不直接用于域名解析,但能指明一條道路。
根 DNS 收到來自本地 DNS 的請求,發(fā)現(xiàn)后綴是 .com,說:“哦, www.baidu.com 啊,這個域名是由.com 區(qū)域管理,我給你它的頂級域名服務(wù)器的地址,你去問問它吧?!?/p>
本地 DNS 轉(zhuǎn)向問頂級域名服務(wù)器:“老二,你能告訴我 www.baidu.com 的 IP 地址嗎?”頂級域名服務(wù)器就是大名鼎鼎的比如 .com、.net、 .org 這些一級域名,它負(fù)責(zé)管理二級域名,比如baidu.com,所以它能提供一條更清晰的方向。
頂級域名服務(wù)器會給你負(fù)責(zé) www.baidu.com 區(qū)域的權(quán)威 DNS 服務(wù)器的地址,讓你去那里問。
本地 DNS 轉(zhuǎn)向問權(quán)威 DNS 服務(wù)器:“您好, www.baidu.com 對應(yīng)的 IP 是啥呀?”baidu.com 的權(quán)威 DNS 服務(wù)器,它是域名解析結(jié)果的原出處。為啥叫權(quán)威呢?就是我的域名我做主。
權(quán)威 DNS 服務(wù)器查詢后將對應(yīng)的 IP 地址 X.X.X.X 告訴本地 DNS。
本地 DNS 再將 IP 地址返回客戶端,客戶端和目標(biāo)建立連接。
至此DNS的解析流程便結(jié)束了。
六、iptables 5表5鏈解釋
五鏈(chain):
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
-
PREROUTING:前置路由檢查(包含:nat,mangle,raw)數(shù)據(jù)包在進(jìn)行路由決策前的規(guī)則,一般用于改變數(shù)據(jù)包的目標(biāo)地址 -
INPUT:進(jìn)內(nèi)核(包含:filter,mangle) 數(shù)據(jù)包經(jīng)由路由決策后,進(jìn)入本機(jī)處理之前應(yīng)用的規(guī)則,一般用于本機(jī)進(jìn)程處理的數(shù)據(jù)包(數(shù)據(jù)包本機(jī)處理) -
OUTPUT: 出內(nèi)核(包含:filter,nat,mangle,raw) 從本機(jī)輸出時應(yīng)用的規(guī)則,一般用于本機(jī)處理后的數(shù)據(jù)包(數(shù)據(jù)包本機(jī)發(fā)出) -
FORWARD: 轉(zhuǎn)發(fā)(包含:filter,mangle) 數(shù)據(jù)包經(jīng)由路由決策后,本機(jī)不做處理,僅僅是轉(zhuǎn)發(fā)數(shù)據(jù)包時應(yīng)用的規(guī)則(數(shù)據(jù)包本機(jī)轉(zhuǎn)發(fā)) -
POSTROUTING: 后置路由檢查(包含:nat,mangle,raw)數(shù)據(jù)包從本機(jī)出去前,對數(shù)據(jù)包應(yīng)用的規(guī)則,一般用于更改數(shù)據(jù)包的原地址信息
五表(table):
security -->raw-->mangle-->nat-->filter
-
filter:過濾規(guī)則表,根據(jù)預(yù)定義的規(guī)則過濾符合條件的數(shù)據(jù)包,默認(rèn)表 -
nat:network address translation 地址轉(zhuǎn)換規(guī)則表。主要實(shí)現(xiàn)網(wǎng)絡(luò)地址轉(zhuǎn)換的表。可以自由轉(zhuǎn)換數(shù)據(jù)報文中的ip和port -
mangle:修改數(shù)據(jù)標(biāo)記位規(guī)則表,主要實(shí)現(xiàn)數(shù)據(jù)包的而拆分-修改-封裝。 -
raw:關(guān)閉啟用的連接跟蹤機(jī)制(關(guān)閉nat表的追蹤功能),加快封包穿越防火墻速度。 -
security:用于強(qiáng)制訪問控制(MAC)網(wǎng)絡(luò)規(guī)則,由Linux安全模塊(如SELinux)實(shí)現(xiàn)。主要針對的是數(shù)據(jù)鏈路層的管理規(guī)則組合
三種報文流向
流入本機(jī):PREROUTING --> INPUT–>用戶空間進(jìn)程
流出本機(jī):用戶空間進(jìn)程 -->OUTPUT–> POSTROUTING
轉(zhuǎn)發(fā):PREROUTING --> FORWARD --> POSTROUTING
iptables練習(xí)
5000-6000端口僅192.168.0.0/24網(wǎng)段內(nèi)的主機(jī)訪問
1.iptables實(shí)現(xiàn)
[root@Rocky8 ~]#iptables -A INPUT -s 192.168.0.0/24 -p tcp --dport 5000:6000 -j ACCEPT
[root@Rocky8 ~]#iptables -vnL Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 192.168.0.0/24 0.0.0.0/0 tcp dpts:5000:6000
2 firewalld實(shí)現(xiàn)
[root@Rocky8 ~]#firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.0/24 port protocol=tcp port=5000-6000 accept'
success
[root@Rocky8 ~]#firewall-cmd --reload
success
3.nftable實(shí)現(xiàn)
#創(chuàng)建表
[root@Rocky8 ~]#nft add table inet test_table
#創(chuàng)建鏈
[root@Rocky8 ~]#nft add chain inet test_table test_filter_input_chain { type filter hook input priority 0 \; }
#添加規(guī)則
[root@Rocky8 ~]#nft add rule inet test_table test_filter_input_chain ip saddr 192.168.0.0/24 tcp dport {5000-6000} accept
七、mysql的各發(fā)行版有哪些
①常見發(fā)行版本:
1、MySQL官方版本(分為社區(qū)版和企業(yè)版)
企業(yè)版性能略強(qiáng),提供了更多的功能和工具
2、Percona MySQL
Percona是由MySQL最初開發(fā)者組成的一個社區(qū),Percona MySQL是基于官方社區(qū)版本二次開發(fā)的,在MySQL官方社區(qū)版的基礎(chǔ)上增加了一些MySQL官方企業(yè)版才有的功能,同時對官方社區(qū)版進(jìn)行了一些優(yōu)化,從目前公布的數(shù)據(jù)來看,Percona MySQL 性能是要優(yōu)于MySQL官方社區(qū)版的。
Percona MySQL 下載地址:https://www.percona.com/downloads/Percona-Server-LATEST/
3、MariaDB
MariaDB是由MySQL初始創(chuàng)建者在MySQL被Oracle收購之后,又獨(dú)立成立了一家公司,來開發(fā)的數(shù)據(jù)庫。
其以MySQL5.5源代碼為基礎(chǔ),發(fā)展起來。
MariaDB并不能完全和MySQL官方版完全兼容,但大多數(shù)功能是兼容的。
我們可以很容易的將數(shù)據(jù)從MySQL遷移到MariaDB上。
MariaDB 下載地址:https://downloads.mariadb.org/
②各個發(fā)行版之間的區(qū)別及優(yōu)缺點(diǎn)
1、基礎(chǔ)對比
| MySQL | Percona MySQL | MariaDB | |
|---|---|---|---|
| 是否開源 | 開源 | 開源 | 開源 |
| 事務(wù)型存儲引擎 | InnoDB | XtraDB | XtraDB |
| 監(jiān)控工具 | 企業(yè)版監(jiān)控工具,社區(qū)版不提供 | Percona Monitor工具 | Monyog |
說明:
InnoDB屬于Oracle公司,不對外提供,因此對于事務(wù)型存儲引擎,Percona MySQL 和 MariaDB使用的都是由percona公司開發(fā)的XtraDB,XtraDB和InnoDB完全兼容。
對于監(jiān)控工具來說,盡管MySQL社區(qū)版不提供監(jiān)控工具,但使用Percona Monitor工具 或 Monyog都可以實(shí)現(xiàn)對MySQL社區(qū)版的數(shù)據(jù)監(jiān)控。
2、高可用對比
| MySQL | Percona MySQL | MariaDB | |
|---|---|---|---|
| 基于日志點(diǎn)復(fù)制 | 支持 | 支持 | 支持 |
| 基于Gtid復(fù)制 | 支持 | 支持 | 基于gtid復(fù)制 |
| 高可用集群方案 | Replication | Replication、PXC | Galera Cluster |
| 數(shù)據(jù)庫中間件 | MySQL Router | Proxy SQL | MaxScale |
說明:
基于Gtid復(fù)制方面,MySQL和Percona MySQL都支持,MariaDB雖然也支持,但MariaDB的gtid和MySQL不兼容,因為生成規(guī)則和MySQL官方版不同。
數(shù)據(jù)庫中間件方面,它們功能是類似的,都是通用的,都是作為和mycat類似的數(shù)據(jù)庫中間件。但值得注意的是,MaxScale對MySQL5.6及以前版本有很好的的支持,但對5.6版本以后的版本支持并不好。
3、安全性對比
| MySQL | Percona MySQL | MariaDB | |
|---|---|---|---|
| 防火墻 | 企業(yè)版提供 | ProxySQL FireWall | MaxScale FireWall |
| 用戶審計功能 | 企業(yè)版提供 | 審計日志 | 審計日志 |
| 密碼加密方面 | 用戶密碼生命周期 | 用戶密碼生命周期 | — |
| 加密方式 | sha256_password caching_sha2_password | sha256_password caching_sha2_password | ed25519_sha256 password |
說明:
防火墻方面:MySQL社區(qū)版是沒有這個概念的,MySQL只在企業(yè)版提供防火墻功能。Percona MySQL 和 MariaDB都是通過其數(shù)據(jù)庫中間層產(chǎn)品來間接提供防火墻功能。但值得一提的是,MariaDB的MaxScale FireWall 并不是開源的。
用戶審計方面:MySQL并沒有在社區(qū)版提供該功能,只在企業(yè)版提供。Percona MySQL和MariaDB都是以插件的方式提供了審計日志功能。對用戶的行為進(jìn)行審核和監(jiān)控。
用戶密碼方面:安全性方面重點(diǎn)在于用戶密碼是否安全,密碼是否很容易被暴力破解,MySQL在8.0版本中,在安全特性上有了很大的提升,不僅可以限制用戶密碼的復(fù)雜度,同時可以對密碼的生命周期進(jìn)行控制,來限制密碼重復(fù)使用的歷史次數(shù)。并且升級了其默認(rèn)的密碼加密方法,用caching_sha2_password 插件,不僅提高了密碼加密的速度,同時可以保證同一密碼每次生成的加密串是不同的,大大降低了通過占庫對密碼進(jìn)行破解的可能性。
該功能目前在MySQL官方版和Percona MySQL中都可以看到,但目前MariaDB還未提供該功能。
八、MySQL索引的作用
在mysql中,索引可以用來快速查詢數(shù)據(jù)表中有某一特定值的記錄,大大加快數(shù)據(jù)的查詢速度;在列上創(chuàng)建了索引之后,查找數(shù)據(jù)時可以直接根據(jù)該列上的索引找到對應(yīng)記錄行的位置,從而快捷地查找到數(shù)據(jù)。如果表中查詢的列有一個索引,MySQL就能快速到達(dá)一個位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),這樣將會節(jié)省很大一部分時間;且通過創(chuàng)建唯一索引可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
為什么要使用索引
索引就是根據(jù)表中的一列或若干列按照一定順序建立的列值與記錄行之間的對應(yīng)關(guān)系表,實(shí)質(zhì)上是一張描述索引列的列值與原表中記錄行之間一 一對應(yīng)關(guān)系的有序表。
索引是 MySQL 中十分重要的數(shù)據(jù)庫對象,是數(shù)據(jù)庫性能調(diào)優(yōu)技術(shù)的基礎(chǔ),常用于實(shí)現(xiàn)數(shù)據(jù)的快速檢索。
在 MySQL 中,通常有以下兩種方式訪問數(shù)據(jù)庫表的行數(shù)據(jù):
1) 順序訪問
順序訪問是在表中實(shí)行全表掃描,從頭到尾逐行遍歷,直到在無序的行數(shù)據(jù)中找到符合條件的目標(biāo)數(shù)據(jù)。
順序訪問實(shí)現(xiàn)比較簡單,但是當(dāng)表中有大量數(shù)據(jù)的時候,效率非常低下。例如,在幾千萬條數(shù)據(jù)中查找少量的數(shù)據(jù)時,使用順序訪問方式將會遍歷所有的數(shù)據(jù),花費(fèi)大量的時間,顯然會影響數(shù)據(jù)庫的處理性能。
2) 索引訪問
索引訪問是通過遍歷索引來直接訪問表中記錄行的方式。
使用這種方式的前提是對表建立一個索引,在列上創(chuàng)建了索引之后,查找數(shù)據(jù)時可以直接根據(jù)該列上的索引找到對應(yīng)記錄行的位置,從而快捷地查找到數(shù)據(jù)。索引存儲了指定列數(shù)據(jù)值的指針,根據(jù)指定的排序順序?qū)@些指針排序。
例如,在學(xué)生基本信息表 tb_students 中,如果基于 student_id 建立了索引,系統(tǒng)就建立了一張索引列到實(shí)際記錄的映射表。當(dāng)用戶需要查找 student_id 為 12022 的數(shù)據(jù)的時候,系統(tǒng)先在 student_id 索引上找到該記錄,然后通過映射表直接找到數(shù)據(jù)行,并且返回該行數(shù)據(jù)。因為掃描索引的速度一般遠(yuǎn)遠(yuǎn)大于掃描實(shí)際數(shù)據(jù)行的速度,所以采用索引的方式可以大大提高數(shù)據(jù)庫的工作效率。
簡而言之,不使用索引,MySQL 就必須從第一條記錄開始讀完整個表,直到找出相關(guān)的行。表越大,查詢數(shù)據(jù)所花費(fèi)的時間就越多。如果表中查詢的列有一個索引,MySQL 就能快速到達(dá)一個位置去搜索數(shù)據(jù)文件,而不必查看所有數(shù)據(jù),這樣將會節(jié)省很大一部分時間。
索引的優(yōu)點(diǎn)如下:
通過創(chuàng)建唯一索引可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
可以給所有的 MySQL 列類型設(shè)置索引。
可以降低服務(wù)需要掃描的數(shù)據(jù)量,減少了IO次數(shù),大大加快數(shù)據(jù)的查詢速度,這是使用索引最主要的原因。
在實(shí)現(xiàn)數(shù)據(jù)的參考完整性方面可以加速表與表之間的連接。
在使用分組和排序子句進(jìn)行數(shù)據(jù)查詢時也可以顯著減少查詢中分組和排序的時間
注:索引可以提高查詢速度,但是會影響插入記錄的速度。因為,向有索引的表中插入記錄時,數(shù)據(jù)庫系統(tǒng)會按照索引進(jìn)行排序,這樣就降低了插入記錄的速度,插入大量記錄時的速度影響會更加明顯。這種情況下,最好的辦法是先刪除表中的索引,然后插入數(shù)據(jù),插入完成后,再創(chuàng)建索引。
九、MySQL btree索引的原理
B-Tree結(jié)構(gòu)的數(shù)據(jù)可以讓系統(tǒng)高效的找到數(shù)據(jù)所在的磁盤塊。為了描述B-Tree,首先定義一條記錄為一個二元組[key, data] ,key為記錄的鍵值,對應(yīng)表中的主鍵值,data為一行記錄中除主鍵外的數(shù)據(jù)。對于不同的記錄,key值互不相同。

檢索原理:首先從根節(jié)點(diǎn)進(jìn)行二分查找,如果找到則返回對應(yīng)節(jié)點(diǎn)的data,否則對相應(yīng)區(qū)間的指針指向的節(jié)點(diǎn)遞歸進(jìn)行查找,直到找到節(jié)點(diǎn)或未找到節(jié)點(diǎn)返回null指針。(存放數(shù)據(jù)記錄越少樹越高,高IO次數(shù)多,效率越低)
面試題: InnoDB中一顆的B+樹可以存放多少行數(shù)據(jù)?
假設(shè)定義一顆B+樹高度為2,即一個根節(jié)點(diǎn)和若干葉子節(jié)點(diǎn)。那么這棵B+樹的存放總行記錄數(shù)=根節(jié)點(diǎn)指針數(shù) * 單個葉子記錄的行數(shù)。這里先計算葉子節(jié)點(diǎn),B+樹中的單個葉子節(jié)點(diǎn)的大小為16K,假設(shè)每一條目為1K,那么 記錄數(shù)即為16(16k/1K=16),然后計算非葉子節(jié)點(diǎn)能夠存放多少個指針,假設(shè)主鍵ID為bigint類型,那么長 度為8字節(jié),而指針大小在InnoDB中是設(shè)置為6個字節(jié),這樣加起來一共是14個字節(jié)。那么通過頁大小/(主鍵ID大小+指針大小),即16384/14=1170個指針,所以一顆高度為2的B+樹能存放16 * 1170=18720條這樣的 記錄。根據(jù)這個原理就可以算出一顆高度為3的B+樹可以存放16 * 1170 * 1170=21902400條記錄。所以在InnoDB中B+樹高度一般為2-3層,它就能滿足千萬級的數(shù)據(jù)存儲
十、MySQL安全加固
1、MySQL 安全防護(hù)
一、配置添加新用戶密碼復(fù)雜度檢查
二、配置密碼過期策略
三、MySQL數(shù)據(jù)庫限制多次登錄失敗重試時間
一、配置密碼復(fù)雜度檢查
1.mysql 5.7.15版本好像默認(rèn)啟用了密碼復(fù)雜度設(shè)置,插件名字叫做 validate_password
mysql>>INSTALL PLUGIN validate_password SONAME 'validate_password.so';
2、加上/etc/my.cnf配置
[mysqld]
plugin-load=validate_password.so
validate_password_policy=2
# 0 or LOW 僅需需符合密碼長度
# 1 or MEDIUM 滿足LOW策略,同時還需滿足至少有1個數(shù)字,小寫字母,大寫字母和特殊字符
# 2 or STRONG 滿足MEDIUM策略,同時密碼不能存在字典文件(dictionary file)中
validate-password=FORCE_PLUS_PERMANENT
二、配置密碼定期更換
定期更換口令策略:由于定期修改密碼,會涉及到應(yīng)用一塊更改,涉及到應(yīng)用重啟,不建議定期修改密碼。
1、在/etc/my.cnf配置文件中增加
[mysqld]
default_password_lifetime=90 # 90天過期
三、MySQL數(shù)據(jù)庫限制多次登錄失敗重試時間
需求:
如果連續(xù)5次輸入密碼錯誤,限制登錄數(shù)據(jù)庫30分鐘 --次數(shù)和限制時間可以根據(jù)實(shí)際變更
解決方法(通過MySQL插件控制)
1、登錄數(shù)據(jù)庫,安裝插件(CONNECTION_CONTROL和CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS)
mysql -uroot -p
install plugin CONNECTION_CONTROL soname 'connection_control.so';
install plugin CONNECTION_CONTROL_FAILED_LOGIN_ATTEMPTS soname 'connection_control.so';
2、查看所有已安裝的插件
show plugins;
3、按需修改配置文件(/etc/my.cnf)
vim /etc/my.cnf
添加如下兩行配置:
connection-control-failed-connections-threshold=5 #登陸失敗次數(shù)限制
connection-control-min-connection-delay=1800000 #限制重試時間,此處為毫秒,注意按需求換算
4、重新登錄數(shù)據(jù)庫,查看配置是否生效
service mysqld restart 或 service mysql restart
mysql -uroot -p
show variables like '%connection_control%';
5、驗證
輸錯5次密碼后,會發(fā)現(xiàn)第6次登錄會卡住,限制登錄,時間為設(shè)定的限制時間30分鐘
2、MySQL服務(wù)安全加固
轉(zhuǎn)載來源 : https://help.aliyun.com/knowledge_detail/49568.html
介紹
數(shù)據(jù)庫管理人員可以參考本文檔進(jìn)行 MySQL 數(shù)據(jù)庫系統(tǒng)的安全配置加固,提高數(shù)據(jù)庫的安全性,確保數(shù)據(jù)庫服務(wù)穩(wěn)定、安全、可靠地運(yùn)行。
漏洞發(fā)現(xiàn)
您可以使用安騎士企業(yè)版自動檢測您的服務(wù)器上是否存在 MySQL 漏洞問題,或者您也可以自己排查您服務(wù)器上的 MySQL 服務(wù)是否存在安全問題。
判斷Mysql數(shù)據(jù)庫版本
nmap的指紋識別可以精確的判斷數(shù)據(jù)庫的版本號,通過telnet來判斷是否支持遠(yuǎn)程連接(telnet 192.168.0.88 3306)。當(dāng)連接成功后會顯示Mysql版本號,然后可以利用hydra來探測是否存在弱口令。
hydra -L user.txt -P pass.txt -o savessh.log -f -vV -e ns 192.168.0.88 mysql
InnoDB并發(fā)調(diào)優(yōu)
解決InnoDB高并發(fā)條件性能下降快,就是限制并發(fā)。SHOW INNODB STATUS輸出中的SEMAPHORES部分來確認(rèn)是否發(fā)生了并發(fā)問題,
并發(fā) = CPU的數(shù)量 x 磁盤的數(shù)量 x 2
安全加固
1、帳號安全
正確設(shè)置目錄權(quán)限:
設(shè)置目錄權(quán)限的原則是軟件和數(shù)據(jù)分開,具體如下:
- 將 mysql 安裝在單獨(dú)的用戶下
- 安裝時,以 root 用戶進(jìn)行安裝,mysql 的軟件默認(rèn)都為 root 權(quán)限
- 安裝完畢后,將數(shù)據(jù)目錄權(quán)限設(shè)置為實(shí)際運(yùn)行 mysql 的用戶權(quán)限,比如:
Chown –R mysql:mysql /home/mysql/data
-禁止 Mysql 以管理員帳號權(quán)限運(yùn)行
以普通帳戶安全運(yùn)行 mysqld,禁止以管理員帳號權(quán)限運(yùn)行 MySQL 服務(wù)。在 /etc/my.cnf 配置文件中進(jìn)行以下設(shè)置。
[mysql.server]
user=mysql
-避免不同用戶間共享帳號
參考以下步驟。
a、創(chuàng)建用戶。
mysql> mysql> insert into
mysql.user(Host,User,Password,ssl_cipher,x509_issuer,x509_sub
ject) values("localhost","pppadmin",password("passwd"),'','','');
執(zhí)行以上命令可以創(chuàng)建一個 phplamp 用戶。
b、使用該用戶登錄 MySQL 服務(wù)。
mysql>exit;
@>mysql -u phplamp -p
@>輸入密碼
mysql>登錄成功
-刪除無關(guān)帳號
DROP USER 語句可用于刪除一個或多個 MySQL 賬戶。使用 DROP USER 命令時,必須確保當(dāng)前賬號擁有 MySQL 數(shù)據(jù)庫的全局 CREATE USER 權(quán)限或 DELETE 權(quán)限。賬戶名稱的用戶和主機(jī)部分分別與用戶表記錄的 User 和 Host 列值相對應(yīng)。
執(zhí)行DROP USER user;語句,您可以取消一個賬戶和其權(quán)限,并刪除來自所有授權(quán)表的帳戶權(quán)限記錄。
2、口令
檢查賬戶默認(rèn)密碼和弱密碼。口令長度需要至少八位,并包括數(shù)字、小寫字母、大寫字母和特殊符號四類中的至少兩種類型,且五次以內(nèi)不得設(shè)置相同的口令。密碼應(yīng)至少每 90 天進(jìn)行一次更換。
修改root用戶口令,刪除空口令
您可以通過執(zhí)行以下命令修改密碼。
mysql> update user set password=password('test!p3') where user='root';
mysql> flush privileges;
3、授權(quán)
在數(shù)據(jù)庫權(quán)限配置能力范圍內(nèi),根據(jù)用戶的業(yè)務(wù)需要,配置其所需的最小權(quán)限。
查看數(shù)據(jù)庫授權(quán)情況。
mysql> use mysql;
mysql> select * from user;
mysql>select * from db;
mysql>select * from host;
mysql>select * from tables_priv;
mysql>select * from columns_priv;
通過 revoke 命令回收不必要的或危險的授權(quán)。
mysql> help revoke
4、開啟日志審計功能
數(shù)據(jù)庫應(yīng)配置日志功能,便于記錄運(yùn)行狀況和操作行為。
MySQL服務(wù)有以下幾種日志類型:
錯誤日志: -log-err
查詢?nèi)罩荆?-log (可選)
慢查詢?nèi)罩荆?-log-slow-queries (可選)
更新日志: -log-update
二進(jìn)制日志: -log-bin
找到 MySQL 的安裝目錄,在 my.ini 配置文件中增加上述所需的日志類型參數(shù),保存配置文件后,重啟 MySQL 服務(wù)即可啟用日志功能。例如
#Enter a name for the binary log. Otherwise a default name will be used.
#log-bin=
#Enter a name for the query log file. Otherwise a default name will be used.
#log=
#Enter a name for the error log file. Otherwise a default name will be used.
log-error=
#Enter a name for the update log file. Otherwise a default name will be used.
#log-update=