MySQL8.0技术分享——ZooKeeper 快速部署 DBLE 集群环境

发布时间:2020-04-29 浏览次数:196

ZooKeeper - 分布式协调技术 / DBLE - 分布式数据库中间件,使用二者搭建集群,能够为 MySQL 集群提供稳定的分布式协调环境,进一步实现服务高可用。

说明:ZooKeeper(以下简称 ZK) 可以单例管理 DBLE 集群,此文我们使用 ZK 的集群模式(至少3 台)管理 DBLE 集群,接下来介绍具体步骤:

  • 环境架构

  • 目的

  • 部署依赖

  • 安装DBLE (3台)

  • 部署 ZooKeeper 集群

  • 部署 DBLE 集群

  • 简单测试

  • 其他

环境架构

MySQL8.0技术分享——ZooKeeper 快速部署 DBLE 集群环境-爱可生


环境版本信息:

系统 | Linux :CentOS Linux release 7.5.1804 (Core)

中间件 | DBLE: 2.19.05.0

数据库 | MySQL :5.17.13

协调器 | ZooKeeper: 3.14.12


目的

利用 ZK 集群实现 DBLE 集群中各节点的状态和元数据的一致性,当集群中有节点故障时,可使用其他节点继续提供服务。通过实验,验证此架构的可行性。


部署依赖(重要)

1. 安装 JDK 版本 1.8 或以上,确保 JAVA_HOME 配置正确

2. 启动 MySQL 实例,创建好用户,并对该用户授权远程登陆权限


安装 DBLE (3台)

1. 下载安装包

wget https://github.com/actiontech/dble/releases/download/2.19.07.0%2Ftag/actiontech-dble-2.19.07.0.tar.gz

2. 解压安装包

tar zxvf actiontech-dble-2.19.05.0.tar.gz

3. 配置 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/dist/zookeeper/

2. 正确配置 ZOOKEEPER_HOME

3. 配置 zoo.cfg 将 zookeeper-3.4.12/conf 目录下的 zoo_sample.cfg 重命名为 zoo.cfg,修改 zoo.cfg,如下:

tickTime=2000initLimit=10syncLimit=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:3888server.id=zk2_server_ip:2888:3888server.id=zk3_server_ip:2888:3888

4. 其他两台 ZK 做相同配置

5. 创建 myid 文件,在 zookeeper-3.4.12/data 目录下创建文件 myid,该文件只有一行内容,即对应于每台服务器的 Server ID

6. 启动集群,在每台机器上启动 ZK 服务

cd zookeeper-3.4.12/bin && ./zkServer.sh start

7. 验证 ZK 集群部署成功,查看每台服务器在集群中的角色,其中一台为 Leader,其他两台为 Follower

cd zookeeper-3.4.12/bin && ./zkServer.sh status//如计划显示


部署 DBLE 集群

1. 在 dble/conf 目录下编辑文件 myid.properties 如下:

cluster=zk#clinet infoipAddress=zk_server_ip:zk_port#cluster namespace, please use the same one in one clusterclusterId=cluster-1#it must be different for every node in clustermyid=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.configfile/1.08myid.properties.md

2. 其他两台 DBLE 做相同配置,特别指出:每台 DBLE 的 myid 值必须不同

3. 启动所有 DBLE

cd dble/bin && ./dble start

4. 通过 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 @@configall;

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

结论: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/dble-docs-cn/2.Function/2.08_cluster.html

上一篇: 有关MySQL开源分布式的那些事儿: DBLE 负载均衡方案

下一篇: MySQL 8.0.17 clone 插件的使用

产品试用 产品试用
400-820-6580 免费电话