本文需读者掌握 ZooKeeper 和 DBLE 基本原理。

想要学习 DBLE 相关知识的小伙伴可以查看文章末尾的 DBLE 公开课。

ZooKeeper – 分布式协调技术 / DBLE – 分布式数据库中间件,使用二者搭建集群,能够为 MySQL 集群提供稳定的分布式协调环境,进一步实现服务高可用。
说明:ZooKeeper(以下简称 ZK) 可以单例管理 DBLE 集群,此文我们使用 ZK 的集群模式(至少3 台)管理 DBLE 集群,接下来介绍具体步骤:
  • 环境架构

  • 目的

  • 部署依赖

  • 安装DBLE (3台)

  • 部署 ZooKeeper 集群

  • 部署 DBLE 集群

  • 简单测试

  • 其他

环境架构

环境版本信息:
系统 | Linux :CentOS Linux release 7.5.1804 (Core)
中间件 | DBLE: 2.19.05.0
数据库 | MySQL :5.7.13
协调器 | ZooKeeper: 3.4.12
目的
利用 ZK 集群实现 DBLE 集群中各节点的状态和元数据的一致性,当集群中有节点故障时,可使用其他节点继续提供服务。通过实验,验证此架构的可行性。
部署依赖(重要)
1. 安装 JDK 版本 1.8 或以上,确保 JAVA_HOME 配置正确
2. 启动 MySQL 实例,创建好用户,并对该用户授权远程登陆权限
安装 DBLE (3台)
1. 下载安装包
  1. wget https://github.com/actiontech/dble/releases/download/2.19.05.0%2Ftag/actiontech-dble-2.19.05.0.tar.gz

2. 解压安装包
  1. tar zxvf actiontech-dble-2.19.05.0.tar.gz

3. 配置 DBLE 后端节点,修改 dble/conf/ 目录下 schema.xml 文件,配置 writeHost, readHost 为自己的 MySQL 实例,如下:
  1. <writeHost host="hostM1" url="ip1:3306" user="your_user" password="your_psw">

  2. <readHost host="hostS1" url="ip2:3306" user="your_user" password="your_psw"/>

  3. </writeHost>

部署 ZooKeeper 集群

1. 下载并解压安装包,官网链接:

http://archive.apache.org/dist/zookeeper/

2. 正确配置 ZOOKEEPER_HOME
3. 配置 zoo.cfg 将 zookeeper-3.4.12/conf 目录下的 zoo_sample.cfg 重命名为 zoo.cfg,修改 zoo.cfg,如下:
  1. tickTime=2000

  2. initLimit=10

  3. syncLimit=5

  4. #zookeeper客户端的端口

  5. clientPort=2181

  6. #zookeeper的data目录路径

  7. dataDir=/opt/zookeeper/data

  8. #zookeeper的日志目录的路径

  9. dataLoginDir=/opt/zookeeper/logs

  10. #id为ServerID,用来标识服务器在集群中的序号,server_ip为服务器所在的ip地址

  11. server.id=zk1_server_ip:2888:3888

  12. server.id=zk2_server_ip:2888:3888

  13. server.id=zk3_server_ip:2888:3888

4. 其他两台 ZK 做相同配置
5. 创建 myid 文件,在 zookeeper-3.4.12/data 目录下创建文件 myid,该文件只有一行内容,即对应于每台服务器的 Server ID
6. 启动集群,在每台机器上启动 ZK 服务
  1. cd zookeeper-3.4.12/bin && ./zkServer.sh start

7. 验证 ZK 集群部署成功,查看每台服务器在集群中的角色,其中一台为 Leader,其他两台为 Follower
  1. cd zookeeper-3.4.12/bin && ./zkServer.sh status

  2. //如计划显示

部署 DBLE 集群
1. 在 dble/conf 目录下编辑文件 myid.properties 如下:
  1. cluster=zk

  2. #clinet info

  3. ipAddress=zk_server_ip:zk_port

  4. #cluster namespace, please use the same one in one cluster

  5. clusterId=cluster-1

  6. #it must be different for every node in cluster

  7. myid=1

说明:ipAddress 可以配置集群中 1 个或多个或所有 ZK 的ip 和 port,配置多个 ip 时需要用 “,” 隔开 例:Address=172.100.9.1:2181,172.100.9.2:2181 详情可参考文档:https://github.com/actiontech/dble-docs-cn/blob/master/1.config_file/1.08_myid.properties.md

2. 其他两台 DBLE 做相同配置,特别指出:每台 DBLE 的 myid 值必须不同
3. 启动所有 DBLE
  1. cd dble/bin && ./dble start

4. 通过 ZK 客户端验证 DBLE 集群部署成功,在任何一台装有 ZK 的机器上登 ZK 的客户端,查看所有 DBLE 都在线,DBLE 集群部署成功!
  1. cd zookeeper-3.4.12/bin && ./zkCli.sh


  2. [zk: localhost:2181(CONNECTED) 0] ls /dble/cluster-1/online

  3. [001, 3, server_2]

简单测试
场景1:reload @@config_all 命令
目的:验证 reload @@config_all 命令能把配置同步到集群中所有节点
  • 步骤一:修改 DBLE-A 的 schema.xml,添加一个全局表,如下:

  1. <table name="test_global" dataNode="dn1,dn2" type="global"/>

  • 步骤二:连接 DBLE-A 管理端口,执行管理命令:reload @@config_all;

  • 步骤三:查看 DBLE-B 和 DBLE-C 的 schema.xml,观察到 test_global 已经更新到集群中其他节点

结论:DBLE 集群中主节点更新的配置,在执行 reload @@config_all 之后会下推到其他节点。


场景2:视图同步
目的:验证通过 DBLE 创建的视图只保存在 ZK 上,并在集群所有节点同步,不存在 MySQL 中
  • 步骤一:连接 DBLE-A 业务端口,创建视图,如下:

  1. mysql> create view view_test as select * from test_global;

  2. Query OK, 0 rows affected (0.10 sec)

  3. mysql> show tables;

  4. +-------------------+

  5. | Tables in schema1 |

  6. +-------------------+

  7. | test_global |

  8. | view_test |

  9. +-------------------+

  10. 2 rows in set (0.00 sec)

  • 步骤二:登陆 ZK 客户端查看,创建的视图已存在 ZK view 目录下

  1. [zk: localhost:2181(CONNECTED) 5] ls /dble/cluster-1/view

  2. [schema1:view_test]

  • 步骤三:连接 DBLE-B 业务端口,观察到视图存在于该节点

  1. mysql> show tables;

  2. +-------------------+

  3. | Tables in schema1 |

  4. +-------------------+

  5. | test_global |

  6. | view_test |

  7. +-------------------+

  8. 2 rows in set (0.00 sec)

  • 步骤四:直连MySQL,观察到创建的视图并没有存在 MySQL 中

  1. mysql> show tables;

  2. +-------------------+

  3. | Tables in schema1 |

  4. +-------------------+

  5. | test_global |

  6. +-------------------+

  7. 1 rows in set (0.00 sec)

结论:通过 DBLE 节点创建的视图存储在 ZK 中,并在集群中所有节点同步,不存在 MySQL 中。


场景3:当集群中有节点掉线
目的:验证当集群中有节点故障时,不影响集群向外提供服务
  • 步骤一:手动停掉 DBLE-A

  • 步骤二:连接 DBLE-C 业务端口,修改 test_global 表结构

  1. mysql> alter table test_global add column name varchar(20);

  2. Query OK, 0 rows affected (0.15 sec)

  • 步骤三:连接 DBLE-B 业务端口,查看 test_global 表结构

  1. mysql> desc test_global;

  2. +-------+-------------+------+-----+---------+-------+

  3. | Field | Type | Null | Key | Default | Extra |

  4. +-------+-------------+------+-----+---------+-------+

  5. | id | int(11) | YES | | NULL | |

  6. | name | varchar(20) | YES | | NULL | |

  7. +-------+-------------+------+-----+---------+-------+

  8. 2 rows in set (0.01 sec)

结论:DBLE 集群中,当其他节点掉线或故障时,不影响其他节点提供服务
DBLE系列公开课回顾

第一章 DBLE的基本使用

1.1 DBLE概述

1.2 DBLE的配置

1.3 DBLE的管理端口

第二章 DBLE的高级特性

2.1 分布式特性

2.2 后端数据库相关特性

2.3 可靠性/可运维功能

2.4 MySQL兼容性

第三章 DBLE的进阶使用

3.1 SQL性能分析

3.2 故障分析

3.3 聊聊性能测试

3.4 运维实施

第四章 终章:现状/Roadmap/Q&A(待更新)

近期社区动态