有了docker虛擬機,就需要利用平臺部署數(shù)據(jù)庫的集群,在實際操作之前介紹下數(shù)據(jù)庫集群的方案和各自的特點。源碼:https://github.com/limingios/netFuture/tree/master/mysql-pxc/
集群的方案單節(jié)點的弊病大型互聯(lián)網(wǎng)程序用戶群體龐大,所以架構(gòu)必須要特殊設(shè)計 單節(jié)點的數(shù)據(jù)庫無法滿足性能的要求 >案例15年前,高考成績可以在網(wǎng)上查(河南幾十萬考生),那時候基本家里都沒電腦,都是去網(wǎng)吧白天去網(wǎng)吧也查不了,太慢了,后來半夜通宵有時候可以查到,也就是說白天基本查不了人太多了。晚上看運氣。一個數(shù)據(jù)庫的實例1萬多人就無法反應(yīng)了。 單節(jié)點的數(shù)據(jù)庫沒有冗余設(shè)計,無法滿足高可用
常用的mysql集群設(shè)計方案速度快 弱一致性 低價值 場景:日志,新聞,帖子
速度慢 強一致性 高價值 場景:訂單,賬戶,財務(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ù)。
Replication方案,主從的方式,他是采用異步的方式。
環(huán)境搭建應(yīng)用 | IP地址 | 服務(wù) | 配置 | 安裝應(yīng)用 | 安裝方式 |
---|
docker-mysql | 192.168.66.100 | docker-mysql | 雙核 8g內(nèi)存 | docker-mysql | docker |
(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上面安裝。
docker pull percona/percona-xtradb-cluster
#本地安裝
docker load </home/soft/pxc.tar.gz
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
之前一直有個疑問,如果直接映射目錄的吧,存在失敗的問題,現(xiàn)在終于知道解決方案了,直接映射docker卷就可以可以忽略這個問題了。 容器中的PXC節(jié)點映射數(shù)據(jù)目錄的解決方法
docker volume create name --v1
mysql pxc搭建#!/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é)點很閑。
mkdir haproxy/h1
pwd
vi 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
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
正常的連接haproxy,傳遞增刪蓋查,其實是通過輪詢的方式。選擇mysql的節(jié)點。均勻的分發(fā)給mysql的實例。不會吧數(shù)據(jù)庫的請求都集中在一個節(jié)點上。把請求分散出去,每個數(shù)據(jù)庫實例獲取到的請求就小很多了。這就是數(shù)據(jù)庫的負載。
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-get clean
apt-get update
apt-get install keepalived
apt-get install vim
vi /etc/keepalived/keepalived.conf
VI_1 名稱可以自定義 state MASTER | keepalived的身份(MASTER主服務(wù)器,BACKUP備份服務(wù)器,不會搶占虛擬機ip)。如果都是主MASTER的話,就會進行互相爭搶IP,如果搶到了就是MASTER,另一個就是SLAVE。 interface網(wǎng)卡,定義一個虛擬IP定義到那個網(wǎng)卡上邊。網(wǎng)卡設(shè)備的名稱。eth0是docker的虛擬網(wǎng)卡,宿主機是可以訪問的。 virtual_router_id 51 | 虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致。標識可以是0-255。 priority 100 | 權(quán)重。MASTER權(quán)重要高于BACKUP 數(shù)字越大優(yōu)選級越高。可以根據(jù)硬件的配置來完成,權(quán)重最大的獲取搶到的級別越高。 advert_int 1 | 心跳檢測。MASTER與BACKUP節(jié)點間同步檢查的時間間隔,單位為秒。主備之間必須一致。 authentication | 主從服務(wù)器驗證方式。主備必須使用相同的密碼才能正常通信。進行心跳檢測需要登錄到某個主機上邊所有有賬號密碼。 virtual_ipaddress | 虛擬ip地址,可以設(shè)置多個虛擬ip地址,每行一個。根據(jù)上邊配置的eth0上配置的ip。
service keepalived start
宿主機ping這個ip
ping 172.18.0.201
創(chuàng)建haproxy2容器,并配置與haproxy1相同的環(huán)境因為要保證有2個haproxy 和keepalived,這次就不那么麻煩了。直接對一個鏡像里面包括keeplived 和 haproxy。
mkdir haproxy/h2
cd haproxy/h2
vi haproxy.cfg
vi keepalived.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
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 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
宿主機安裝keepalivedyum -y install keepalived
vi /etc/keepalived/keepalived.conf
#刪除這個表里之前存在的內(nèi)容
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集群的高性能,高負載,高可用基本完成了,可用按照這個思路搭建不同的主機下。
|