實驗在RHEL7中做,因為9中缺少了一個關鍵的高可用組件
環境:兩臺數據庫,內存和CPU要多一點
主流是MYSQL(開源),Oracle收費較貴
RHEL7中直接用make編譯是有問題的,所以需要要gcc工具
做好前置準備:重新整理軟件倉庫,加入aliyun的地址源
?用原來的數據源,可能倉庫不夠,下載不了
開始安裝gcc
解壓gcc.zip
進入目錄并檢查內容是否齊全
安裝
檢查版本?
安裝cmake3
解壓縮安裝包
進入目錄并查看
安裝mysql
檢查安裝包是否完整
解壓并查看
直接編譯可能會污染當前目錄,所以新建一個目錄來存放編譯后
開始編譯
#源碼編譯參數詳解 [root@mysql_node1 mysql-8.3.0]# mkdir build #建立編譯目錄 [root@mysql_node1 mysql-8.3.0]# cmake3 .. \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #指定安裝路徑 -DMYSQL_DATADIR=/data/mysql \ #指定數據目錄 -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \ #指定套接字文件 -DWITH_INNOBASE_STORAGE_ENGINE=1 \ #指定啟用INNODB存儲引擎,默認用myisam -DWITH_EXTRA_CHARSETS=all \ #擴展字符集 -DDEFAULT_CHARSET=utf8mb4 \ #指定默認字符集 -DDEFAULT_COLLATION=utf8mb4_unicode_ci \ #指定默認校驗字符集 -DWITH_SSL=system \ #指定MySQL 使用系統已安裝的 SSL 庫 -DWITH_BOOST=bundled \ #指定使用 MySQL 源碼包中內置的Boost庫 -DWITH_DEBUG=OFF #源碼編譯命令
[root@mysql_node1 build]# make -j2?? ??? ??? ??? ??? ??? ??? ?#-j2 表示有幾個核心就跑幾個進程
之前為什么給比較大的運行內存和多核,就是在這里
如果運行內存小了,在編譯過程中就會造成內存溢出,會導致失敗
make -j4
運行之后等待完成就行
編譯好了之后就別動了
重新下載,Mysql8.3并不能支持實驗
前面都是一樣的,下載需要的編譯軟件
gcc和cmake3
把mysql3.0的包移入,解壓并make安裝
mysql 3.0編譯內容
cmake3 .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysql -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_EXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_unicode_ci -DWITH_SSL=system -DWITH_BOOST=/root/mysql-8.0.40/boost/boost_1_77_0/ -DWITH_DEBUG=OFF
新的主機雙核cpu,4G內存就夠用
后面的步驟都一樣,等待安裝完畢就行
網頁下載mysql3.0的安裝包的方法
編譯過程決定安裝路徑
make && make install
編譯之后會自動生成目錄的
?
歲讓此時有了bin目錄,但是啟動時還是不生效的,因為沒有加入環境變量?
?
編譯時要求了存放數據的目錄和用戶,但是實際上是沒有創建的
并且此時MySQL目錄是由讀和看的權限,沒有執行權限
?并且要使用,還要有初始化數據
?復制啟動腳本,但是無法啟動,因為還沒有初始化數據
[mysqld]
server-id=10
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
修改數據目錄
做初始化
初始化完成后會有一個初始密碼,千萬別忘記了
列出系統中那些系統是啟動的
做數據庫的開啟啟動
直接登錄什么也做不了,要先做安全初始化
重新輸入密碼?
一路回車
現在就可以正常使用了
?要重新刪除下載的話,要先停止服務,再次刪除
(第一臺從數據庫)mysqlb上的操作
?關閉rhel7的圖形
重啟之后就關閉圖形,直接用終端了
可以直接從mysqla中直接復制到mysqlb上
拷貝完整目錄
復制啟動文件?
初始化,默認認證
?啟動mysql
修改數據庫初始密碼?
MYSQL主從復制
數據很重要,有備份才無患
查看官方文檔來學習主從復制
默認二進制日志是沒有打開的,要在配置文件里修改,現在打開后會修改前綴
在主數據庫上
在從數據庫上
記得重啟服務
此時查看日志前綴,改完之后就會從默認前綴變成mysql-bin
先做主數據庫
在數據庫中查看用戶
用root來做并不好
我們需要新增一個用戶
新增用戶后一定要授權,剛剛新增的用戶是誰就給誰授權
查看授權信息
查看日志情況(后面從數據庫認證要用到)
在生產環境中,要做主從復制,先要把數據從主中拉取出來給從,讓他們現在數據相同
但是現在是實驗,沒有數據在其中
從數據庫
要把mastaer制定到哪里,用戶ip,用戶名,用戶密碼,日志文件名,日志id(這些都要和主數據庫一樣)
如果寫錯了,可以刷掉之前寫的
打開服務的命令
查看是否開啟的命令
Slave_IO_Running用來傳輸日志信息
Slave_SQL_Running用來回放日志信息
測試主從同步:
在從數據庫上監控:watch -n 1 'mysql -uroot -plee -e "select * from lee.userlist;" 2>/dev/null'
要是想刪掉這個error
在主數據庫上中
此時從數據庫上error就沒了
在主數據庫上
主從生效了的話,在主數據庫上輸入這個數據的時候,從數據庫中立刻也要有接受反饋
在從數據庫上
一主雙從模式
再新加一臺主機,這臺主機要追平之前的主從,該怎么做?
先安裝一臺主機,步驟和之前一樣
安裝好之后
此時之前的實驗中,主從里已經有數據了
先導出之前的數據
在主數據庫上:mysqldump -uroot -plee lee > lee.sql
在導入到新主機里
在實際環境中在備份導出前要先鎖庫和鎖表
要在lee庫里恢復,沒有庫要新建
然后導入數據
查看是否導入成功
當數據拉平了,再做主從
確認清楚認證,確認是否有變化
在MySQLC中做認證,連上主數據庫
開啟服務并查看?
一主兩從的情況,在實際生產環境中,最好從數據庫都只能讀,只有主數據庫來寫數據
?
寫入的數據大于讀時主數據庫多
讀的數據大于寫的時候從數據庫多
gtid模式
用二進制日志,有一些缺點
如果是做了高可用,有一臺主機掛了,需要選擇一個新的master,要選一個與之前的主機數據差距最小的主機,現在的二進制日志是無法找到的
用gtid模式來做,唯一標識,每個主機都有一個固定的id,要選舉時,直接比較就行
在master端的寫入時多用戶讀寫,在slave端的復制時單線程日志回放,所以slave端一定會延遲與master端
這種延遲在slave端的延遲可能會不一致,當master掛掉后slave接管,一般會挑選一個和master延遲日志最接近的充當新的master
那么為接管master的主機繼續充當slave角色并會指向到新的master上,作為其slave
這時候按照之前的配置我們需要知道新的master上的pos的id,但是我們無法確定新的master和slave之間差多少
當激活GITD之后
當master出現問題后,slave2和master的數據最接近,會被作為新的master
slave1指向新的master,但是他不會去檢測新的master的pos id,只需要繼續讀取自己gtid_next即可
實驗:
停止從數據庫(兩個從都要做)
啟動gtid模式(主從都做)
啟動gtid模式? ? ? ? gtid——mode=on
必須保持強一致性? ? ? ? enforce-gtid-consistency=on
重啟所有mysql服務
在主數據庫上查看是否開啟
在從數據庫上,做gtid認證
?
慢查詢日志
此時慢日志還未打開,查看log的狀態是OFF
那此時在數據庫中查找這個log,是不會被查找到
打開慢查詢模式
此時再查看
?
測試:
此時查看日志就可以看到信息了
mysql的并行復制
誰要做日志傳輸和日志回放
默認情況下slave中使用的是sql單線程回放
在master中時多用戶讀寫,如果使用sql單線程回放那么會造成組從延遲嚴重
開啟MySQL的多線程回放可以解決上述問題
查看slave中的線程信息
在從數據庫中
編寫多線程
?
重新查看后,此時sql線程轉化為協調線程,16個worker負責處理sql協調線程發送過來的處理請求
半同步模式
1.半同步模式原理
mysql的主備庫通過binlog日志保持一致,主庫本地執行完事務,binlog日志落盤后即返回給用戶;備庫通過拉取主庫binlog日志來同步主庫的操作。默認情況下,主庫與備庫并沒有嚴格的同步,因此存在一定的概率備庫與主庫的數據是不對等的。半同步特性的出現,就是為了保證在任何時刻主備數據一致的問題。相對于異步復制,半同步復制要求執行的每一個事務,都要求至少有一個備庫成功接收后,才返回給用戶。實現原理也很簡單,主庫本地執行完畢后,等待備庫的響應消息(包含最新備庫接收到的binlog(file,pos)),接收到備庫響應消息后,再返回給用戶,這樣一個事務才算真正完成。在主庫實例上,有一個專門的線程(ack_receiver)接收備庫的響應消息,并以通知機制告知主庫備庫已經接收的日志,可以繼續執行。
只在gtid模式下可用
核心是slave的通知機制,數據發送過來,slave會發ack來確認
在從中
在配置文件中寫
?但是沒有插件,開不了
在主中
不要重啟,沒有插件,開不了
安裝模塊
查看是否安裝好
加載完成之后,才可以啟動
啟動
產看模式是否開啟
查看同步的信息,暫時還沒有
在從中
和主中配置不一樣
不要重啟,沒有加載插件
安裝
查看是否安裝
啟動
產看是否開啟
測試:
在從中,關閉線程在打開,刷新
兩邊都要查看
在主中
測試:
在200從中關閉接受日志的線程
在主中
關閉一臺,半同步還在繼續
此時關閉兩個了
其實還是會傳輸,但是會在10秒后轉變成異步
此時你再查看會發現,有兩筆是半同步傳輸的,一筆是異步傳輸的
?半同步自動關閉,轉成異步
恢復一臺就可以使ack恢復了?
檢查是否開啟
主掛了,要怎么知道
主掛了,從要怎么轉變成主
mysql高可用之MHA
工作原理:
會定期檢測
master出現故障時,可以自動切換最新數據的slave為master
前提:一主兩從的模式
環境:四臺虛擬機
新增一臺MHA的虛擬機
安裝所有rpm
并且所有數據庫都要安裝node檢測的軟件,所以直接復制過去?
三臺數據庫都要做
這里面是模版
將模版移動到新目錄中
復制到是主體和對于主機控制的內容
ping_interval=3:做3次都失敗了,就宣告這臺master已經失效了
在編輯文件中寫,master的設定用戶是root
要查看是否能遠程登錄root
三臺數據庫都要做
建立能夠遠程登錄的用戶?
這里設立的超級用戶
對新增用戶做授權
我們這里設定是超級管理員,所有的功能都要能做
?
在原先的master中有一個用于數據同步的用戶lee
但是在第一臺有可能變為主的從數據庫中,是沒有這個用戶的,但是這個數據庫是有變為主的可能性的
第一臺從數據庫還缺少一個變為主的條件,
這四臺主機之間要實現免密,因為在切換時,要能直接切換,不受阻礙
檢測當前架構免密是否成功
檢測主從同步情況
master未出現故障手動切換
這個實驗先把半同步關閉,試驗完成后再打開
問要不要做切換要
master要不要從100切換到200
保持功能 要
同步中斷了
排錯過程
還不行
重做
刪除之前所有的認證
日志還原
所有都:
組復制MGR
前面開啟一個協議層,寫東西時會先進入協議層,協議層會去詢問數據庫能不能做,如果超過兩個以上回復不能做,就不能做(少數服從多數)
單主
多主
任何一個主機寫入時,所有的數據庫都會同步
所有的數據庫服務都關閉
????????
在配置文件中
禁止這些模式的存儲機制
禁止二進制日志的校驗
使用行日志格式
????????
把mysql的文件都刪掉
域名解析:
做初始化
完成后不要啟動數據庫
繼續編輯編輯文件
對于插件來說是不能做初始化的,所以不能啟動
plugin_load_add='group_replication.so'
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="172.25.254.30:33061"
group_replication_group_seeds="172.25.254.100:33061,172.25.254.200:33061,172.25.254.30:33061"
group_replication_ip_whitelist="172.25.254.0/24,127.0.0.1/8"
group_replication_bootstrap_group=off
group_replication_single_primary_mode=OFF
?
最后再啟動
不要安全初始化,直接進入
修改超級用戶密碼,不然無法操作了
關閉日志,后面的操作不需要記錄到日志中
創建用戶
授權
????????
把自己加入組中
手動打開組復制模式
打開服務,再關閉模式
查看組情況
加入后兩臺數據庫到組中
第一臺從
數據之間有差異
開之前,把這臺主機里面之前所有的日志文件都刷新
再次查看組
?recoe沒好
測試呢能不能連
?ping不同
要做域名解析
等待一段時間
此時再查看
第二臺
繼續上一步
再去查看,此時有三個
測試:
在主上建立數據庫
在從上查看
?在從上建表
在第二臺從上看
在主上看
現在關閉一臺數據庫
還是能正常輸入數據
此時兩臺都掛了
?
此時寫了也不能進入磁盤
重新登錄
不能自動上線,要手動開啟
???????
MHA
在主數據庫上
?先要開啟gtid模式
?
執行它之前,一定要關閉mysql
等從數據庫完成gtid模式后
在master端配置啟用半同步模式
#安裝半同步插件
查看插件情況
打開半同步功能
查看半同步功能狀態
MYSQL開啟時自動安裝模塊
在編輯文檔里寫
建立用于做數據同步的用戶
這里是手動開啟的
在從中
編輯文檔
[mysqld]
server-id=200
datadir=/data/mysql
socket=/data/mysql/mysql.sock
default_authentication_plugin=mysql_native_password
log-bin=binlog
gtid_mode=ON
skip-name-resolve
binlog_format=ROW
enforce-gtid-consistency=ON
?
首先要做gtid模式
開啟slave端的gtid
?
?
在主數據庫完成半同步模式后
mysql> STOP SLAVE IO_THREAD;?? ??? ??? ?#重啟io線程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)mysql> START SLAVE IO_THREAD;?? ??? ??? ?##重啟io線程,半同步才能生效
Query OK, 0 rows affected (0.00 sec)
安裝
在主服務器上也做:
MHA上:
在其他3臺數據庫
設定root遠程登錄功能
檢測配置:
測試:
master未出現故障手動切換
?masterha_master_switch --conf=/etc/mha/mha.cfg --master_state=alive --new_master_host=172.25.254.200 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000
在從數據中看
之前:
現在:?
master故障手動切換
?
?
?