①yum -y update yum install -y docker 安装docker
②docker启动,关闭,重启
service docker start
service docker stop
service docker restart
②在线安装java镜像
docker search java
国外镜像仓库下载熟读慢,建议使用国内DaoCloud
访问www.daocloud.io网站。
配置docker加速器,将linux指令放到Linux上执行一遍。需要注意的是regisry-mirrors结尾多一个“,”,我们要把逗号删除,否则无法使用
vi /etc/docker/daemon.json把最后的逗号删除即可
service docker restart 重启docker
docker pull docker.io/java
docker images 查看docker里面安装的镜像是什么
docker save > /home/java.tar.gz 从docker导出镜像
docker load < /home/java.tar.gz 导入镜像
docker images
docker rmi java 删除镜像
6.启动镜像创建一个运行状态的容器
docker run -it --name myjava java bash
docker run -it --name myjava -p 9000:8080 -p 9001:8085 java bash
docker run --it --name myjava -v /home/project:/soft --privileged java bash
--it表示启动容器之后开启一个交互的界面
--name 给容器起名字
docker pause myjava
docker unpause myjava
docker top myjava
docker start -i myjava
docker rm myjava
docker ps -a 查看容器中跑的程序
6.安装pxc镜像
docker pull docker.io/percona/percona‐xtradb‐cluster
给docker镜像取别名
docker tag docker.io/percona/percona‐xtradb‐cluster pxc
删除之前的镜像名字
docker rmi docker.io/percona/percona‐xtradb‐cluster
7.出于安全考虑,需要给pxc集群实例创建Docker内部网络。使用docker端口内部映射机制实现。
docker network create net1 创建一个网段
docker network inspect net1查询这个网段的信息
docker network rm net1 删除这个网段
docker network create --subnet=172.18.0.0/24 net1
pxc无法直接使用映射目录。docker volume create --name v1
docker volume create v1创建一个卷
docker inspect v1 查看卷映射到宿主机的什么位置了。
docker volume rm v1 删除卷
向pxc镜像传入运行参数就能创建pxv容器
docker run -d -p 3306:3306 (-d 后台运行 -p 端口映射 宿主机3306映射到容器3306)
-v v1:/var/lib/mysql (v1刚才创建的数据卷映射到镜像/var/lib/mysql)
-e MYSQL_ROOT_PASSWORD=abc123456
-e CLUSTER_NAME=PXC (pxc集群的名字)
-e XTRABACKUP_PASSWORD=abc123456 (数据库同步需要的密码)
--privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc (最高权限,容器的名字,分配网段以及对应网段,pxc镜像名字)
创建第一个pxc容器第一个mysql的时候,一定要等待Mysql初始化完成。
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql -v backup:/data --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql -v backup:/data --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
8.负载均衡
引入haproxy转发器。应用程序发送请求到haproxy。通过它转发给pxc集群的每一个数据库。
haproxy相比nginx,tcp/ip协议支持的好,nginx是最近几年支持tcp/ip。lvs不能在虚拟机安装。
(1)安装
docker pull haproxy
创建haproxy配置文件
touch /home/soft/haproxy/haproxy.cfg
配置文件详情可以参考c
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运行容器内部
docker exec -it h1 bash
haproxy -f /user/local/etc/haproxy/haproxy.cfg
选择一个数据库创建一个用户
create user 'haproxy'@'%' identified by '';
访问地址: http://192.168.1.102:4001/dbs
docker stop node1 暂停某个数据库节点
pxc数据的强一致性使用的是同步复制,事务再所有集群节点中要么同时提交,要么不提交
replication采用异步复制,无法保证数据的一致性(第一个库成功,第二个库失败,事务不会滚)
(2)高可用haproxy双机热备方案
haproxy冗余设计方案防止haproxy挂掉。利用keepalived实现双击热备份。
docker内的虚拟ip不能被外网使用,所以需要借助宿主机keepalived映射成外网可以访问的虚拟ip。
用户发请求,通过宿主机的keepalived映射到docker的虚拟ip上。通过docker中的keepalived集群抢占有一个主keepalived,然后转发给某个节点。
(3)keepalived必须安装在haproxy所在的容器内。
apt-get update (注意先apt-get加速)
apt-get install keepalived
haproxy是在unbount创建的,所以需要apt-get指令。
keepalived在运行的时候会争抢ip。其配置文件/etc/keepalived/keepalived.conf
apt-get install vim
vim /etc/keepalived/keepalived.conf 当然最好在线下配置好直接上传。
docker run -it -d -p 4003:8888 -p 4004:3306 -v /home/soft/haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg --name h2 --privileged --net=net1 --ip 172.18.0.8 haproxy
安装PXC镜像
docker pull percona/percona-xtradb-cluster
为PXC镜像改名
docker tag percona/percona-xtradb-cluster pxc
docker rmi percona/percona-xtradb-cluster
创建net1网段docker network create --subnet=172.18.0.0/16 net1
创建5个数据卷docker volume create --name v1
docker volume create --name v2
docker volume create --name v3
docker volume create --name v4
docker volume create --name v5
创建备份数据卷(用于热备份数据)
docker volume create --name backup
#创建第1个MySQL节点
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged --name=node1 --net=net1 --ip 172.18.0.2 pxc
#创建第2个MySQL节点
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v2:/var/lib/mysql -v backup:/data --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc
#创建第3个MySQL节点
docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v3:/var/lib/mysql --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc
#创建第4个MySQL节点
docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v4:/var/lib/mysql --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc
#创建第5个MySQL节点
docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=abc123456 -e CLUSTER_JOIN=node1 -v v5:/var/lib/mysql -v backup:/data --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc
安装Haproxy镜像
docker pull haproxy
宿主机上编写Haproxy配置文件
vi /home/soft/haproxy.cfgglobal
#工作目录
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 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
Haproxy容器内安装Keepalived,设置虚拟IP#进入h1容器
docker exec -it h1 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件(参考下方配置文件)
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
#宿主机执行ping命令
ping 172.18.0.201
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
}
}
#进入h2容器
docker exec -it h2 bash
#更新软件包
apt-get update
#安装VIM
apt-get install vim
#安装Keepalived
apt-get install keepalived
#编辑Keepalived配置文件
vim /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
#宿主机执行ping命令
ping 172.18.0.201
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
}
}
宿主机安装Keepalived,实现双击热备#宿主机执行安装Keepalived
yum -y install keepalived
#修改Keepalived配置文件
vi /etc/keepalived/keepalived.conf
#启动Keepalived
service keepalived start
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.99.150
}
}
virtual_server 192.168.99.150 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.99.150 3306 {
delay_loop 3
lb_algo rr
lb_kind NAT
persistence_timeout 50
protocol TCP
real_server 172.18.0.201 3306 {
weight 1
}
}
xtrabackup备份过程不锁表,快速可靠。
xtrabackup备份过程不会打断正在执行的事务。
xtrabackup能够基于压缩等功能节约磁盘空间和流量。
备份又可以分全量备份,增量备份。第一份采用全量备份,其他采用增量备份。
xtrabackup备份的数据要保持到宿主机上,利用映射。
docker volume create backup
docker stop node1
docker rm node1
创建一个新的容器node1
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=abc123456 -e CLUSTER_NAME=PXC
-e XTRABACKUP_PASSWORD=abc123456 -v v1:/var/lib/mysql -v backup:/data --privileged -e
CLUSTER_JOIN=node2 --name=node1 --net=net1 --ip 172.18.0.2 pxc
选择集群中的node2进行同步
docker exec -it node1 bash 进入node1容器
apt-get update
apt-get install percona-xtrabackup-24
innobackupex --user=root --password=abc123456 /data/backup/full (进行全量备份)
数据库可以热备份,但是不能热还原。为了避免恢复过程中的数据同步,我们采用空白的mysql还原数据,然后再建立pxc集群。
还原数据前把未提交的事务回滚,还原数据之后重启mysql。
rm -rf /var/lib/mysql
innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/2018-04-15_05-09-07/(未提交的事务回滚)
innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/2018-04-15_05-09-07/