Neokylin-Server離線環境、跨主機、使用Docker部署PXC集群
- Neokylin-Server離線環境、跨主機、使用Docker部署PXC集群
- 一、說明
- 二、部署程序:
- 1. 切換root賬號或所有陳述句加sudo;
- 2. 關閉6個節點防火墻(或打開埠);
- 3. 6個節點匯入rpm包后安裝基礎環境:
- 4. 設定所有節點;
- 5. 啟動docker并匯入images;
- 6. 時間同步;
- 7. etcd集群配置;
- 8. 部署flannel網路;
- 9. n1-n3部署pxc;
- 10. m1-m3部署Haproxy+Keepalived容器;
- 11. m1-m3宿主機部署keepalived:
- 12. 宕機
Neokylin-Server離線環境、跨主機、使用Docker部署PXC集群
一、說明
背景:NeoKylin使用swarm、macvlan、calico組網docker環境中pxc高可用不成功后,使用flannel+etcd成功,記錄程序如下,
系統:Neokylin-Server-5.0_U4-x86_64-Release-B14-20190320,
使用說明:pxc做集群;Haproxy做負載均衡;Keepalived浮動ip;etcd+Flannel保證容器跨主機互通;ntpdate時間同步、busybox做測驗
環境:
| 虛擬機(節點)名稱 | ip | 部署 |
|---|---|---|
| m1 | 192.168.136.21 | Haproxy、Keepalived、etcd、busybox |
| m2 | 192.168.136.22 | Haproxy、Keepalived、etcd、busybox |
| m3 | 192.168.136.23 | Haproxy、Keepalived、etcd、busybox |
| n1 | 192.168.136.26 | pxc、busybox |
| n2 | 192.168.136.27 | pxc、busybox |
| n3 | 192.168.136.28 | pxc、busybox |
部署相關檔案:
- 鏈接:https://pan.baidu.com/s/1OAsF0Kq–umgBZIIHVSWpg
提取碼:e39i
二、部署程序:
1. 切換root賬號或所有陳述句加sudo;
2. 關閉6個節點防火墻(或打開埠);
systemctl stop firewalld
systemctl disable firewalld
3. 6個節點匯入rpm包后安裝基礎環境:
rpm基礎環境包放置于百度網盤中
rpm -ivh *.rpm --replacefiles --force –nodeps
說明:安裝基礎環境,docker,ntpdate,keepalived,flannel,etcd,其中etcd只有m1、m2、m3使用
4. 設定所有節點;
修改6個節點名稱為m1、m2、m3、n1、n2、n3
hostnamectl set-hostname <newhostname>
修改6個節點hosts檔案
vim /etc/hosts
結尾追加
192.168.136.21 m1
192.168.136.22 m2
192.168.136.23 m3
192.168.136.26 n1
192.168.136.27 n2
192.168.136.28 n3
5. 啟動docker并匯入images;
設定6個節點自啟動docker
systemctl start docker
systemctl enable docker
匯入docker images,為后續使用做準備,陳述句舉例:
docker load < pxc56.tar
| 虛擬機(節點)名稱 | 匯入images |
|---|---|
| m1 | my-haproxy.tar、busybox.tar |
| m2 | my-haproxy.tar、busybox.tar |
| m3 | my-haproxy.tar、busybox.tar |
| n1 | pxc56.tar、busybox.tar |
| n2 | pxc56.tar、busybox.tar |
| n3 | pxc56.tar、busybox.tar |
6. 時間同步;
6個節點通過ntpdate時間同步,一般需要聯網同步,這里使用時間服務器,192.168.136.1設定為提供ntp服務的win10電腦:
ntp 192.168.136.1
也可以通過聯網時間同步:
ntpdate cn.pool.ntp.org
7. etcd集群配置;
備份etcd的組態檔:
cp /etc/etcd/etcd.conf /etc/etcd/etcd.conf.bak
編輯m1主機/etc/etcd/etcd.conf檔案為:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="m1"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://m1:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://m1:2379,http://m1:4001"
ETCD_INITIAL_CLUSTER="m1=http://m1:2380,m2=http://m2:2380,m3=http://m3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
編輯m2主機/etc/etcd/etcd.conf檔案為:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="m2"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://m2:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://m2:2379,http://m2:4001"
ETCD_INITIAL_CLUSTER="m1=http://m1:2380,m2=http://m2:2380,m3=http://m3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
編輯m3主機/etc/etcd/etcd.conf檔案為:
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="m3"
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://m3:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://m3:2379,http://m3:4001"
ETCD_INITIAL_CLUSTER="m1=http://m1:2380,m2=http://m2:2380,m3=http://m3:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
修改m1~m3主機的/usr/lib/systemd/system/etcd.service檔案為:
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=/etc/etcd/etcd.conf
User=etcd
# set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\""
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
配置完后,在m1~m3上設定自啟并啟動etcd服務,
systemctl daemon-reload && systemctl enable etcd && systemctl start etcd
在m1~m3主機上,可通過etcdctl member list命令查看etcd集群節點資訊
8. 部署flannel網路;
將所有docker容器部署于flannel網路中,可使得容器間可以跨主機通信,也可以使宿主與容器通信,
在所有主機上,備份flanneld檔案
cp /etc/sysconfig/flanneld /etc/sysconfig/flanneld.bak
修改所有主機上的/etc/sysconfig/flanneld 為如下內容:
# Flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://m1:2379,http://m2:2379,http://m3:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
#FLANNEL_ETCD_PREFIX="/atomic.io/network"
FLANNEL_ETCD_PREFIX="/coreos.com/network"
# Any additional options that you want to pass
#FLANNEL_OPTIONS=""
然后只需在m1主機上執行
etcdctl mk /coreos.com/network/config '{ "Network": "192.168.0.0/16" }'
將所有主機的/usr/lib/systemd/system/docker.service檔案中ExecStart=/usr/bin/dockerd修改為下面兩行:
EnvironmentFile=-/run/flannel/docker
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
以上配置完成后,執行以下命令
systemctl enable flanneld.service && systemctl start flanneld.service && systemctl restart docker
測驗flannel網路
例如使用busybox測驗,在所有主機運行busybox容器,用來測驗flannel網路
docker run -it -d --name=bbox busybox /bin/sh && docker exec -it bbox /bin/sh
在容器中運行ip a命令,如下圖所示

各主機上busybox容器的IP如下:
| busybox IP | 所屬主機 |
|---|---|
| 192.168.88.2 | m1 |
| 192.168.69.2 | m2 |
| 192.168.72.2 | m3 |
| 192.168.53.2 | n1 |
| 192.168.14.2 | n2 |
| 192.168.4.2 | n3 |
m1主機 ping n3主機的busybox容器IP 192.168.4.2,如下圖:

m2主機的busybox容器 ping n1主機的busybox容器IP 192.168.53.2,如下圖:

以上測驗通過,說明各主機、主機上的容器現在可通過flannel跨主機網路相互通信,為后續在麒麟系統上使用docker容器搭建應用打下基礎,
9. n1-n3部署pxc;
通過docker本地安裝pxc5.6,使用5.6是因為該環境高版本多節點部署有問題,pxc5.7版本不支持不使用k8s或者etcd模式的docker集群,
洗掉資料卷,每次重裝pxc前最好做一次
docker volume rm v1
創建名稱為v1的資料卷,–name可以省略
docker volume create --name v1
查看資料卷
docker inspect v1
創建3個PXC容器構成集群
n1節點執行
docker run -d -p 3306:3306 -p 3307:3307 -p 4567:4567 -p 4568:4568 -p 4444:4444 -p 8888:8888 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql --name=n1 pxc
在第一個節點啟動后要等待一段時間,等候mysql啟動完成,
n2節點執行
docker run -d -p 3306:3306 -p 3307:3307 -p 4567:4567 -p 4568:4568 -p 4444:4444 -p 8888:8888 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=192.168.136.26 -v v1:/var/lib/mysql --name=n2 pxc
n3節點執行
docker run -d -p 3306:3306 -p 3307:3307 -p 4567:4567 -p 4568:4568 -p 4444:4444 -p 8888:8888 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=192.168.136.26 -v v1:/var/lib/mysql --name=n3 pxc
在n1節點添加賬號,三臺可自動同步,為Haproxy做準備
docker exec -it n1 /usr/bin/mysql -uroot -pabc123456
create user 'haproxy'@'%' identified by '';
10. m1-m3部署Haproxy+Keepalived容器;
使用Haproxy做負載均衡與監聽pxc,keepalive做熱備份與虛擬IP;
m1-m3安裝Haproxy+keepalived
3個節點在/home/soft/haproxy/下放置haproxy.cfg,內容如下
# haproxy.cfg
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和埠
bind 0.0.0.0:8888
#訪問協議
mode http
#URI相對地址
stats uri /dbs
#統計報告格式
stats realm Global\ statistics
#登陸帳戶資訊
stats auth admin:abc123456
#資料庫負載均衡
listen proxy-mysql
#訪問的IP和埠
bind 0.0.0.0:3306
#網路協議
mode tcp
#負載均衡演算法(輪詢演算法)
#輪詢演算法:roundrobin
#權重演算法:static-rr
#最少連接演算法:leastconn
#請求源IP演算法:source
balance roundrobin
#日志格式
option tcplog
#在MySQL中創建一個沒有權限的haproxy用戶,密碼為空,Haproxy使用這個賬戶對MySQL資料庫心跳檢測
option mysql-check user haproxy
server MySQL_1 192.168.136.26:3306 check weight 1 maxconn 2000
server MySQL_2 192.168.136.27:3306 check weight 1 maxconn 2000
server MySQL_3 192.168.136.28:3306 check weight 1 maxconn 2000
#使用keepalive檢測死鏈
option tcpka
/home/soft/keepalived/下放置keepalived.conf,內容如下
vrrp_instance VI_1 {
state MASTER # Keepalived的身份(MASTER主服務要搶占IP,BACKUP備服務器不會搶占IP),
interface eth0 # docker網卡設備,虛擬IP所在
virtual_router_id 51 # 虛擬路由標識,MASTER和BACKUP的虛擬路由標識必須一致,從0~255
priority 100 # MASTER權重要高于BACKUP數字越大優先級越高
advert_int 1 # MASTER和BACKUP節點同步檢查的時間間隔,單位為秒,主備之間必須一致
authentication { # 主從服務器驗證方式,主備必須使用相同的密碼才能正常通信
auth_type PASS
auth_pass 123456
}
virtual_ipaddress { # 虛擬IP,可以設定多個虛擬IP地址,每行一個
192.168.65.201
}
}
keepalived的組態檔的權限設定是644
chmod 644 keepalived.conf
這里已經將Haproxy和Keepalived合成一個容器,同時啟動,
m1執行:
docker run -it -d -p 4003:8888 -p 3306:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy -v /home/soft/keepalived:/etc/keepalived --name hlyc1 --privileged my-haproxy
m2執行:
docker run -it -d -p 4003:8888 -p 3306:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy -v /home/soft/keepalived:/etc/keepalived --name hlyc2 --privileged my-haproxy
m3執行:
docker run -it -d -p 4003:8888 -p 3306:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy -v /home/soft/keepalived:/etc/keepalived --name hlyc3 --privileged my-haproxy
Haproxy完成負載均衡,keepalived容器對flannel網外暴露192.168.65.201,可供宿主機使用
Haproxy登錄界面
http://192.168.136.21:4003/dbs
http://192.168.136.22:4003/dbs
http://192.168.136.23:4003/dbs
用戶名admin,密碼abc123456,
11. m1-m3宿主機部署keepalived:
Docker內的ip在flannel組網中,不能被外網訪問,所有需要借助宿主機Keepalived映射成外網可以訪問的虛擬ip,這里設定為 192.168.65.201
在3個節點/etc/keepalived/目錄放置keepalived.conf,內容如下:
vrrp_instance VI_1 {
state MASTER
#這里是宿主機的網卡,可以通過ip a查看當前自己電腦上用的網卡名是哪個
interface enp0s3
virtual_router_id 100
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#這里是指定的一個宿主機上的虛擬ip,一定要和宿主機網卡在同一個網段,
#我的宿主機網卡ip是192.168.63.144,所以指定虛擬ip是160
192.168.136.160
}
}
#接受監聽資料來源的埠,網頁入口使用
virtual_server 192.168.136.160 8888 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
#把接受到的資料轉發給docker服務的網段及埠,由于是發給docker服務,所以和docker服務資料要一致,這里使用flannel分配地址
real_server 192.168.65.201 8888 {
weight 1
}
real_server 192.168.34.201 8888 {
weight 1
}
real_server 192.168.78.201 8888 {
weight 1
}
}
#接受資料庫資料埠,宿主機資料庫埠是3306,所以這里也要和宿主機資料接受埠一致
virtual_server 192.168.136.160 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
#同理轉發資料庫給服務的埠和ip要求和docker服務中的資料一致,這里使用flannel分配地址
real_server 192.168.65.201 3306 {
weight 1
}
real_server 192.168.34.201 3306 {
weight 1
}
real_server 192.168.78.201 3306 {
weight 1
}
}
m1、m2、m3執行:
systemctl start keepalived
systemctl enable keepalived
flannel網外可訪問資料庫地址192.168.136.160:3306,是pxc對外統一介面,具有負載均衡、浮動ip,至此,pxc集群安裝結束,
12. 宕機
當有一個pxc節點宕機后,將該節點資料卷中的grastate.dat檔案洗掉
rm -rf /var/lib/docker/volumes/v1/_data/grastate.dat
再以從節點的方式加入pxc集群中,這里舉例初始主節點n1節點宕機后,n1以從節點方式加入組網
docker run -d -p 3306:3306 -p 3307:3307 -p 4567:4567 -p 4568:4568 -p 4444:4444 -p 8888:8888 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=192.168.136.28 -v v1:/var/lib/mysql --name=n1 pxc
當有兩個節點宕機后,將兩個節點grastate.dat檔案洗掉,再以從節點形式加入沒宕機節點,
當三個節點全部宕機,將所有節點資料卷中的grastate.dat檔案洗掉,不要洗掉v1中其它檔案,檢查Haproxy,按最后宕機的為主節點依次啟動三個節點,即可恢復資料,
參考檔案:
Docker部署Mysql集群.
NeoKylin-Server-5.0 離線部署 etcd+flannel 集群,實作 docker 容器跨主機網路通信.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/259837.html
標籤:其他
下一篇:常用的DOC命令
