dockerpxc需要下载mysql_docker安装(PXC)mysql集群

安装PXC

PXC 模式,没有主从之分,每个数据库都可以进行读写,数据可以保持强一致性,执行时间较慢,由于一般是强一致性,所以一般用于存储重要的信息,例如金融。

安装pxc镜像

进入docker官网找到pxc镜像传送门复制安装pxc进行的指令docker pull percona/percona-xtradb-cluster

执行该指令,等待linux安装完毕。安装完毕后使用docker images检查是否已经安装

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

docker.io/percona/percona-xtradb-cluster latest 70b3670450ef 3 months ago 408 MB

由于系统自带的PXC名字过长,我们可以将他的名字进行修改,方便使用

[root@localhost ~]# docker tag docker.io/percona/percona-xtradb-cluster pxc

[root@localhost ~]# docker rmi docker.io/percona/percona-xtradb-cluster

Untagged: docker.io/percona/percona-xtradb-cluster:latest

Untagged: docker.io/percona/percona-xtradb-cluster@sha256:78460483e99c093d2910d3667d928ed8c2165165554482058875bccafa4ccf0b

[root@localhost ~]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE

pxc latest 70b3670450ef 3 months ago 408 MB

每个PXC节点内部包含一个mysql实例,如果需要创建包含5个数据库节点的数据库集群,那么要创建5个pxc节点。出于安全考虑,需要给PXC集群实例创建一个Docker内部网络。

创建一个网段docker network create

[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1

0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9

查看指定网段信息docker network inspect 网段名称

[root@localhost ~]# docker network inspect net1

[

{

"Name": "net1",

"Id": "0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9",

"Created": "2019-06-10T09:34:11.010208053+08:00",

"Scope": "local",

"Driver": "bridge",

"EnableIPv6": false,

"IPAM": {

"Driver": "default",

"Options": {},

"Config": [

{

"Subnet": "172.18.0.0/24"

}

]

},

"Internal": false,

"Attachable": false,

"Containers": {},

"Options": {},

"Labels": {}

}

]

移除指定网段docker network rm 网段名称

创建docker卷docker volume create --name

创建一个docker卷名字为v1,通过查看其详细信息,发现该卷在宿主机的映射地址为/var/lib/docker/volumes/v1/_data

[root@localhost ~]# docker volume create v1

v1

[root@localhost ~]# docker inspect v1

[

{

"Driver": "local",

"Labels": {},

"Mountpoint": "/var/lib/docker/volumes/v1/_data",

"Name": "v1",

"Options": {},

"Scope": "local"

}

]

创建PXC容器

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

-d :代表创建的容器在后台运行

-p : 端口映射 宿主机端口:容器端口

-v :路径映射

-e MYSQL_ROOT_PASSWORD=root 指定mysql的root账号密码为root

-e CLUSTER_NAME=PXC 执行名称为PXC

-e XTRABACKUP_PASSWORD=root 指定mysql数据同步时用的密码为root

--privileged 给最高的权限

--name=node1 节点名称node1

--net=net1 使用的内部网段

--ip 172.18.0.2 分发的ip地址

pxc 镜像名称pxc

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

96e7588f1e9f2f657217f7ede6c53b1c5e7c044b57b5ef3787df2e7c5e69b974

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

206452fddb60a03f44bd175c075b527781fbe7cc2d3eb805969ef1b48894fa76

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

0fc05938f19fd16c69999ce79e67983609308417a500407ae693900667f668dc

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

74e8fb3022e5077669dc05d519aa331e9c678b2943fdd61e331d93ab39548424

[root@localhost ~]# docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=root -e CLUSTER_NAME=PXC -e XTRABACKUP_PASSWORD=root -v v5:/var/lib/mysql -e CLUSTER_JOIN=node1 --privileged --name=node5 --net=net1 --ip 172.18.0.6 pxc

bc48ae76e854ef3ddd6ef0a6d412f00a6e3a826edecc8c56a572322e1b821b10

执行docker ps进行查看

[root@localhost ~]# docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

14a0ba3c314e pxc "/entrypoint.sh " 6 seconds ago Up 5 seconds 4567-4568/tcp, 0.0.0.0:3309->3306/tcp node4

bc48ae76e854 pxc "/entrypoint.sh " About a minute ago Up About a minute 4567-4568/tcp, 0.0.0.0:3310->3306/tcp node5

0fc05938f19f pxc "/entrypoint.sh " 2 minutes ago Up 2 minutes 4567-4568/tcp, 0.0.0.0:3308->3306/tcp node3

206452fddb60 pxc "/entrypoint.sh " 4 minutes ago Up 4 minutes 4567-4568/tcp, 0.0.0.0:3307->3306/tcp node2

96e7588f1e9f pxc "/entrypoint.sh " 13 minutes ago Up 12 minutes 0.0.0.0:3306->3306/tcp, 4567-4568/tcp node1

通过navcat进行连接,连接的ip即为宿主机的ip

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

数据负载均衡机制

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

负载均衡中间件对比

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

安装Haproxy

拉取镜像

docker pull haproxy

创建配置文件

[root@localhost ~]# mkdir /home/soft -p

[root@localhost ~]# touch /home/soft/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 5000

#服务器超时(毫秒)

timeout server 5000

#监控界面

listen admin_stats

#监控界面访问ip和端口

bind 0.0.0.0:8888

#访问协议

mode http

#URI相对地址

stats uri /dbs

#统计报告格式

stats realm Gloal\ statistics

#登录账户信息 用于登录监控网站使用

stats auth root:root

#数据库负载均衡

listen proxy-mysql

#访问的IP和端口

bind 0.0.0.0:3306

#网络协议

mode tcp

#负载均衡算法(轮询算法)

#轮询算法:roundrobin

#权重算法:static-rr

#最少连接算法:leastconn

#请求源IP算法:source

balance roundrobin

#日志格式

option tcplog

#在MySQL中创建一个没有权限的haproxy用户,密码为空。

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

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

创建Haproxy容器

[root@localhost ~]# docker run -it -d -p 4001:8888 -p 4002:3306 -v /home/haproxy:/usr/local/etc/haproxy --name haproxy --privileged --net=net1 haproxy

进入haproxy后台docker exec,加载配置文件

[root@localhost haproxy]# docker exec -it h1 bash

root@4e53fd48e900:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg

在node1节点上创建一个没有密码没有权限的用户用于做心跳检测

create user 'haproxy'@'%' IDENTIFIED BY '';

确认防火墙关闭或者端口4001是暴露的状态的前提下客户端访问ip:4001/dbs

用户名和密码为在haproxy.cfg配置文件设置好的,查看配置文件即可。

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

后台关闭任意一个数据库节点进行测试

[root@localhost ~]# docker stop node1

node1

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

haproxy连接navcat客户端

像连接mysql客户端一样,

ip为宿主机ip,端口为刚刚启动的时候映射的4002,密码为数据库的密码。

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

haproxy本身并不会存储数据,他只会将发过来的请求进行转发。值得注意的是单节点的haproxy是不具备高可用性的,所以必须要有冗余的设计。具体如下:

haproxy高可用

Keepalived双机热备

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

设置一个虚拟ip,两个keepalive同时进行抢占该虚拟ip,抢到的为主服务器,没有抢到的为从服务器,从服务器定期向主服务器发送心跳,如果检测到主服务器宕机,从服务便可以获得虚拟ip成为主服务器。

总体架构设计

e7d4eaaecbec?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

image.png

前面已经介绍过keepalived双机热备,不在赘述,最外面的那个keepalived作为跳板机使用。

安装

在haproxy中安装keepalived

sudo apt-get update

sudo apt-get install keepalived

更改keepalived配置文件

路径:/etc/keepalived/keepalived.conf

内容:

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

}

}

[配置文件说明]

state MASTER 表明keepalived身份(MASTER为主服务器,BACKUP为从服务器),主服务器抢占虚拟IP,备用服务器不会抢占IP

interface eth0 网卡设备,用于保存虚拟IP地址,该网卡是docker的网卡,只有在宿主机可见。所以需要将该虚拟IP映射到其他可见的IP上

virtual_router_id 51 虚拟路由标识,MASTER和BACKUP的虚拟路由标识必须保持一致,标识可以是0~255

priority 100 权重,MASTER的权重要高于BACKUP数字越大优先级越高。

advert_int 1 心跳检测的时间间隔,主备之间必须一致。单位(秒)

authentication{

auth_type PASS

auth_pass 123456

}

心跳检测使用的账号和密码

virtual_ipaddress{

172.18.0.201

}

虚拟IP地址,可以设置多个虚拟IP地址,每行一个。

启动keepalived程序,在宿主机ping定义好的虚拟ip

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值