docker部署mysql集群
docker部署mysql集群
docker部署mysql集群
1.0 安装环境
1.1 安装Centos7
Docker官方建议在Ubuntu中安装,因为Docker是基于Ubuntu发布的,而且一般Docker出现的问题Ubuntu是最先更新或者打补丁的。在很多版本的CentOS中是不支持更新最新的一些补丁包的。
如果docker安装在centos上面建议用Centos7版本,在CentOS6.x的版本中,安装前需要安装其他很多的环境而且Docker很多补丁不支持更新。
1.2 安装Docker
# 更新原有安装包yum -y update# 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 安装dockersudo yum install docker-ce
1.21 docker常用命令
linux 的 service 和 systemctl 命令大致区别
启用可以用service docker start也可以用systemctl start docker其他重启停止也可以用systemctl
CentOS 7.x 开始,CentOS 开始使用 systemd 服务来代替 daemon,原来管理系统启动和管理系统服务的相关命令全部由 systemctl命 令来代替。
service命令是Redhat Linux兼容的发行版中用来控制系统服务的实用工具,它以启动、停止、重新启动和关闭系统服务,还可以显示所有系统服务的当前状态。
service启动缺点
一是启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init 进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长
systemctl 优缺点
Systemd 的优点是功能强大,使用方便,缺点是体系庞大,非常复杂。事实上,现在还有很多人反对使用 Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反 “keep simple, keep stupid” 的Unix 哲学。
# 查看docker版本docker -v# 启动 service docker start# 停止service dockerstop# 重启service docker restart# 开机启动systemctl enable docker# 重启dockersystemctl restart docker
1.21 在线安装docker镜像
# 搜索java镜像docker search java#拉取java镜像docker pull java
docker仓库是部署在国外服务器上面的,所以如果在国内拉取镜像那将是一个非常漫长的过程,因此我们可以用一些国内的镜像仓库,比如阿里云的又或者加速器DaoCloud
1.22 配置Docker加速器
配置阿里云镜像加速器
配置阿里云镜像加速器需要注册账号
https://cr.console.aliyun.com/#/imageList)
注册之后点击左下方镜像加速器会生成一个专属加速网址
将生成的专属网址,加入/etc/docker/daemon.json即可
# 修改docker配置文件vi /etc/docker/daemon.json
配置Daocloud加速器
官网:https://www.daocloud.io/mirror
#配置加速器命令(复制粘贴执行即可)Ps:此命令仅克用于Linux操作系统curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
注意:在设置完成后,可能有一个坑存在的,执行命令设置后,它会在docker配置文件中添加一个地址,但是地址后面是多了一个,号的,需要手动删除
删除配置文件中多余的,号
# 修改docker配置文件 vi /etc/docker/daemon.json
1.23 导出和导出镜像
# 导出镜像docker save 镜像名>导出路径 docker sava tomcat > /home/tomcat.tar.gz# 导入镜像 docker load<镜像文件路径 docker load < /home/mysql.tar.gz#查看docker已有镜像docker images# 删除镜像docker rmi 镜像名 docker rmi reids#修改镜像名docker tag 原镜像名 修改后镜像名 docker tag docker.io/percona/percona-xtradb-cluster pxc
1.24 容器相关命令
# 创建并且启动一个容器# -it表示启动容器后开启一个交互的界面 --name 给容器起一个名字不取就没有可通过id辨别 bash代表启动程序后运行什么样的成员bash=bash命令行docker run -it --name myTomcat tomcat bash# 开启容器并且映射端口 -p 8088:8080代表将容器8080端口映射到宿主机8088上面 可以映射多个端口 docker run -it --name myTomcat -p 8088:8080 -p 8089:3306 tomcat bash# 开启容器并且映射目录或者文件# -v宿主机目录映射到容器中/home/data:/mysqlData冒号之前是宿主机的目录集将目录/home/data映射到/mysqlData# --privileged这个是代表容器操作映射目录使用的是最高权限,即可读可写可执行docker run -it --name myTomcat -v /home/data:/mysqlData --privileged tomcat bash# 三条命令合一docker run -it -p 8088:8080 -p 8089:3306 -v /home/data:/mysqlData --privileged --name myTomcat tomcat bash# 停止容器 myTomcat是容器名字没有可以通过容器id识别docker pause myTomcat# 恢复容器docker unpauser myTomcat# 彻底停止容器docker stop myTomcat# 重新启动容器docker start -i myTomcat# 退出交互页面开启容器-it执行的(同时会彻底关闭容器)exit# 删除容器docker rm myTomcat# 进入容器docker exec -it 容器名 bash # 重命名容器名docker rename 原容器名称 新容器名称
PS:
以上仅仅是Docker基础命令
Docker后面还有
容器数据卷
DockerFile(制作镜像使用)
Docker Compose (多容器管理)
Docker Swarm (docker集群)
2.0 基于Docker部署Mysql集群
2.01 单节点数据库的弊端
大型互联网程序用户群体庞大,所以架构必须要特殊设计
单节点的数据库无法满足性能上的要求
单节点设计,无冗余设计,一旦数据库宕机,整个系统面临崩溃,无法满足高可用
2.02 常见Mysql数据库集群方案
常见的mysql集群有两种:
速度快,但仅能保证弱一致性,适用于保存价值不高的数据,比如日志、帖子、新闻等。
采用master-slave结构,在master写入会同步到slave,能从slave读出;但在slave写入无法同步到master。
采用异步复制,master写入成功就向客户端返回成功,但是同步slave可能失败,会造成无法从slave读出的结果。
Replication
速度慢,但能保证强一致性,适用于保存价值较高的数据,比如订单、客户、支付等。
数据同步是双向的,在任一节点写入数据,都会同步到其他所有节点,在任何节点上都能同时读写。
采用同步复制,向任一节点写入数据,只有所有节点都同步成功后,才会向客户端返回成功。事务在所有节点要么同时提交,要么不提交。
PXC (Percona XtraDB Cluster)
2.1 Docker安装PXC
PXC既然能保障强一致性,那么当一个节点宕机了,其他节点无法向这个节点,写入数据,那是不是意味着整个,mysql集群就挂掉了呢?
其实如果说不介入中间件的情况下,确实是这样的,一旦一个节点宕机,那么其他节点都将无法写入数据,就相当于整个集群,挂了
但是采用PXC做数据库集群,肯定会采用中间件比如支持tcp协议Haproxy和Nginx
因为每个PXC节点都是可以读写的,所以SQL语句无论读写,发送哪个节点都可以执行。有一个节点挂掉也不怕,因为Haproxy有心跳检测,节点宕机,就不向这个节点发送SQL语句。当然一个Haproxy还存在宕机的问题,所以可以配置双机热备的Haproxy方案
# docker拉去安装PXC # 这边使用的nysql是5.7.21版本的,我现在部署的项目使用的数据库就是这个版本,用mysql8就需要修改一些配置# 需要注意的是,如果你使用的是mysql8,pxc是需要设置一个ssl秘钥的,否则启用第二个节点会爆错docker pull percona/percona-xtradb-cluster:5.7.21# docker本地安装PXCdoker load < 镜像压缩文件路径
2.12 设置PXC内部网络
# docker自带网段172.17.0....多个网段一次类推docker network create network1 docker network create network2 docker network create network3# 创建自定义ip 网段--subnet=172.19.0.0/24指定网段为172.19.0.0子网掩码24位docker network create --subnet=172.19.0.0/24 network1# 查看已经创建网段docker network inspect 网段名# 删除已有网段docker network rm 网段名
2.13 创建Docker数据卷
pxc在容器中使用是无法直接使用映射目录的,所以为它创建docker容器卷
# 创建docker卷docker volume create --name 卷名# 查看数据卷具体位置docker inspect 卷名# 删除数据卷docker volume rm 卷名
2.14 创建PXC容器
# 创建第1个MySQL节点docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v v1:/var/lib/mysql --privileged --name=pxcnode1 --net=network1 --ip 172.19.0.2 pxc# 创建第2个MySQL节点# 需要注意,只有当第一个节点的mysql完全启动后(在本地连接成功后)才可以创建第二个,第三个docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v2:/var/lib/mysql --privileged --name=pxcnode2 --net=network1 --ip 172.19.0.3 pxc# 创建第3个MySQL节点docker run -d -p 3308:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v3:/var/lib/mysql --privileged --name=pxcnode3 --net=network1 --ip 172.19.0.4 pxc# 创建第4个MySQL节点docker run -d -p 3309:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v4:/var/lib/mysql --privileged --name=pxcnode4 --net=network1 --ip 172.19.0.5 pxc# 创建第5个MySQL节点并映射数据库热备数据卷用于后面热备数据docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pxcnode1 -v v5:/var/lib/mysql -v backupv:/data --privileged --name=pxcnode5 --net=network1 --ip 172.19.0.6 pxc
PXC容器全部启动成功
容器启动失败
当容器启动失败后,通过log查看具体错误,并修改。
当你在其中一个数据库中添加表或者数据,其他四个数据库也会同步添加
当你把其中一个节点关闭后,数据库将无法插入数据,(强一致性)
2.2 数据库负载均衡
复制均衡的中间件,常用的有4个
Haproxy
Nginx
Apache
LVS
Haproxy,Nginx,Apache,LVS对比
Nginx最近几年才支持tcp协议
Apache不支持tcp无法使用
LVS其实性能最好的,但是无法在虚拟机使用
Haproxy不支持插件,但是对比其他几个,个人感觉这个比价合适
不使用负载均衡的弊端
所有请求都发送到一个数据库,而其他数据库,只做同步,此时数据库1负载时很高的,而数据库2,3,4却很空闲
当数据库1承受不住压力宕机了,其他节点也就无法使用
当数据库2意外宕机了,而正常处理请求的数据库1也无法在写入数据
使用负载均衡的优点
使用Haproxy,Haproxy会将应用程序发送的请求均匀的分发到每一个pxc节点上面,使每个节负载比较低
Haproxy有心跳检测,节点宕机,就不向这个节点发送请求,即使其中一个节点意外宕机了,也不会使整个服务挂掉
2.21 安装Haproxy
#拉去Haproxy镜像docker pull docker.io/haproxy:2.0
2.22 创建Haproxy配置文件
mkdir /home/soft/haproxy vi /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:18081 #访问协议 mode http #URI相对地址 stats uri /dbs #统计报告格式 stats realm Global\ statistics #登陆帐户信息 stats auth admin:123456#数据库负载均衡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数据库心跳检测 #server LmhcBlogDB1 172.19.0.2:3306 check weight 1 maxconn 2000 #LmhcBlogDB1名字随意 172.19.0.2:3306容器ip端口 check发送心跳监测 weight 1权重采用权重算法才会生效 maxconn 2000最大连接数 option mysql-check user haproxy server LmhcBlogDB1 172.19.0.2:3306 check weight 1 maxconn 2000 server LmhcBlogDB2 172.19.0.3:3306 check weight 1 maxconn 2000 server LmhcBlogDB3 172.19.0.4:3306 check weight 1 maxconn 2000 server LmhcBlogDB4 172.19.0.5:3306 check weight 1 maxconn 2000 server LmhcBlogDB5 172.19.0.6:3306 check weight 1 maxconn 2000 #使用keepalive检测死链 option tcpka
2.23 创建Haproxy容器
# 创建Haproxy容器# 注意:不同版本的haproxy映射的目录是不一样的,如果容器创建成功后没有启动或者处于创建状态先去看他的log,haproxy的log会给你一个可以执行的目录docker run -it -d -p 5000:18081 -p 5001:3306 -v /home/soft/haproxy:/usr/local/etc/haproxy --name lmhcblogh1 --privileged --net=network1 --ip 172.19.0.7 124f5f3f731b # 进入容器 指明配置文件位置docker exec -it lmhcblogh1 bash haproxy -f /usr/local/etc/haproxy/haproxy.cfg /usr/local/etc/haproxy# Haproxy 后台登录宿主机ip:5000/dbs
-- 创建haproxy账号创建这个账号是无法连接,haproxy要用这个账号去向pxc发送心跳监测create user 'haproxy'@'%' IDENTIFIED BY '';
HaproxyWeb界面
2.24 Haproxy双机热备
单节点Haproxy是不具备高可用的 当Haproxy出现故障宕机,应用将无法在于数据库做交互,
利用Keepalived实现双击热备
Keepalived执行方式类似于线程是抢占式的,两个Keepalived抢一个虚拟Haproxy ip,其中一个Keepalived抢到虚拟ip另一个则在等待状态,两个Keepalived之间是有心跳监测的
安装Keepalived
# 进入Haproxy容器docker exec -it lmhcblogh1 bash# Keepalived只能安装在Haproxy容器中# Haproxy 以Ubuntu创建出来的 Ubuntu命令以apt-get# 更新apt-getapt-get update# 安装Keepalived apt-get install keepalived# 安装vim编辑器用来编写keepalived配置文件apt-get install vim# 进入Keepalived配置文件 vim /etc/keepalived/keepalived.conf
Keepalived配置文件
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.19.0.200 } }
启动Keepalived
service keepalived start
查看Keepalived IP172.19.0..200与宿主机的之间通信是否有问题
2.25 数据库热备份
常见的数据库备份方案
XtraBackup备份不加锁
不会打断正在执行事务
压缩备份
可增量备份(只备份变化数据)全量备份(首次备份采用全量后续采用增量)
lvm,LVM采用的是快照方式备份,备份的是分区里面存储的数据,可以兼容任何数据库,备份时加锁,只可读不可写
XtraBackup,
安装 XtraBackup
# 在前面创建pxcnode5容器是已经映射了用于备份的数据库backupv# pxc容器安装XtraBackup # 更新atp-getapt-get update# 安装XtraBackup apt-get install percona-xtrabackup-24# 备份数据user=数据库用户吗 password=数据库密码 备份路径/date/backup/fullinnobackupex --user=root --password=lmhcblog2020 /date/backup/full
2.26 数据还原
删除原有pxc容器删除数据卷并重新创建pxc容器清除数据然后还原数据
#删除数据rm -rf /var/lib/mysql/*#清空事务innobackupex --user=root --password=abc123456 --apply-back /data/backup/full/2021-03-20-11_08-05-06/#还原数据innobackupex --user=root --password=abc123456 --copy-back /data/backup/full/2021-03-20-11_08-05-06/
错误汇总
WARNING: IPv4 forwarding is disabled. Networking will not work.
# 解决命令echo "net.ipv4.ip_forward=1" >>/usr/lib/sysctl.d/00-system.conf# 重启network 和docker systemctl restart network && systemctl restart docker
作者:泪梦红尘
文章出处:https://www.41it.cn/index.php/2021/07/28/docker部署mysql集群/