一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

「實戰(zhàn)篇」開源項目docker化運維部署

 boyjiangkt727t 2019-05-01

   有了docker虛擬機,就需要利用平臺部署數(shù)據(jù)庫的集群,在實際操作之前介紹下數(shù)據(jù)庫集群的方案和各自的特點。源碼:https://github.com/limingios/netFuture/tree/master/mysql-pxc/

集群的方案

單節(jié)點的弊病

  1. 大型互聯(lián)網(wǎng)程序用戶群體龐大,所以架構(gòu)必須要特殊設(shè)計

  2. 單節(jié)點的數(shù)據(jù)庫無法滿足性能的要求
    >案例15年前,高考成績可以在網(wǎng)上查(河南幾十萬考生),那時候基本家里都沒電腦,都是去網(wǎng)吧白天去網(wǎng)吧也查不了,太慢了,后來半夜通宵有時候可以查到,也就是說白天基本查不了人太多了。晚上看運氣。一個數(shù)據(jù)庫的實例1萬多人就無法反應(yīng)了。

  3. 單節(jié)點的數(shù)據(jù)庫沒有冗余設(shè)計,無法滿足高可用

常用的mysql集群設(shè)計方案

  • Replication

  1. 速度快

  2. 弱一致性

  3. 低價值

  4. 場景:日志,新聞,帖子

  • PXC

  1. 速度慢

  2. 強一致性

  3. 高價值

  4. 場景:訂單,賬戶,財務(wù)

Percona Xtradb Cluster,簡稱PXC。是基于Galera插件的MySQL集群。相比那些比較傳統(tǒng)的基于主從復(fù)制模式的集群架構(gòu)MHA和MM+keepalived,galera cluster最突出特點就是解決了詬病已久的數(shù)據(jù)復(fù)制延遲問題,基本上可以達到實時同步。而且節(jié)點與節(jié)點之間,他們相互的關(guān)系是對等的。本身galera cluster也是一種多主架構(gòu)。galera cluster最關(guān)注的是數(shù)據(jù)的一致性,對待事物的行為時,要么在所有節(jié)點上執(zhí)行,要么都不執(zhí)行,它的實現(xiàn)機制決定了它對待一致性的行為非常嚴格,這也能非常完美的保證MySQL集群的數(shù)據(jù)一致性。在PXC里面任何一個節(jié)點都是可讀可寫的。在其他的節(jié)點一定是可以讀取到這個數(shù)據(jù)。

  • 建議PXC使用PerconaServer(MYSQL的改進版,性能提升很大)

  • PXC方案和Replication方案的對比

    PXC任意一個節(jié)點都可以存在讀寫的方案,也就是任意一個節(jié)點都可以當讀或者當寫。同步復(fù)制。保證強一致性。

Replication方案,主從的方式,他是采用異步的方式。

  • PXC的數(shù)據(jù)強一致性
    >同步復(fù)制,事務(wù)在所有節(jié)點要提交都提交。要么都不提交

  • Replication弱一致性,主要master成功就成功了。返回給調(diào)用者。如果slave失敗,也沒辦法。因為已經(jīng)告訴調(diào)用者成功了,調(diào)用者獲取查詢的時候查詢不到信息。例如:在淘寶買個東西,付款也成功了,查詢訂單沒信息是不是要罵娘。

環(huán)境搭建

應(yīng)用IP地址服務(wù)配置安裝應(yīng)用安裝方式
docker-mysql192.168.66.100docker-mysql雙核 8g內(nèi)存docker-mysqldocker

(1). 虛擬機vagrant講述安裝的步驟

vagrant up

(2).機器window/mac開通遠程登錄root用戶下

su -
# 密碼
vagrant
#設(shè)置 PasswordAuthentication yes
vi /etc/ssh/sshd_config
sudo systemctl restart sshd

PXC集群安裝介紹

PXC既可以在linux系統(tǒng)安裝,也可以在docker上面安裝。

  • 安裝鏡像PXC鏡像

docker pull percona/percona-xtradb-cluster
#本地安裝
docker load </home/soft/pxc.tar.gz
  • 創(chuàng)建內(nèi)部網(wǎng)絡(luò)的
    >處于安全,需要給PXC集群實例創(chuàng)建Docker內(nèi)部網(wǎng)絡(luò),都出可虛擬機自帶的網(wǎng)段是172.17.0., 這是內(nèi)置的一個網(wǎng)段,當你創(chuàng)建了網(wǎng)絡(luò)后,網(wǎng)段就更改為172.18.0.,

docker network create net1
docker network inspect net1
docker network rm net1
#設(shè)置網(wǎng)段
docker network create  --subnet=172.18.0.0/24 net1

  • 創(chuàng)建Docker 卷
    >一旦生成docker容器,不要在容器內(nèi)保存業(yè)務(wù)的數(shù)據(jù),要把數(shù)據(jù)放到宿主機上,可以把宿主機的一個目錄映射到容器內(nèi),如果容器出現(xiàn)問題,只需要吧容器刪除,重新建立一個新的容器把目錄映射給新的容器。

之前一直有個疑問,如果直接映射目錄的吧,存在失敗的問題,現(xiàn)在終于知道解決方案了,直接映射docker卷就可以可以忽略這個問題了。

容器中的PXC節(jié)點映射數(shù)據(jù)目錄的解決方法

docker volume create name --v1

mysql pxc搭建

  • 腳本開發(fā)

#!/bin/bash
echo "創(chuàng)建網(wǎng)絡(luò)"
docker network create  --subnet=172.18.0.0/24 net1

echo "創(chuàng)建5個docker卷"
docker volume create v1
docker volume create v2
docker volume create v3
docker volume create v4
docker volume create v5

echo "創(chuàng)建節(jié)點 node1"
docker run -d -p 3306:3306  --net=net1 --name=node1         -e CLUSTER_NAME=PXC         -e MYSQL_ROOT_PASSWORD=a123456         -e XTRABACKUP_PASSWORD=a123456         -v v1:/var/lib/mysql         --privileged         --ip 172.18.0.2         percona/percona-xtradb-cluster
sleep 1m 
echo "創(chuàng)建節(jié)點 node2"
docker run -d -p 3307:3306  --net=net1 --name=node2         -e CLUSTER_NAME=PXC         -e MYSQL_ROOT_PASSWORD=a123456         -e XTRABACKUP_PASSWORD=a123456         -e CLUSTER_JOIN=node1         -v v2:/var/lib/mysql         --privileged         --ip 172.18.0.3         percona/percona-xtradb-cluster
sleep 1m 
echo "創(chuàng)建節(jié)點 node3"
docker run -d -p 3308:3306  --net=net1 --name=node3         -e CLUSTER_NAME=PXC         -e MYSQL_ROOT_PASSWORD=a123456         -e XTRABACKUP_PASSWORD=a123456         -e CLUSTER_JOIN=node1         -v v3:/var/lib/mysql         --privileged         --ip 172.18.0.4         percona/percona-xtradb-cluster
sleep 1m 
echo "創(chuàng)建節(jié)點 node4"
docker run -d -p 3309:3306  --net=net1 --name=node4         -e CLUSTER_NAME=PXC         -e MYSQL_ROOT_PASSWORD=a123456         -e XTRABACKUP_PASSWORD=a123456         -e CLUSTER_JOIN=node1         -v v4:/var/lib/mysql         --privileged         --ip 172.18.0.5         percona/percona-xtradb-cluster
sleep 1m 
echo "創(chuàng)建節(jié)點 node5"
docker run -d -p 3310:3306  --net=net1 --name=node5         -e CLUSTER_NAME=PXC         -e MYSQL_ROOT_PASSWORD=a123456         -e XTRABACKUP_PASSWORD=a123456         -e CLUSTER_JOIN=node1         -v v5:/var/lib/mysql         --privileged         --ip 172.18.0.6         percona/percona-xtradb-cluster

新建立一個aaa數(shù)據(jù)庫 結(jié)果都可以用

哇塞就這么簡單,成功的搭建了mysql的集群

增加負載均衡方案

目前數(shù)據(jù)庫都是獨立的ip,在開發(fā)的時候總不能隨機連接一個數(shù)據(jù)庫吧。如果想請求,統(tǒng)一的口徑,這就需要搭建負載均衡了。雖然上邊已經(jīng)搭建了集群,但是不使用數(shù)據(jù)庫負載均衡,單節(jié)點處理所有請求,負載高,性能差。下圖就是一個節(jié)點很忙,其他節(jié)點很閑。

  • 調(diào)整后的方案,使用Haproxy做負載均衡,請求被均勻分發(fā)到每個節(jié)點,單節(jié)點的負載低,性能好。haproxy不是數(shù)據(jù)庫,只是一個轉(zhuǎn)發(fā)器。

  • 負載均衡中間件對比
    >LVS是不能在虛擬機環(huán)境下安裝的。

  • 安裝haproxy
    >docker-haproxy的介紹:https://hub./_/haproxy/

  • 配置文件

mkdir haproxy/h1
pwd
vi haproxy.cfg

  • haproxy.cfg配置
    >登錄:admin
    >密碼:abc123456

global
    #工作目錄
    chroot /usr/local/etc/haproxy
    #日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/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
    #服務(wù)器超時(毫秒)
    timeout server  50000

#監(jiān)控界面  
listen  admin_stats
    #監(jiān)控界面的訪問的IP和端口
    bind  0.0.0.0:8888
    #訪問協(xié)議
    mode        http
    #URI相對地址
    stats uri   /dbs
    #統(tǒng)計報告格式
    stats realm     Global\ statistics
    #登陸帳戶信息
    stats auth  admin:abc123456
#數(shù)據(jù)庫負載均衡
listen  proxy-mysql
    #訪問的IP和端口
    bind  0.0.0.0:3306  
    #網(wǎng)絡(luò)協(xié)議
    mode  tcp
    #負載均衡算法(輪詢算法)
    #輪詢算法:roundrobin
    #權(quán)重算法:static-rr
    #最少連接算法:leastconn
    #請求源IP算法:source 
    balance  roundrobin
    #日志格式
    option  tcplog
    #在MySQL中創(chuàng)建一個沒有權(quán)限的haproxy用戶,密碼為空。Haproxy使用這個賬戶對MySQL數(shù)據(jù)庫心跳檢測
    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  

  • 創(chuàng)建docker下的haproxy容器

docker run -it -d -p 4001:8888 -p 4002:3306 -v /root/haproxy/h1:/usr/local/etc/haproxy --name h1 --privileged --net=net1 --ip 172.18.0.7 haproxy

  • 進入容器后,加載配置文件

docker exec -it h1 /bin/bash
haproxy -f /usr/local/etc/haproxy/haproxy.cfg 

  • 在數(shù)據(jù)庫中創(chuàng)建一個haproxy的用戶,不需要設(shè)置密碼

  • 登錄haproxy網(wǎng)頁端
    >http://192.168.66.100:4001/dbs

  • 客戶端連接haproxy-mysql數(shù)據(jù)庫

正常的連接haproxy,傳遞增刪蓋查,其實是通過輪詢的方式。選擇mysql的節(jié)點。均勻的分發(fā)給mysql的實例。不會吧數(shù)據(jù)庫的請求都集中在一個節(jié)點上。把請求分散出去,每個數(shù)據(jù)庫實例獲取到的請求就小很多了。這就是數(shù)據(jù)庫的負載。

  • 虛擬機重啟后,發(fā)現(xiàn)pxc起不起來了
    >查看日志發(fā)現(xiàn),node1無法啟動,輸入命令查看docker logs node1

It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .

解決方案

#查看node1掛載點的文件地址
docker volume inspect v1   
# 進入目錄下
cd /var/lib/docker/volumes/v1/_data
#編輯文件grastate.dat
vi grastate.dat

高可用負載均衡方案

目前haproxy只有一個,單haproxy不具備高可用,必須冗余設(shè)計。haproxy不能形成瓶頸。

  • 虛擬IP技術(shù)

    haproxy雙機互備離不開一個關(guān)鍵的技術(shù),這個技術(shù)是虛擬IP,linux可以在一個網(wǎng)卡內(nèi)定義多個虛擬IP,得把這些IP地址定義到一個虛擬IP。

  • 利用keepalived實現(xiàn)雙機熱備

    定義出來一個虛擬IP,這個方案叫雙機熱備,準備2個keepalived,keepalived 就是為了搶占虛擬IP的,誰手快誰能搶到,沒搶到的處于等待的狀態(tài)。搶到的叫做主服務(wù)器,未搶到的叫做備服務(wù)器。兩個keepalived之前有心跳檢測的,當備用的檢測到主服務(wù)掛了,就立馬搶占虛擬IP。

  • Haproxy雙機熱備方案

  • 安裝keepalived

    keepalived必須在haproxy所在的容器之內(nèi),也可以在docker倉庫里面下載一個haproxy-keepalived的鏡像。這里直接在容器內(nèi)安裝keepalived。

docker exec -it h1 /bin/bash
#寫入dns,防止apt-get update找不到服務(wù)器
echo "nameserver 8.8.8.8" | tee /etc/resolv.conf > /dev/null 
apt-get clean
apt-get update
apt-get install vim
vi /etc/apt/sources.list 

sources.list 添加下面的內(nèi)容

deb http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse 
deb-src http://mirrors.163.com/ubuntu/ precise main universe restricted multiverse 
deb http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ precise-security universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ precise-proposed universe main multiverse restricted 
deb http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ precise-backports universe main multiverse restricted 
deb-src http://mirrors.163.com/ubuntu/ precise-updates universe main multiverse restricted

  • 更新apt源

apt-get clean
apt-get update
apt-get install keepalived
apt-get install vim

  • keepalived配置文件
    >容器內(nèi)的路徑:/etc/keepalived/keepalived.conf

vi /etc/keepalived/keepalived.conf

  1. VI_1 名稱可以自定義

  2. state MASTER | keepalived的身份(MASTER主服務(wù)器,BACKUP備份服務(wù)器,不會搶占虛擬機ip)。如果都是主MASTER的話,就會進行互相爭搶IP,如果搶到了就是MASTER,另一個就是SLAVE。

  3. interface網(wǎng)卡,定義一個虛擬IP定義到那個網(wǎng)卡上邊。網(wǎng)卡設(shè)備的名稱。eth0是docker的虛擬網(wǎng)卡,宿主機是可以訪問的。

  4. virtual_router_id 51 | 虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致。標識可以是0-255。

  5. priority 100 | 權(quán)重。MASTER權(quán)重要高于BACKUP 數(shù)字越大優(yōu)選級越高。可以根據(jù)硬件的配置來完成,權(quán)重最大的獲取搶到的級別越高。

  6. advert_int 1 | 心跳檢測。MASTER與BACKUP節(jié)點間同步檢查的時間間隔,單位為秒。主備之間必須一致。

  7. authentication | 主從服務(wù)器驗證方式。主備必須使用相同的密碼才能正常通信。進行心跳檢測需要登錄到某個主機上邊所有有賬號密碼。

  8. virtual_ipaddress | 虛擬ip地址,可以設(shè)置多個虛擬ip地址,每行一個。根據(jù)上邊配置的eth0上配置的ip。

  • 啟動keeplived
    >容器內(nèi)啟動

service keepalived start

宿主機ping這個ip

ping 172.18.0.201

創(chuàng)建haproxy2容器,并配置與haproxy1相同的環(huán)境

因為要保證有2個haproxy 和keepalived,這次就不那么麻煩了。直接對一個鏡像里面包括keeplived 和 haproxy。

  • 宿主機創(chuàng)建文件

mkdir haproxy/h2
cd haproxy/h2
vi haproxy.cfg
vi keepalived.cfg

  • haproxy.cfg


global #工作目錄 chroot /usr/local/etc/haproxy #日志文件,使用rsyslog服務(wù)中l(wèi)ocal5日志設(shè)備(/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 #服務(wù)器超時(毫秒) timeout server 50000 #監(jiān)控界面 listen admin_stats #監(jiān)控界面的訪問的IP和端口 bind 0.0.0.0:8888 #訪問協(xié)議 mode http #URI相對地址 stats uri /dbs #統(tǒng)計報告格式 stats realm Global\ statistics #登陸帳戶信息 stats auth admin:abc123456 #數(shù)據(jù)庫負載均衡 listen proxy-mysql #訪問的IP和端口 bind 0.0.0.0:3306 #網(wǎng)絡(luò)協(xié)議 mode tcp #負載均衡算法(輪詢算法) #輪詢算法:roundrobin #權(quán)重算法:static-rr #最少連接算法:leastconn #請求源IP算法:source balance roundrobin #日志格式 option tcplog #在MySQL中創(chuàng)建一個沒有權(quán)限的haproxy用戶,密碼為空。Haproxy使用這個賬戶對MySQL數(shù)據(jù)庫心跳檢測 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
  • keepalived.cfg

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
    }
}
  • docker的方式一下安裝好 haproxy 和keepalived
    >https://hub./r/pelin/haproxy-keepalived/
    >映射端口更改為4003 4004 name修改h2

docker run -it -d --privileged -p 4003:8888    -p 4004:3306     -v /root/haproxy/h2/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg     -v /root/haproxy/h2/keepalived.conf:/etc/keepalived/keepalived.conf     --name haproxy-keepalived     --net=net1     --name h2     --ip 172.18.0.8     pelin/haproxy-keepalived

宿主機安裝keepalived

yum -y install keepalived
vi /etc/keepalived/keepalived.conf
#刪除這個表里之前存在的內(nèi)容

  • keepalived.cof

 vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            192.168.66.200
        }
    }

    virtual_server 192.168.66.200 8888 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP

        real_server 172.18.0.201 8888 {
            weight 1
        }
    }

    virtual_server 192.168.66.200 3306 {
        delay_loop 3
        lb_algo rr
        lb_kind NAT
        persistence_timeout 50
        protocol TCP

        real_server 172.18.0.201 3306 {
            weight 1
        }
    }

  • 啟動宿主機

service keepalived start

虛擬機端口轉(zhuǎn)發(fā) 外部無法訪問

WARNING: IPv4 forwarding is disabled. Networking will not work.
  • 解決方案
    >宿主機修改

vi /etc/sysctl.conf
# 添加net.ipv4.ip_forward=1

systemctl restart network

PS:如果通過docker的方式直接拉取haproxy和keepalived鏡像,比直接在鏡像里面安裝應(yīng)用方便很多,建議各位老鐵盡量避免在容器內(nèi)安裝應(yīng)用,這樣真心麻煩不爽,別人封裝的鏡像根據(jù)pull的量好好看看api就可以使用了。像h1如果容器stop后,重新start,還需要進入容器把keeplived給起起來。而h2直接start里面的haproxy和keeplived,同時都起起來了。 兩個容器的采用的熱備的方案,讓用戶毫無感知,切換ip的形式真是美滋滋。mysql集群的高性能,高負載,高可用基本完成了,可用按照這個思路搭建不同的主機下。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲第一区二区三区女厕偷拍| 少妇在线一区二区三区| 国产一区二区三区四区中文| 亚洲欧美日韩国产综合在线| 国产在线不卡中文字幕| 午夜亚洲精品理论片在线观看| 人人爽夜夜爽夜夜爽精品视频| 麻豆最新出品国产精品| 午夜福利激情性生活免费视频| 欧美日韩中黄片免费看| 日本淫片一区二区三区| 日韩精品一区二区三区射精| 欧美字幕一区二区三区| 欧美午夜伦理在线观看| 欧美日韩精品综合一区| 日韩欧美中文字幕人妻| 亚洲欧洲在线一区二区三区| 色婷婷人妻av毛片一区二区三区| 亚洲中文字幕免费人妻| 欧美成人精品一区二区久久| 国产又黄又爽又粗视频在线| 欧美精品久久99九九| 日本欧美三级中文字幕| 九九热视频免费在线视频| 麻豆视传媒短视频在线看| 亚洲色图欧美另类人妻| 久久亚洲成熟女人毛片| 黑人粗大一区二区三区| 亚洲精品一区二区三区日韩| 国产欧美日韩精品一区二区| 国产一级特黄在线观看| 激情内射亚洲一区二区三区| 99国产高清不卡视频| 久久精品亚洲情色欧美| 不卡中文字幕在线视频| 不卡一区二区在线视频| 国产精品一区二区三区欧美| 国产一区二区三区香蕉av| 九九热最新视频免费观看| 色一欲一性一乱—区二区三区| 欧美野外在线刺激在线观看|