Docker搭建mysql集群


RXC方案與Replication方案的對比:


  • RXC采用同步復制,事務在所有集群節點要么同時提交,要么不提交
  • Replication采用異步復制,無法保證數據的一致性

RXC鏡像下載

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
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';


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM