Docker搭建MySQL集群

采用MySQL架构Percona XtraDB Cluster

1.安装PXC集群

# 用pull拉 PXC 5.7.20版本
[root@localhost ~]# docker pull percona/percona-xtradb-cluster:5.7.20
5.7.20: Pulling from percona/percona-xtradb-cluster
10a267c67f42: Pull complete 
814bc8809fc0: Pull complete 
c32e31261673: Pull complete 
7ef40c6d0d95: Pull complete 
74a5ecb87cc4: Pull complete 
c08c635cfaf1: Pull complete 
67115204d437: Pull complete 
845e6898cf10: Pull complete 
392865b4a828: Pull complete 
d1440aef4590: Pull complete 
ad08fcbea5cd: Pull complete 
03d173884318: Pull complete 
74a8c9c96123: Pull complete 
Digest: sha256:84bbe0269d3e2223556ac98e71320997bd6df09dccef5cad865b636403d36b6e
Status: Downloaded newer image for percona/percona-xtradb-cluster:5.7.20
docker.io/percona/percona-xtradb-cluster:5.7.20
# images 查看下载的镜像
[root@localhost ~]# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED         SIZE
tomcat                           latest    fb5657adc892   14 months ago   680MB
percona/percona-xtradb-cluster   5.7.20    01b74a9694c0   5 years ago     413MB

2.重命名下载的PXC镜像(原名太长)

# 用tag给镜像打标签  tag [镜像名] [要打上的标签名]
[root@localhost ~]# docker tag percona/percona-xtradb-cluster:5.7.20 pxc
[root@localhost ~]# docker images
REPOSITORY                       TAG       IMAGE ID       CREATED         SIZE
tomcat                           latest    fb5657adc892   14 months ago   680MB
pxc                              latest    01b74a9694c0   5 years ago     413MB
percona/percona-xtradb-cluster   5.7.20    01b74a9694c0   5 years ago     413MB

3.创建内部网络

# 多台容器之间通信 tomcat暴露8080端口,mysql暴露3306,tomcat通过127.0.0.1:3306与mysql进行连接 可以实现 
# 问题1 这样也就意味着 公网ip+端口就可以连接你的数据库(127.0.0.1:3306) 数据库容易遭受攻击 
# 解决方案 让数据库只让MySQL进行访问 公网无法访问
# 在实际部署中,服务端只会暴露网关,各服务、组件之间均是内网访问 docker容器也是有ip的,安装docker后会有一个docker0网卡,每启动一个docker容器,docker就会给docker容器分配一个ip,都是桥接在这个网卡上面

#docker 创建网关net1
docker network create  net1

[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1
a52d1b3ba7fcce996cde9a220da78269e94df621b9bdd72c80d7f7f73b3d7730
[root@localhost ~]# 
# –subnet=172.18.0.0/24 自定义网段172.18.0.0,24是指24位子网掩码 net1 网段名称。

# 查看net1详细信息
[root@localhost ~]# docker inspect net1
[
    {
        "Name": "net1",
        "Id": "a52d1b3ba7fcce996cde9a220da78269e94df621b9bdd72c80d7f7f73b3d7730",
        "Created": "2023-03-06T05:47:32.638038004-05:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@localhost ~]# 

4.创建docker卷

如果数据都在容器中那么我们容器删除,数据就会丢失,容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地!

这就是卷技术,目录的挂载,将我们容器内的目录挂载到linux目录上面

# 由于PXC较为特殊,无法直接使用映射目录的方法做映射(使用后会闪退),故使用docker卷


[root@localhost ~]# docker volume create --name v1
v1
# 可以看到Mountpoint字段 就是映射在宿主机的路径 "/var/lib/docker/volumes/v1/_data",
[root@localhost ~]# docker inspect v1
[
    {
        "CreatedAt": "2023-03-06T06:19:50-05:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/v1/_data",
        "Name": "v1",
        "Options": null,
        "Scope": "local"
    }
]
# 用于后续会在不同容器中一使用不同的docker卷,执行以下命令:
[root@localhost ~]# docker volume create --name v2
v2
[root@localhost ~]# docker volume create --name v3
v3
[root@localhost ~]# docker volume create --name v4
v4
[root@localhost ~]# 

5.创建PXC容器

[root@localhost ~]# docker run  -d -p  3307:3306 -v v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 --privileged --name=node1 --ip 172.18.0.2 pxc
8af8bf729484f779dd91e4bee7587abb712f54ec113dfa722f05300699f54625
[root@localhost ~]# 

# -d:默认在后台运行
# -p 3307:3306 宿主:容器  端口映射,将容器3306端口映射到宿主3307端口
# -v 目录映射 将创建的v1卷映射到容易 /var/lib/mysql
# -e MYSQL_ROOT_PASSWORD= 创建用户实例的密码
# -e CLUSTER_NAME= 集群的名称
# -e XTRABACKUP_PASSWORD= 数据库之间同步使用的密码
# --privileged  权限.给予最高权限
# --name 给容器容命名
# --net 使用内部网段
# --ip 内部网段分到的地址
# pxc 是下载镜像  percona/percona-xtradb-cluster:5.7.20 更改的标签名

# 测试连接

宿主的ip(ip可在centos窗口输入ifconfig即可查看ip)

用户root

密码 (MYSQL_ROOT_PASSROWD )设置的

# 创建其他容器
#v2
[root@localhost ~]# docker run -d -p 3308:3306 -v v2:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node2 --net=net1 --ip 172.18.0.3 pxc

e8ac666c22b27baa1fed07f6be7e99bbbfea89ac7658ae9fb7b9738f5ad573de
[root@localhost ~]#

#v3
[root@localhost ~]# docker run -d -p 3309:3306 -v v3:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node3 --net=net1 --ip 172.18.0.4 pxc

36ce27de36f13759f16446659e82e77e7b20739e91e87513308716793cb893eb
[root@localhost ~]# 

#v4
[root@localhost ~]# docker run -d -p 3310:3306 -v v4:/var/lib/mysql -e MYSQL_ROOT_PASSROWD=123456 -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=node1 --privileged --name=node4 --net=net1 --ip 172.18.0.5 pxc

58983e6d35ee4a9b6778c96e1a4c36b380f997b734b2fcf206761e40ed216c11
[root@localhost ~]# 

6.验证是否创建成功PCX集群

用Navicat for mysql连接到之前四个节点的数据库,在四个节点数据库中 在任意一个数据库进行建库、建表、增删改查数据等操作后,再查看其它节点进行查看,或者在其它不同的节点进行操作看是否数据能成功进行同步。

posted @ 2023-03-13 17:58  左右啊  阅读(121)  评论(0编辑  收藏  举报