目录
最近研究学习mysql集群。发现使用docker对mysql集群的进行部署安装还是很方便简单的。现在把自己部署过程和大家分享一下。想到在自己实际的项目环境中,有两种环境下的服务器,一种是云服务器上可以连接至互联网的网络中;另外一种是某些自建机房中,无法连接连接互联网网络的服务器。所以分为在线部署安装和离线部署安装两种方式。本文讲的是在线部署安装的方式。
一、环境:
虚拟机:3台,虚拟机操作系统:CentOS 7+
二、docker的安装
1、把yum包更新到最新
yum update
2、安装需要的软件包;
yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
yum install -y yum-utils device-mapper-persistent-data lvm2
3、设置yum源
(选择其中一个)
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
4、查看版本
可以查看所有仓库中所有docker版本,并选择特定版本安装
yum list docker-ce --showduplicates | sort -r
5、安装Docker;
命令:yum install docker-ce-版本号,我选的是docker-ce-18.03.1.ce
yum install docker-ce-18.03.1.ce
6、启动Docker;
命令:systemctl start docker,然后加入开机启动,
systemctl start docker
systemctl enable docker
7、查看安装版本
docker version
8、常用Docker命令
docker ps 查看当前正在运行的容器
docker ps -a 查看所有容器的状态
docker start/stop id/name 启动/停止某个容器
docker attach id 进入某个容器(使用exit退出后容器也跟着停止运行)
docker exec -ti id 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)
docker images 查看本地镜像
docker rm id/name 删除某个容器
docker rmi id/name 删除某个镜像
docker run --name test -ti ubuntu /bin/bash 复制ubuntu容器并且重命名为test且运行,然后以伪终端交互式方式进入容器,运行bash
docker build -t soar/centos:7.1 . 通过当前目录下的Dockerfile创建一个名为soar/centos:7.1的镜像
docker run -d -p 2222:22 --name test soar/centos:7.1 以镜像soar/centos:7.1创建名为test的容器,并以后台模式运行,并做端口映射到宿主机2222端口,P参数重启容器宿主机端口会发生改变
三、基于docker搭建pxc模式的mysql集群
在Docker中安装PXC集群,使用Docker仓库中的PXC官方镜像:地址
1、拉取镜像
从docker官方仓库中拉下PXC镜像:
docker pull percona/percona-xtradb-cluster
查看本地安装的镜像
docker images
2、重命名镜像;
名称太长,重命名一下,会生成一个新的镜像。
docker tag percona/percona-xtradb-cluster:latest pxc
可以删除掉原来名字长的镜像了
docker images
docker rmi docker.io/percona/percona-xtradb-cluster
docker images
3、设置防火墙
安装mysql集群之前确认防火墙的状态,可以关闭防火墙或者指定防火墙开放端口。否则集群服务器集群服务器之间有可能无法访问,影响服务。
#查看防火墙状态
firewall-cmd --state
# 开启
service firewalld start
# 重启
service firewalld restart
# 关闭
service firewalld stop
查看防火墙规则
firewall-cmd --list-all
# 查询端口是否开放
firewall-cmd --query-port=8080/tcp
# 开放80端口
firewall-cmd --permanent --add-port=80/tcp
# 移除端口
firewall-cmd --permanent --remove-port=8080/tcp
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload
# 参数解释
1、firwall-cmd:是Linux提供的操作firewall的一个工具;
2、--permanent:表示设置为持久;
3、--add-port:标识添加的端口;
4、确认集群服务器;
创建集群用到的文件夹。
本次集群使用到了三台虚拟机,ip和用处如下:
192.*.*.36 haproxy
192.*.*.36 node1
192.*.*.37 node2
192.*.*.38 node3
开始本地所使用的目录
mkdir -p /docker/pxc/mysql /docker/pxc/data
修改文件目录权限
cd /docker/pxc
chmod 777 mysql
chmod 777 data
5、创建容器
创建第1个MySQL节点( node1:192.*.*.36),密码自己设着玩就是设置为123456,实际环境需要设置更复杂的密码。
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -v /docker/pxc/mysql:/var/lib/mysql -v /docker/pxc/data:/data --privileged --name=db1 --net=host pxc
创建第2个MySQL节点(node2:192.*.*.37)。
注意:192.*.*.36为主机1的ip地址。
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=192.*.*.36 -v /docker/pxc/mysql:/var/lib/mysql -v /docker/pxc/data:/data --privileged --name=db2 --net=host pxc
创建第3个MySQL节点(node3:192.*.*.38)
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=192.*.*.36 -v /docker/pxc/mysql:/var/lib/mysql -v /docker/pxc/data:/data --privileged --name=db3 --net=host pxc
到了这一步基于docker的多机pxc搭建已经基本换成了,亲测可用!
可分别在服务器上查看日志信息。
docker logs db1
四、配置haproxy
haproxy的必要性:虽然搭建了集群,但是不使用数据库负载均衡,所有请求发送给单一节点,单节点处理所有请求,负载高,性能差。数据库配置了负载均衡,能将请求均匀地发送给集群中的每一个节点。
1、创建haproxy用户
我选择db1节点(node1)作为haproxy的服务器,(服务器资源充足的可以选择一台新的服务器作为haproxy的服务器),在上面执行下面命令进入容器:
docker exec -it db1 bash
进入容器后执行
mysql -uroot -p
输入上面设置的密码 123456 后执行:
create user 'haproxy'@'%' identified by '';
成功运行,退出。
exit
exit
2、构建haproxy容器
在192.*.*.36上拉取haproxy镜像。
docker pull haproxy
创建用到的文件目录
mkdir -p /docker/pxc/haproxy
创建配置文件haproxy.cfg;
touch /docker/pxc/haproxy/haproxy.cfg
编辑haproxy.cfg文件;
vi /docker/pxc/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 192.*.*.36:8888
#访问协议
mode http
#URI相对地址
stats uri /dbs
#统计报告格式
stats realm Global\ statistics
#登陆帐户信息
stats auth admin:123456
#数据库负载均衡
listen proxy-mysql
#访问的IP和端口,这里不能配置成3306
bind 0.0.0.0:3307
#网络协议
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.*.*.36:3306 check weight 1 maxconn 2000
server MySQL_2 192.*.*.37:3306 check weight 1 maxconn 2000
server MySQL_3 192.*.*.38:3306 check weight 1 maxconn 2000
#使用keepalive检测死链
option tcpka
开始创建容器
docker run -it -d -p 4001:8888 -p 4002:3306 -v /docker/pxc/haproxy:/usr/local/etc/haproxy --name haproxy --privileged --net=host haproxy
容器创建成功后,可通过访问http://192.*.*.36:8888/dbs,查看各节点的状态。登录的账号密码在上面的配置文件中进行配置。我配置的账户密码为admin/123456。
到了这一步我们就大功告成了,可以通过我们配置的负载地址端口来访问我们的数据库了。
连接参数: 192.*.*.36 端口:3307 用户名:root 密码:123456
五、后续
这就是在有互联网网络的情况下,通过docker部署pxc模式的mysql集群的方式啦。如果有什么不对的地方,欢迎大家指出!下一篇文章将和大家分享在离线环境下安装docker和mysql(pxc)集群。