感谢

  • 感谢方神的大力帮助,自己对数据库基本一窍不通.只是照葫芦画瓢做出来的.
  • 感谢来自如下两个网站的资料,我进行了一定程度的融合.
https://blog.csdn.net/weixin_43972854/article/details/105792720
https://github.com/wagnerjfr/mysql-innodb-cluster
  • 需要说明的一点是,我这边使用Docker-compose的放肆搭建了三个数据库节点,然后使用github中的内容进行手动创建集群.
  • 再次感谢提供帮助的方神.
  • 本次仅是一个简单测试,无法进入生产, 仅能够进行一些简单功能场景验证.

背景说明

  • 客户想要真正的集群,可以自主切换主从,高可用.
  • 主从复制模式需要手工触发, 不符合客户的高端需求.所以只能选择Mysql Cluster

资料准备

  • 主要是两个镜像:
  • 注意 mysql/mysql-server 其实内部带了 mysqlsh的脚本工具比较方便.
mysql/mysql-router           8.0.28    acccea81feeb   4 weeks ago    241MB
mysql/mysql-server 8.0.28 434c35b82b08 4 weeks ago 417MB
  • 以及一份docker-compose.yaml以及 一份 mysql-server.env 作为密码信息

搭建数据库

  • 创建 网络信息
  • 创建 数据库存储需要的目录
docker network create sg-net
mkdir -p /mysqlcluster/data/mysql-{1,2,3}

搭建数据库

  • docker-compose.yaml文件
  • 注意我这边将文件放到了 /mysqlcluste目录下
  • 注意我这边创建了3个数据库. 密码使用 mysql-server.env 目录下的内容
  • 注意这里面的密码很重要.参数是我自己选取的不一定完全正确.
version: '3'
services:
mysql-server-1:
env_file:
- mysql-server.env
image: mysql/mysql-server:8.0.28
container_name: mysql-server-1
command: ["mysqld","--server_id=1","--skip_ssl","--innodb_ft_min_token_size=1","--ft_min_word_len=1","--ngram_token_size=1","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password","--lower-case-table-names=1","--innodb_strict_mode=0","--character_set_server=utf8"]
ports:
- "3301:3306"
restart: always
volumes:
- ./data/mysql-1:/var/lib/mysql
networks:
- sg-net
mysql-server-2:
env_file:
- mysql-server.env
image: mysql/mysql-server:8.0.28
container_name: mysql-server-2
command: ["mysqld","--server_id=2","--skip_ssl","--innodb_ft_min_token_size=1","--ft_min_word_len=1","--ngram_token_size=1","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password","--lower-case-table-names=1","--innodb_strict_mode=0","--character_set_server=utf8"]
ports:
- "3302:3306"
restart: always
volumes:
- ./data/mysql-2:/var/lib/mysql
depends_on:
- mysql-server-1
networks:
- sg-net
mysql-server-3:
env_file:
- mysql-server.env
image: mysql/mysql-server:8.0.28
container_name: mysql-server-3
command: ["mysqld","--server_id=3","--skip_ssl","--innodb_ft_min_token_size=1","--ft_min_word_len=1","--ngram_token_size=1","--binlog_checksum=NONE","--gtid_mode=ON","--enforce_gtid_consistency=ON","--log_bin","--log_slave_updates=ON","--master_info_repository=TABLE","--relay_log_info_repository=TABLE","--transaction_write_set_extraction=XXHASH64","--user=mysql","--skip-host-cache","--skip-name-resolve", "--default_authentication_plugin=mysql_native_password","--lower-case-table-names=1","--innodb_strict_mode=0","--character_set_server=utf8"]
ports:
- "3303:3306"
restart: always
volumes:
- ./data/mysql-3:/var/lib/mysql
depends_on:
- mysql-server-1
networks:
- sg-net
networks:
sg-net:
external: true

搭建过程

  • mysql-server.env的内容为:
MYSQL_ROOT_PASSWORD=Yourpassword
MYSQL_ROOT_HOST=%

搭建过程

  • 启动数据库服务
在 /mysqlcluster 的目录下面
执行
docker-compose up -d
就可以启动服务.
注意可以进行相关的查看
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f576a916dff mysql/mysql-server:8.0.28 "/entrypoint.sh mysq…" 13 hours ago Up 12 hours (healthy) 33060-33061/tcp, 0.0.0.0:3302->3306/tcp, :::3302->3306/tcp mysql-server-2
67f944d464db mysql/mysql-server:8.0.28 "/entrypoint.sh mysq…" 13 hours ago Up 12 hours (healthy) 33060-33061/tcp, 0.0.0.0:3303->3306/tcp, :::3303->3306/tcp mysql-server-3
2158117042dd mysql/mysql-server:8.0.28 "/entrypoint.sh mysq…" 13 hours ago Up 12 hours (healthy) 33060-33061/tcp, 0.0.0.0:3301->3306/tcp, :::3301->3306/tcp mysql-server-1

搭建过程

  • 进行用户初始化以及简单设置
  • 需要说明的一点是 mysql-server-1 等的容器名字是通过 docker-compose.yaml 文件进行制定的.
创建用户:
for N in 1 2 3
do docker exec -it mysql-server-$N mysql -uroot -pYourpassword \
-e "CREATE USER 'inno'@'%' IDENTIFIED BY 'Yourpassword';" \
-e "GRANT ALL privileges ON *.* TO 'inno'@'%' with grant option;" \
-e "reset master;"
done
修改用户密码
for N in 1 2 3
do docker exec -it mysql-server-$N mysql -uroot -pYourpassword \
-e "alter USER 'inno'@'%' IDENTIFIED BY 'Yourpassword';"
done

搭建过程

  • 查看用户和数据库的机器名信息
for N in 1 2 3
do docker exec -it mysql-server-$N mysql -uinno -pYourpassword \
-e "SHOW VARIABLES WHERE Variable_name = 'hostname';" \
-e "SELECT user FROM mysql.user where user = 'inno';"
done

搭建过程

  • 使用 mysqlsh 进行实例的创建工作
docker exec -it mysql-server-1 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock
然后执行命令
dba.configureInstance("inno@mysql-server-1:3306") --password=Yourpassword
然后另外两个容器都需要同步进行处理
docker exec -it mysql-server-2 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock
dba.configureInstance("inno@mysql-server-2:3306") --password=Yourpassword docker exec -it mysql-server-3 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock
dba.configureInstance("inno@mysql-server-3:3306") --password=Yourpassword
注意 需要使用 \q 的方式退出容器执行窗口

搭建过程

  • 注意此时需要进行重启容器的操作,不然无法进行后续工作
docker restart $(docker ps -qa )
  • 进行下一步的处理
  • 注意需要连接具体的数据库 需要输入密码
docker exec -it mysql-server-1 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock

\c inno@mysql-server-1:3306
  • 创建集群以及可以查看集群状态
var cluster = dba.createCluster("mycluster")
cluster.status()
  • 这个时候集群是不完整的 提示需要至少3个才可以实现
  • 然后执行如下命令进行添加
  • 注意需要根据反馈的数据进行添加, 需要输入 c 作为 Clone的含义
cluster.addInstance("inno@mysql-server-2:3306")
cluster.addInstance("inno@mysql-server-3:3306")

mysql-router 创建

  • 注意这个时候很难使用本地文件方式搭建router,可以使用 容器方式搭建router
  • 直接执行docker run 即可
  • 参数很简单不做解释
docker run -d --name mysql-router --net=sg-net \
-e MYSQL_HOST=mysql-server-1 \
-e MYSQL_PORT=3306 \
-e MYSQL_USER=inno \
-e MYSQL_PASSWORD=Yourpassword \
-e MYSQL_INNODB_CLUSTER_MEMBERS=3 \
-p 6446:6446 \
-p 6447:6447 \
--restart=always \
mysql/mysql-router

集群状况查看

  • 可以进入任意一个节点进行查看
docker exec -it mysql-server-1 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock
# 注意需要先定义一下 var cluster 才可以进行下一步的操作.
var cluster = dba.getCluster("mycluster");
cluster.status()
  • 也可以使用sql方式进行查看集群状态
docker exec -it mysql-server-1 mysqlsh -uroot -pYourpassword -S/var/run/mysqld/mysqlx.sock
# 输入 \sql 进入sql模式
select * from performance_schema.replication_group_members;
一般效果为:
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | edc0b4de-9177-11ec-8bd7-0242ac120002 | 8ba858033be2 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom |
| group_replication_applier | ee39a004-9177-11ec-8bcf-0242ac120003 | f9a2648c10c0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
| group_replication_applier | ee3e5516-9177-11ec-8b0d-0242ac120004 | 0a0b93abe0e0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+

断电之后处理

  • 需要说明一点的是 本次测试是在一个机器上面进行,断电重启集群会坏掉.
  • 当然只是docker stop 一个容器, 然后再次进行docker restart 是不会导致集群挂掉的.
  • 每次重启机器需要手动进行维护 方法主要如下:
# 因为是异常断电,理论上3个机器是同事掉线的可以选择任何一个进行如下处理
docker exec -it mysql-server-1 mysqlsh -uinno -pYourpassword -S/var/run/mysqld/mysqlx.sock \sql # 进入sql模式
# 执行如下3个SQL
SET GLOBAL group_replication_bootstrap_group=ON;
start group_replication;
SET GLOBAL group_replication_bootstrap_group=Off;
# 注意其他两个数据库服务只需要执行:
start group_replication;
即可.

重启某节点的演练.

  • 重启主节点 会看到集群有3个online,减少到两个:
docker stop mysql-server-1
对比一下节点信息
MySQL localhost+ SQL > select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | edc0b4de-9177-11ec-8bd7-0242ac120002 | 8ba858033be2 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom |
| group_replication_applier | ee39a004-9177-11ec-8bcf-0242ac120003 | f9a2648c10c0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
| group_replication_applier | ee3e5516-9177-11ec-8b0d-0242ac120004 | 0a0b93abe0e0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.0027 sec)
MySQL localhost+ SQL > select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | ee39a004-9177-11ec-8bcf-0242ac120003 | f9a2648c10c0 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom |
| group_replication_applier | ee3e5516-9177-11ec-8b0d-0242ac120004 | 0a0b93abe0e0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
  • 启动节点 会看到集群会自愈
docker start mysql-server-1
# 会发现会自动 recovering 然后进行Secondary的状态
MySQL localhost+ SQL > select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | edc0b4de-9177-11ec-8bd7-0242ac120002 | 8ba858033be2 | 3306 | RECOVERING | SECONDARY | 8.0.28 | XCom |
| group_replication_applier | ee39a004-9177-11ec-8bcf-0242ac120003 | f9a2648c10c0 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom |
| group_replication_applier | ee3e5516-9177-11ec-8b0d-0242ac120004 | 0a0b93abe0e0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.0005 sec)
MySQL localhost+ SQL > select * from performance_schema.replication_group_members;
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | MEMBER_COMMUNICATION_STACK |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
| group_replication_applier | edc0b4de-9177-11ec-8bd7-0242ac120002 | 8ba858033be2 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
| group_replication_applier | ee39a004-9177-11ec-8bcf-0242ac120003 | f9a2648c10c0 | 3306 | ONLINE | PRIMARY | 8.0.28 | XCom |
| group_replication_applier | ee3e5516-9177-11ec-8b0d-0242ac120004 | 0a0b93abe0e0 | 3306 | ONLINE | SECONDARY | 8.0.28 | XCom |
+---------------------------+--------------------------------------+--------------+-------------+--------------+-------------+----------------+----------------------------+
3 rows in set (0.0006 sec)
MySQL localhost+ SQL >

使用Docker快速搭建InnoDB Cluster集群的过程的更多相关文章

  1. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  2. Mysql Innodb cluster集群搭建

    之前搭建过一个Mysql Ndb cluster集群,但是mysql版本是5.7的,看到官网上mysql8的还是开发者版本,所以尝试搭建下mysql Innodb cluster集群. MySQL的高 ...

  3. Docker 搭建 Redis Cluster 集群环境

    使用 Docker 搭建 Redis Cluster,最重要的环节就是容器通信的问题,这一块我们在之前的文章中已经给大家解决了<Docker 网络模式详解及容器间网络通信>,本篇文章主要练 ...

  4. centos7搭建ELK Cluster集群日志分析平台(一):Elasticsearch

    应用场景: ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平 ...

  5. centos7搭建ELK Cluster集群日志分析平台

    应用场景:ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平台 ...

  6. centos7搭建ELK Cluster集群日志分析平台(四):Fliebeat-简单测试

    续之前安装好的ELK集群 各主机:es-1 ~ es-3 :192.168.1.21/22/23 logstash: 192.168.1.24 kibana: 192.168.1.25 测试机:cli ...

  7. centos7搭建ELK Cluster集群日志分析平台(三):Kibana

    续  centos7搭建ELK Cluster集群日志分析平台(一) 续  centos7搭建ELK Cluster集群日志分析平台(二) 已经安装好elasticsearch 5.4集群和logst ...

  8. centos7搭建ELK Cluster集群日志分析平台(二):Logstash

    续  centos7搭建ELK Cluster集群日志分析平台(一) 已经安装完Elasticsearch 5.4 集群. 安装Logstash步骤 . 安装Java 8 官方说明:需要安装Java ...

  9. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...

  10. centos6下redis cluster集群部署过程

    一般来说,redis主从和mysql主从目的差不多,但redis主从配置很简单,主要在从节点配置文件指定主节点ip和端口,比如:slaveof 192.168.10.10 6379,然后启动主从,主从 ...

随机推荐

  1. 3层结构+7大特点,带你认识华为云IoTEdge

    摘要:华为云IoTEdge三层架构联合打造的IoT边缘平台功能,持续为更多企业和开发者带来价值. 本文分享自华为云社区<[华为云IoTEdge学习笔记]华为云IoT边缘功能特点及价值>,作 ...

  2. 用GaussDB(for Redis)存画像,推荐业务轻松降本60%

    摘要:用户画像存储是推荐业务核心,但开源Redis无法胜任.华为云高斯Redis是最佳存储选型,轻松降本60%,同时获得企业级高稳定性. 本文分享自华为云社区<华为云GaussDB(for Re ...

  3. 想发自己的NFT,你要先搞清楚这6个问题

    摘要:NFT是Web3世界中标记数据资产独特性的标识,是数据权益的载体. 本文分享自华为云社区<加密数字艺术NFT背后你关心的六个问题>,作者: 薛腾飞 . Connect Wallet ...

  4. 9个问题,带你掌握流程控制语句中的java原理

    摘要:利用9个问题帮助记忆流程控制语句中的Java原理知识. 本文分享自华为云社区<流程控制语句知识点里的java原理>,作者:breakDraw . 相信大家经常会遇到这种问题 可是这个 ...

  5. 解析WeNet云端推理部署代码

    摘要:WeNet是一款开源端到端ASR工具包,它与ESPnet等开源语音项目相比,最大的优势在于提供了从训练到部署的一整套工具链,使ASR服务的工业落地更加简单. 本文分享自华为云社区<WeNe ...

  6. 再谈BOM和DOM(2):DOM节点层次/属性/选择器/节点关系/操作详解

    DOM模型将整个文档(XML文档和HTML文档)看成一个树形结构,并用document对象表示该文档. 根据W3C DOM规范,DOM是HTML与XML的应用编程接口(API),DOM将整个页面映射为 ...

  7. 高性能 Jsonpath 框架,Snack3 3.2.54 发布(支持 kotlin data 类反序化)

    Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...

  8. Axure 获取验证码

    拖两个矩形框,一个用来做文档输入,一个做获取验证码的按钮 设置全局变量OnLoadVariable的初如值为60 1.用例中的条件:当OnLoadVariable的值不等于0 2.用例中的步骤 禁用& ...

  9. 大数据-业务数据采集-FlinkCDC The MySQL server is not configured to use a ROW binlog_format

    Caused by: org.apache.kafka.connect.errors.ConnectException: The MySQL server is not configured to u ...

  10. 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(PV&PVC)

    使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix 使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- 持久化存储(NFS网络存储) ...