docker安装(PXC)mysql集群

安装PXC

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

  1. 安装pxc镜像
    进入docker官网找到pxc镜像传送门复制安装pxc进行的指令docker pull percona/percona-xtradb-cluster
  2. 执行该指令,等待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
  1. 由于系统自带的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
  1. 每个PXC节点内部包含一个mysql实例,如果需要创建包含5个数据库节点的数据库集群,那么要创建5个pxc节点。出于安全考虑,需要给PXC集群实例创建一个Docker内部网络。
    1. 创建一个网段docker network create
[root@localhost ~]# docker network create --subnet=172.18.0.0/24 net1
0b8e9701ac4e79239e4a92013ee80a089ff8e9681e881d20a7b1a4ccd8e9ddf9
  1. 查看指定网段信息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": {}
    }
]
  1. 移除指定网段docker network rm 网段名称
  2. 创建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"
    }
]
  1. 创建PXC容器


    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


image.png

数据负载均衡机制

image.png

负载均衡中间件对比


image.png

安装Haproxy

  1. 拉取镜像
docker pull haproxy
  1. 创建配置文件
[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
image.png
  1. 创建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
  1. 进入haproxy后台docker exec,加载配置文件
[root@localhost haproxy]# docker exec -it  h1 bash 
root@4e53fd48e900:/# haproxy -f /usr/local/etc/haproxy/haproxy.cfg
  1. 在node1节点上创建一个没有密码没有权限的用户用于做心跳检测
create user 'haproxy'@'%' IDENTIFIED BY '';
  1. 确认防火墙关闭或者端口4001是暴露的状态的前提下客户端访问ip:4001/dbs
    用户名和密码为在haproxy.cfg配置文件设置好的,查看配置文件即可。
    image.png
  2. 后台关闭任意一个数据库节点进行测试
[root@localhost ~]# docker stop node1
node1
image.png
  1. haproxy连接navcat客户端
    像连接mysql客户端一样,
    ip为宿主机ip,端口为刚刚启动的时候映射的4002,密码为数据库的密码。


    image.png

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

haproxy高可用

  1. Keepalived双机热备


    image.png

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

  2. 总体架构设计


    image.png

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

  3. 安装
  4. 在haproxy中安装keepalived
sudo apt-get update
sudo apt-get install keepalived
  1. 更改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地址,每行一个。
  1. 启动keepalived程序,在宿主机ping定义好的虚拟ip
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容