温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Docker怎么搭建mariadb集群

发布时间:2021-07-29 22:34:45 来源:亿速云 阅读:254 作者:chen 栏目:云计算

本篇内容主要讲解“Docker怎么搭建mariadb集群”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Docker怎么搭建mariadb集群”吧!

简介

本例简单介绍下如何在多个主机使用docker环境下搭建mairadb集群。只做测试不建议生产中使用。

实现原理: 本例基于severalnines/mariadb镜像制作Mariadb集群,当容器启动后会向etcd注册集群信息,其他容器启动会从etcd获取集群信息(集群名称,运行的容器IP等),从而加入集群。容器之间跨主机的通信则借助flannel来实现。

架构图

Docker怎么搭建mariadb集群

3节点上安装跨主机网络,让容器之间可以相互通信,第一个容器启动时向etcd注册自己的集群信息,后面容器启动时从etcd中查找集群信息,并加入集群中去。

环境

主机名机器IP系统CPU/MEMDocker版本
node-110.0.102.218CentOS 7.54H/16G18.06.2-ce
node-210.0.102.151CentOS 7.54H/16G18.06.2-ce
node-310.0.102.162CentOS 7.54H/16G18.06.2-ce

依赖组件 etcd提供服务发现与存放flannel网络信息flannel提供跨主机网络 etcd安装etcd服务,集群都要安装flannel组件(事先关掉docker) 若未装则运行--network=host网络

部署

Docker环境设置

有配置flanneld则需要执行
vim /etc/systemd/system/docker.service中增加下面两条记录
[Service]
EnvironmentFile=/run/docker_opts.env
ExecStart=/usr/bin/dockerd\
--graph=/var/lib/docker --log-level=error $DOCKER_NETWORK_OPTIONS $DOCKER_OPTS

再启动docker
systemctl daemon-reload &&systemctl restart docker

etcd集群

台机器验证集群的可用性,集群信息如下:
     机器名     IP地址              角色
     node1    10.0.102.218   etcd节点
     node2    10.0.102.151   etcd节点
     node3    10.0.102.162   etcd节点
	
运行容器(每个节点都运行)
REGISTRY=k8s.gcr.io/etcd
ETCD_VERSION=3.2.24
TOKEN=my-etcd-token
NAME_1=k8s-node-1
NAME_2=k8s-node-2
NAME_3=k8s-node-3
HOST_1=10.0.102.218
HOST_2=10.0.102.151
HOST_3=10.0.102.162
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
DATA_DIR=/var/lib/etcd

# 在节点 node1 上运行:
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state new --initial-cluster-token ${TOKEN}

# 在节点 node2 上运行:
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state existing --initial-cluster-token ${TOKEN}

# 在节点 node3 上运行:
THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
docker run -d \
   -p 2379:2379 \
   -p 2380:2380 \
   --volume=${DATA_DIR}:/etcd-data \
   --name etcd ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd \
   --data-dir=/etcd-data \
   --name ${THIS_NAME} \
   --initial-advertise-peer-urls http://${THIS_IP}:2380 \
   --listen-peer-urls http://0.0.0.0:2380 \
   --advertise-client-urls http://${THIS_IP}:2379 \
   --listen-client-urls http://0.0.0.0:2379 \
   --initial-cluster ${CLUSTER} \
   --initial-cluster-state existing --initial-cluster-token ${TOKEN}

验证集群
#在测试验证节点NFS上,运行另一个etcd容器,
#以便使用其中的etcdctl命令行程序进行验证
REGISTRY=k8s.gcr.io/etcd
ETCD_VERSION=3.2.24
docker run -d \
   --name etcd-client ${REGISTRY}:${ETCD_VERSION} \
   /usr/local/bin/etcd

#进入容器,查询集群状态
#验证存入数据、读取数据
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table member list"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table endpoint status"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379 --write-out=table endpoint health"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379  put url http://www.sina.com.cn"
docker exec etcd-client /bin/sh -c "export ETCDCTL_API=3 && /usr/local/bin/etcdctl --endpoints=http://10.0.102.214:2379,http://10.0.102.175:2379,http://10.0.102.191:2379  get url"

部署mariadb集群

准备工作

镜像:severalnines/mariadb:10.1

配置文件/etc/my.cnf.d/binlog.cnf mkdir -p /etc/my.cnf.d/ cat > /etc/my.cnf.d/bin-log.cnf<<EOF [mysqld] log-bin = mysql-bin log_slave_updates = 1 expire_logs_days = 20 server-id = 211 EOF

部署操作
node-1节点
第一个节点:带binlog日志,主机10-0-102-165上操作:
docker run -d -p 3306:3306 --name=galera0_h \
-v /data:/var/lib/mysql -v /etc/my.cnf.d:/etc/my.cnf.d \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1

验证
docker ps –a
 【见图1】
mysql -uroot -pmypassword -h 10.0.102.215 -e "show status like 'wsrep%';"
  【见图2】
binlog日志
 【见图3】

Docker怎么搭建mariadb集群 Docker怎么搭建mariadb集群 Docker怎么搭建mariadb集群

node-2节点
第二个节点:非binlog日志
docker run -d -p 3306:3306 --name=galera1_h \
-v /data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1
docker ps –a
 【见图4】
mysql -uroot -pmypassword -h 10.0.102.151 -e "show status like 'wsrep%';"
  【见图5】
binlog日志
 【见图6】

Docker怎么搭建mariadb集群 Docker怎么搭建mariadb集群 Docker怎么搭建mariadb集群

node-3节点
第三个节点:非binlog日志
docker run -d -p 3306:3306 --name=galera2_h \
-v /data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=mypassword \
-e DISCOVERY_SERVICE=10.0.102.215:2379,10.0.102.151:2379,10.0.102.162:2379  \
-e CLUSTER_NAME=my_wsrep_cluster_hp \
-e XTRABACKUP_PASSWORD=mypassword --network=host severalnines/mariadb:10.1

mysql -uroot -pmypassword -h 10.0.102.162 -e "show status like 'wsrep%';"
 【见图7】
binlog日志
【见图8】

Docker怎么搭建mariadb集群 Docker怎么搭建mariadb集群

注意事项

因为容器运行时挂载主机下的/data目录,所以备份与恢复操作较k8s中的操作更简单,在此不再详述,只简单说明下注意事项:

1.如果某个容器挂掉 可以先使用docker start CONTAINER_NAME进行启动,如果启动不成功,这个时候需要重新将node加入集群中,操作步骤如下: docker stop CONTAINER_NAME docker rm CONTAINER_NAME rm -rf /data/ docker run xxx

2.容器启动时注意问题: 要按照一定的顺序进行,当docker run第一个容器时,要等容器完全启动起来了再docker run第二个容器,依次类推关闭则执行相反操作,先stop第一个容器,再stop第二个容器,依次类推

3.恢复操作注意问题 恢复操作与k8s中mariadb集群相同,需要依次停止,在最后一个节点上执行恢复操作,恢复完成后重新让节点加入集群(节点加入集群前需要先删除本地的/data目录)

4.使用docker rm命令会造成集群信息紊乱: 关闭某个节点的mariadb容器时,切记不可执行docker rm –f命令,应该先执行docker stop,然后再执行docker rm命令。

补充内容: 使用docker-compose进行部署mariadb-cluster集群 原理与架构均与docker部署相同,在此不再赘述。 一、与上面环境不同点: 1.etcd使用的是集群: 10.0.102.214:2379, 10.0.102.175:2379, 10.0.102.191:2379 原因:测试在之前的etcd中获得不到集群信息,不想在etcd上过多消耗,而且使用etcd集群会更可靠 2.没有使用flannel网络,使用的docker的host网络。 原因:使用docker-compose启动时默认会创建网络,这样三个节点的容器就是在三个网络中,无法通信也就创建不了集群,在docker-compose文件中定义网络为network_mode: host,使用本机IP进行

到此,相信大家对“Docker怎么搭建mariadb集群”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI