一、多節點哨兵如何配置?
哨兵配置原理圖
- 注意:sentinel哨兵模式的搭建是建立在redis主從復制節點配置基礎而搭建,在主從配置中從庫需要配置好replicaof關聯上主庫并關閉安全模式,然后設置好bind端口才能關聯上機器,而這里的如果設置了一臺哨兵機器,首先哨兵機器會通過monitor來監控你的主機器redis-master是否有宕機的可能(狀態表現為sdown-,odown-),然后哨兵會自動對slave配置文件進行配置,定位到master機器,然后后期只針對master機器進行監控即可
## 關閉redis服務
pkill redis## 創建3個哨兵文件
sentinel_26379.conf、sentinel_26380.conf、sentinel_26381.conf模版如下: port 26379
daemonize yes
pidfile /var/run/redis-sentinel_26379.pid
logfile /var/log/sentinel_26379.log(哨兵日志)
dir /data/26379
sentinel monitor mymaster 10.0.0.7 6379 2(填寫主庫地址)
sentinel down-after-milliseconds mymaster 3000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
哨兵節點突發宕機,如何裁決?
- 如果發生了意外故障主節點突然宕機了,那么就只能通過投票選舉讓哨兵之間進行商量選舉出最終的主機,然后switch-fork實現了主從間關系的轉移,最后確定之后重新綁定master、slave之間的關系
redis配置文件詳解
二、LNMP對接哨兵服務
根據博客一Redis哨兵模式之Sentinel模式(一)-CSDN博客的信息已經完成了主從節點與哨兵節點的調試工作,那么現在問題來了,我究竟如何能讓php-fpm后端連接上redis哨兵來監控主master宕機并進行靈活的轉換呢????
由于php-fpm后端管理頁面無法直接填寫哨兵來完成與redis協議,可以考慮的解決方案有兩種要么對php源碼文件編寫(通常交給程序員解決),要么通過shell腳本來實現master 腳本的動態獲取,然后將主master節點依照哨的情況進行動態切換
-
首先需要完成后端php_redis連接的配置
-
寫shell腳本方式來動態獲取哨兵
#!/bin/bash
############################
## auto check redis master
############################
while true
doREDIS_MASTER=$(grep -aiE "monitor mymaster" /usr/local/redis/sentinel.conf | awk '{print $4}')grep -aiE "$REDIS_MASTER" /etc/hostsif [ $? -ne 0 ];thensed -i '/redis.jf.com/d' /etc/hostsecho "$REDIS_MASTER" >> /etc/hostsecho Change time:`date`fisleep 5
done
三、MYSQL讀寫分離
-
場景分析
當用戶首次訪問網頁時,首先會將數據請求轉發到到MySQL服務器如果首次數據量過大,那么就會導致首次服務器就會出現宕機風險,此時我們就引入了分庫 ,分布式機器或MYSQL讀寫分離來進一步緩解服務器壓力了
-
原理分析
MYSQL讀寫分離的本質是將增刪改的數據交給主庫去處理,而數據查詢就需要交給從庫來做進一步的處理了,MYSQL讀寫分離實際上是基于MySQL主從復制而設定的,這樣設計保證了在master端口寫入數據,slave同步后,Web應用就可以直接讀取從庫的數據了。
-
mycat中間件
-
實驗部署
機器準備
master(主機) | 10.0.0.6 |
slave(從機) | 10.0.0.7 |
mycat機器 | 10.0.0.8 |
實驗步驟
##(mycat機器操作)
## Jdk環境安裝部署
yum -y install java## mycat的jar包和zip包上傳
mycat2-1.21-release-jar-with-dependencies.jar
mycat2-install-template-1.21.zip## 壓縮mycat程序
unzip mycat2-install-template-1.21.zip
\mv mycat /usr/local/## 拷貝mycat依賴環境
cp mycat2-1.21-release-jar-with-dependencies.jar /usr/local/mycat/lib/#授予Mycat bin目錄下文件執行權限;
chmod +x /usr/local/mycat/bin/*#查看Mycat程序是否部署成功;
ls -l /usr/local/mycat/## (master機器操作)
## 創建專有用戶
CREATE USER 'mycat'@'%' IDENTIFIED BY 'aaaAAA111.';
#授權用戶訪問;
GRANT XA_RECOVER_ADMIN ON *.* to 'mycat'@'%';
GRANT ALL PRIVILEGES ON *.* to 'mycat'@'%';
FLUSH PRIVILEGES;
# 創建數據原型庫mycat----->mycat數據表存放地
create database mycat;## 修改mycat數據源配置(參見下圖)vim /usr/local/mycat/conf/datasources/prototypeDs.datasource.json## 創建物理型數據庫實現讀寫分離
## 拷貝模板文件,生成master和slave配置文件
\cp prototypeDs.datasource.json master.datasource.json
\cp prototypeDs.datasource.json slave-01.datasource.json
mycat配置文件修改
mycat-master數據源配置信息
mycat-slave數據源配置信息
配置物理數據源cluster集群信息
cd? /usr/local/mycat/conf/clusters
\cp prototype.cluster.json master-slave.cluster.json
## 配置cluster.conf文件配置信息
cat>master-slave.cluster.json<<EOF
{"clusterType":"MASTER_SLAVE","heartbeat":{"heartbeatTimeout":1000,"maxRetry":3,"minSwitchTimeInterval":300,"slaveThreshold":0},"masters":["master"],"replicas":["slave-01"],"maxCon":5000,"name":"master-slave","readBalanceType":"BALANCE_ALL","switchType":"NOT_SWITCH"
}
EOF
將物理數據庫與集群綁定起來
cd?/usr/local/mycat/conf/schemas
## 創建discuz框架文件
cat>discuz.schema.json<<EOF
{"schemaName": "discuz","targetName": "master-slave","normalTables": {}
}
EOF
mycat數據讀取流程
修改 Mycat 登錄用戶信息
cd /usr/local/mycat/conf/users/
#修改root.user.json文件,代碼;
{"dialect":"mysql","ip":null,"password":"aaaAAA111.","transactionType":"xa","username":"root"
}
有關mycat啟動服務、查看狀態、幫助情況
#啟動服務;
/usr/local/mycat/bin/mycat start
#查看服務狀態;
/usr/local/mycat/bin/mycat status
#查看Mycat幫助信息;
/usr/local/mycat/bin/mycat --help
?檢查是否存在報錯問題(無法連接上mysql數據庫):
下面針對mycat服務啟動時發現mysql服務器未創建用戶解決方案
ALTER USER 'root'@'localhost' IDENTIFIED BY 'aaaAAA111.';
update mysql.user set host='%' where user="root";
檢查mycat的監聽端口
netstat -tnlp | grep -E "8066|9066"
mysql測試連接情況
驗證讀寫分離
## 在slave中創建數據表
create table t1 (id char(20),name char(20),job char(10));
insert into t1 values (01,'wanger','IT');
insert into t1 values (02,'zhangsan','IT');
補充一個MySQL從服務器配置mycat讀寫分離
(配置了一主兩從架構)
開放的一臺新機器IP地址為10.0.0.5
## 安裝mysql,mysql-server軟件包
yum -y install mysql mysql-server## 將master機器加上讀鎖
flush tables with read lock;
## 數據備份完成之后解開鎖
unlock tables;## 備份主表的數據
mysqldump -B -uroot -paaaAAA111. --all-databases > 0707all.sql## 將主表的數據發送給新機器
scp -r 0707all.sql 10.0.0.5:/root/## 重啟mysql服務
service mysqld start## 編輯mysql配置,編寫server-id配置
vim /etc/my.cnf.d/mysql-server.cnf ## 數據導入
mysql -uroot -p < 0707all.sql ## 與master機器綁定建立關聯(根據master狀態來決定)
change master to
master_host='10.0.0.6',master_user='repl',master_password='123456',master_log_file='mysql-bin.000005',master_log_pos=2679454;
start slave;
show slave status\G;## 檢查還無法啟動
stop slave;
reset slave;##拷貝02數據源(修改name)
cp slave-01.datasource.json slave-02.datasource.json## 修改集群架構配置文件
cd ../clusters/
vim master-slave.cluster.json(在replica中加入slave-02)
mysql-mycat引擎一主兩從架構