RXC方案與Replication方案的對比:
- RXC采用同步復制,事務在所有集群節點要么同時提交,要么不提交
- Replication采用異步復制,無法保證數據的一致性
RXC鏡像下載
- docker官方倉庫:https://hub.docker.com
docker pull percona/percona-xtradb-cluster
docker創建內部網段
docker network create --subnet=172.18.0.0/24 net1
docker卷:容器中的PXC節點映射數據目錄的解決辦法
name:v1,v2,v3,v4,v5
docker volume create --name v1
- docker卷查看
docker inspect v1
創建PXC容器
name: node1,node2,node3,node4,node5
ip:172.18.0.2,172.18.0.3,172.18.0.4,172.18.0.5,172.18.0.6
port:3306,3307,3308,3309,3310
docker run -d -p 3306:3306 \ -v v1:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -e CLUSTER_NAME=PXC \ -e XTRABACKUP_PASSWORD=root \ --privileged \ --name=node1 \ --net=net1 \ --ip 172.18.0.2 \ pxc
docker run -d -p 3307:3306 \ -v v2:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=root \ -e CLUSTER_NAME=PXC \ -e XTRABACKUP_PASSWORD=root \ -e CLUSTER_JOIN=node1 \ --privileged \ --name=node2 \ --net=net1 \ --ip 172.18.0.3 \ pxc
數據庫負載均衡
- 使用Haproxy做負載均衡,請求被均勻分發給每個節點,單節點負載低,性能好
- 安裝Haproxy鏡像
docker pull haproxy
- 創建Haproxy配置文件(啟動容器時指定映射)
- 配置參考:https://zhangge.net/5125.html
touch /home/soft/haproxy/haproxy.cfg
...
- 創建Haproxy容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy docker exec -it h1 bash haproxy -f /usr/local/etc/haproxy/haproxy.cfg
- 為集群添加haproxy的專用賬號
CREATE USER 'haproxy'@'%' IDENTIFIED BY '';
web監控:http://114.115.154.152:4001/dbs
出現一下錯誤,參考http://www.mamicode.com/info-detail-2405918.html詳解
error:Percona-XtraDB-Cluster prohibits use of ALTER command on a table (base_test.station_cmcu) that resides in non-transactional storage engine (except switching to transactional engine) with pxc_strict_mode = ENFORCING or MASTER
Keepalived實現雙機熱備
- 一個虛擬ip
- 多個keepalived(用於強虛擬ip)
- 安裝Keepalived
- Keepalived必須安裝在Haproxy所在的容器內(虛機為ubantu)
docker exec -it h1 bash apt-get update apt-get install keepalived
- keepalived配置文件(/etc/keepalived/keepalived.conf)
apt-get install vim
vim /etc/keepalived/keepalived.conf
- MASTER:主服務;BACKUP:備服務
- eth0:網卡設備,用於與宿主ip映射
- priority:權重
- advert_int:心跳檢測時間間隔(秒)
- virtual_ipaddress:公用虛擬ip
vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 123456 } virtual_ipaddress { 172.18.0.201 } }
service keepalived start
在宿主中:ping 172.18.0.201
數據庫備份(熱備份)
- MySQL常見的熱備份:LVM和XtraBackup(推薦)
- 創建一個docker卷
docker volume create backup
- 停止並刪除一個節點(隨意:node1)
docker stop node1 docker rm node1
- 創建PXC節點(node1)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node2 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
- PXC全量備份步驟(手動觸發)(PXC容器中安裝XtraBackup)
- 以后自動增量備份
- 進入容器,以管理員的身份
docker exec -it --user root node1 bash
apt-get update apt-get install percona-xtrabackup-24 innobackupex --user=root --password=root /data/backup/full
- PXC全量恢復(進入容器內部執行)
rm -rf /var/lib/mysql/* innobackupex --user=root --password=root --apply-back /data/backup/full/2018-04-15_05-09-07/ innobackupex --user=root --password=root --copy-back /data/backup/full/2018-04-15_05-09-07/
注意:RXC不能直接使用容器中的目錄。
3----3.docker run -d -p 3308:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc 4----4.docker run -d -p 3309:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc 5----5.docker run -d -p 3310:3306 -v v5:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
global #工作目錄 chroot /usr/local/etc/haproxy #日志文件嗎,使用rsyslog服務中local5日志設備(/var/log/local5),等級info log 127.0.0.1 local5 info #守護進程運行 daemon defaults log global mode http #日志格式 option httplog #日志中不記錄負載均衡的心跳檢測記錄 option dontlognull #連接超時(毫秒) timeout connect 5000 #客戶端超時(毫秒) timeout client 50000 #服務器超時(毫秒) timeout server 50000 #監控界面 listen admin_stats #監控界面的ip:port bind 0.0.0.0:8888 #訪問協議 mode http #URI相對地址 stats uri /dbs #統計報告格式 stats realm Global\ statistics #登陸賬戶信息 stats auth pascall:zj1424603784 #數據庫負載均衡 listen proxy-mysql #訪問的ip:port bind 0.0.0.0:3306 #網絡協議 mode tcp #負載均衡算法(輪詢算法) #輪詢算法:roundrobin #權重算法:static-rr #最少連接算法:leastconn #請求源IP算法:source balance roundrobin #日志格式 option tcplog #在Mysql中創建一個沒有權限的haproxy用戶,密碼空 option mysql-check user haproxy server MySQL_1 172.18.0.2:3306 check weight 1 maxconn 2000 server MySQL_2 172.18.0.3:3306 check weight 1 maxconn 2000 server MySQL_3 172.18.0.4:3306 check weight 1 maxconn 2000 server MySQL_4 172.18.0.5:3306 check weight 1 maxconn 2000 server MySQL_5 172.18.0.6:3306 check weight 1 maxconn 2000 #使用keepalive檢測死鏈 option tcpka
注:安裝好Percona XtraDB Cluste(PXC)群集后,它在啟動時和運行時執行許多驗證。
可以使用以下模式:
DISABLED:不要執行嚴格的模式驗證並正常運行。
PERMISSIVE:如果vaidation失敗,請記錄警告並繼續正常運行。
ENFORCING:如果啟動期間驗證失敗,請暫停服務器並拋出錯誤。如果驗證在運行時失敗,則拒絕操作並拋出錯誤。
MASTER:ENFORCING除了不執行顯式表鎖定的驗證之外 。此模式可與群集一起使用,其中寫入操作與單個節點隔離。
默認情況下,PXC嚴格模式設置為ENFORCING
Percona XtraDB Cluster目前僅支持對使用事務存儲引擎(XtraDB或InnoDB)的表進行復制。
對於使用非事務性存儲引擎(MyISAM,MEMORY,CSV等)的表,不應允許以下語句:
進行寫入到表數據操作語句(例如,INSERT,UPDATE,DELETE,等等)
管理報表: CHECK,OPTIMIZE,REPAIR,和ANALYZE
TRUNCATE TABLE 和 ALTER TABLE
根據所選模式,會發生以下情況:
DISABLED 啟動時,不執行驗證。在運行時,允許所有操作。
PERMISSIVE 啟動時,不會執行任何驗證。在運行時,允許所有操作,但在不支持的表上執行不需要的操作時會記錄警告。
ENFORCING 要么 MASTER 。啟動時,不執行驗證。在運行時,拒絕對不受支持的表執行的任何不良操作,並記錄錯誤。
SQL補充:
SELECT @@global.sql_mode
set @@global.sql_mode='STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';