作者:叶晓莉
本文需读者掌握 ZooKeeper 和 DBLE 基本原理。
想要学习 DBLE 相关知识的小伙伴可以查看文章末尾的 DBLE 公开课。

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

  • 环境架构
  • 目的
  • 部署依赖
  • 安装 DBLE (3台)
  • 部署 ZooKeeper 集群
  • 部署 DBLE 集群
  • 简单测试
  • 其他

环境架构

280902915242363245.jpg

环境版本信息:
系统 | 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. 下载安装包
wget https://github.com/actiontech/dble/releases/download/2.19.05.0%2Ftag/actiontech-dble-2.19.05.0.tar.gz
  1. 解压安装包
tar zxvf actiontech-dble-2.19.05.0.tar.gz
  1. 配置 DBLE 后端节点,修改 dble/conf/ 目录下 schema.xml 文件,配置 writeHost, readHost 为自己的 MySQL 实例,如下:
<writeHost host="hostM1" url="ip1:3306" user="your_user" password="your_psw">
     <readHost host="hostS1" url="ip2:3306" user="your_user" password="your_psw"/>
</writeHost>

部署 ZooKeeper 集群

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

http://archive.apache.org/dis...

  1. 正确配置 ZOOKEEPER_HOME
  2. 配置 zoo.cfg 将 zookeeper-3.4.12/conf 目录下的 zoo_sample.cfg 重命名为 zoo.cfg,修改 zoo.cfg,如下:
tickTime=2000
initLimit=10
syncLimit=5
#zookeeper客户端的端口
clientPort=2181
#zookeeper的data目录路径
dataDir=/opt/zookeeper/data
#zookeeper的日志目录的路径
dataLoginDir=/opt/zookeeper/logs
#id为ServerID,用来标识服务器在集群中的序号,server_ip为服务器所在的ip地址
server.id=zk1_server_ip:2888:3888
server.id=zk2_server_ip:2888:3888
server.id=zk3_server_ip:2888:3888
  1. 其他两台 ZK 做相同配置
  2. 创建 myid 文件,在 zookeeper-3.4.12/data 目录下创建文件 myid,该文件只有一行内容,即对应于每台服务器的 Server ID
  3. 启动集群,在每台机器上启动 ZK 服务
cd zookeeper-3.4.12/bin && ./zkServer.sh start
  1. 验证 ZK 集群部署成功,查看每台服务器在集群中的角色,其中一台为 Leader,其他两台为 Follower
cd zookeeper-3.4.12/bin && ./zkServer.sh status
//如计划显示

部署 DBLE 集群

  1. 在 dble/conf 目录下编辑文件 myid.properties 如下:
cluster=zk
#clinet info
ipAddress=zk_server_ip:zk_port
#cluster namespace, please use the same one in one cluster
clusterId=cluster-1
#it must be different for every node in cluster
myid=1
说明:ipAddress 可以配置集群中 1 个或多个或所有 ZK 的ip 和 port,配置多个 ip 时需要用 "," 隔开 例:Address=172.100.9.1:2181,172.100.9.2:2181 详情可参考文档:https://github.com/actiontech...
  1. 其他两台 DBLE 做相同配置,特别指出:每台 DBLE 的 myid 值必须不同
  2. 启动所有 DBLE
cd dble/bin && ./dble start
  1. 通过 ZK 客户端验证 DBLE 集群部署成功,在任何一台装有 ZK 的机器上登 ZK 的客户端,查看所有 DBLE 都在线,DBLE 集群部署成功!
cd zookeeper-3.4.12/bin && ./zkCli.sh

[zk: localhost:2181(CONNECTED) 0] ls /dble/cluster-1/online
[001, 3, server_2]

简单测试

场景1:reload @@config_all 命令

目的:验证 reload @@config_all 命令能把配置同步到集群中所有节点

  • 步骤一:修改 DBLE-A 的 schema.xml,添加一个全局表,如下:
<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 业务端口,创建视图,如下:
mysql> create view view_test as select * from test_global;
Query OK, 0 rows affected (0.10 sec)
mysql> show tables;
+-------------------+
| Tables in schema1 |
+-------------------+
| test_global |
| view_test |
+-------------------+
2 rows in set (0.00 sec)
  • 步骤二:登陆 ZK 客户端查看,创建的视图已存在 ZK view 目录下
[zk: localhost:2181(CONNECTED) 5] ls /dble/cluster-1/view
[schema1:view_test]
  • 步骤三:连接 DBLE-B 业务端口,观察到视图存在于该节点
mysql> show tables;
+-------------------+
| Tables in schema1 |
+-------------------+
| test_global |
| view_test |
+-------------------+
2 rows in set (0.00 sec)
  • 步骤四:直连MySQL,观察到创建的视图并没有存在 MySQL 中
mysql> show tables;
+-------------------+
| Tables in schema1 |
+-------------------+
| test_global |
+-------------------+
1 rows in set (0.00 sec)

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

场景3:当集群中有节点掉线

目的:验证当集群中有节点故障时,不影响集群向外提供服务

  • 步骤一:手动停掉 DBLE-A
  • 步骤二:连接 DBLE-C 业务端口,修改 test_global 表结构
mysql> alter table test_global add column name varchar(20);
Query OK, 0 rows affected (0.15 sec)
  • 步骤三:连接 DBLE-B 业务端口,查看 test_global 表结构
mysql> desc test_global;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

结论:DBLE 集群中,当其他节点掉线或故障时,不影响其他节点提供服务

其他
需要了解集群同步状态的操作和细节,请查看开源文档:https://actiontech.github.io/...


爱可生开源社区
426 声望207 粉丝

成立于 2017 年,以开源高质量的运维工具、日常分享技术干货内容、持续的全国性的社区活动为社区己任;目前开源的产品有:SQL审核工具 SQLE,分布式中间件 DBLE、数据传输组件DTLE。