暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

亚信安慧AntDB-M之Docker容器化一键分布式部署及体验

AntDB数据库 2024-11-01
171



    摘   要


AntDB-M分布式数据库不仅支持内存和磁盘双引擎、分布式事务以及满足分布式ACID特性,而且还支持灵活的在线弹性伸缩、数据均衡,具备良好的高可用特性和容灾能力,并能提供秒级的自动故障检测和自动故障服务切换。


内容较多,建议电脑端阅读



一、AntDB-M分布式数据库架构

AntDB-M分布式数据库采用存储分离设计,基于经典的Paxos一致性协议实现数据多副本的强一致性;采用一致性哈希算法,保证数据分布均衡;支持SQL2016标准,对应用开发完全透明,应用平滑迁移;支持内存和磁盘双引擎,满足业务的多种需求;采用了协程、条件下推等多种优化策略,深度适配多种平台,满足了高并发,低延迟的场景要求。架构图如下图所示:

图1:AntDB-M分布式架构图

AntDB-M分布式数据库主要由数据库驱动、管理节点、计算节点(可选)、数据节点这四个部分组成。各个节点都可以独立部署,节点间通过网络进行通信。

接下去将分别对这几个组成部分进行说明。

【数据库驱动】

AntDB-M数据库支持常用的JDBC、ODBC以及Python驱动程序,通过驱动程序访问AntDB-M分布式数据库集群时,集群内部的拓扑结构、数据分布情况对应用来说都是透明的。除此之外,驱动程序还支持负载均衡,故障转移,读写分离,以满足应用程序的不同使用场景。

【管理节点】

管理节点主要负责管理元数据、集群中的节点,分发DDL和DCL,并记录全局统计信息,同时支持高可用。通俗来讲,管理节点保存了集群中所有数据库对象的元数据,比如库、表、视图、触发器、存储过程、函数等数据模型的定义信息;保存集群中的用户及权限信息,数据分片信息(如分片数量,主从副本)等。同时,管理节点中保存有集群的统计信息,包括每个分片的数据分布情况、全局统计信息直方图、各个节点的连接数等。所有的DDL和DCL,都是先在管理节点执行成功后,再分发给集群内的计算节点和数据分片主节点。

【计算节点】

计算节点从应用或者管理节点接收SQL请求,进行SQL解析、SQL分析和优化,生成分布式执行计划。计算节点不支持主备模式,只要节点在线,就是主节点,部署时可选。

【数据节点】

数据节点负责保存数据,支持高可用,同时也具备计算节点的功能。数据节点主节点发生故障后,高可用组会选出一个新的主,一个高可用组即一个数据分片。在数据节点上,数据的存放是根据建表时指定的分片规则,把数据进行横向切片来保存到不同的数据分片中的,数据分片支持再细分成分区表(Partition),每个分区的物理文件可以单独保存。数据分片中的主节点支持读写,备节点支持读。



二、AntDB-M Docker分布式部署安装

Docker容器的安装在之前介绍集中式部署安装时已有提及,可翻阅该篇文章的相关内容,Docker环境准备就绪后,就可以开始在Docker中分布式部署AntDB-M数据库了。

  • 加载AntDB-M的镜像文件到Docker容器中

    antdbinstall% docker load -i antdb_m_ce.tar
    4826cdadf1ef: Loading layer [======================================>] 207.8 MB/207.8 MB
    585b1e8486f7: Loading layer [======================================>] 382.5 MB/382.5 MB
    7aea642f51af: Loading layer [======================================>] 2.211 GB/2.211 GB
    Loaded image: antdb_m:ce

    • 加载完成后,通过docker images命令查看镜像信息

      antdbinstall%docker images
      REPOSITORY TAG IMAGE ID CREATED SIZE
      antdb_m ce 594526154da3 8 minutes ago 2.79 GB

      • 通过镜像来启动容器,执行docker run命令来启动

        docker run -itd --name="antdb_m_d" --add-host=antdb-127-0-0-1:127.0.0.1 -p 40000:4000 antdb_m:ce

        参数说明:

        --add-host:为容器设置域名;

        -p:设置端口映射,把容器内的4000端口映射到宿主机的40000端口,方便其他主机访问该容器内的AntDB-M分布式数据库集群服务;

        • 容器启动成功后,执行docker ps查看容器的运行状态

          antdbinstall% docker ps
          CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
          508d5fdc9a1e antdb_m:ce "/bin/bash" 2 seconds ago Up 1 second 0.0.0.0:40000->4000/tcp antdb_m_d

          • 执行docker exec命令来登录到容器中

            antdbinstall% docker exec -it antdb_m_d bash
            [root@508d5fdc9a1e ]#

            • 登录Docker容器后,在命令行提示符中切换到antdb安装用户

              [root@508d5fdc9a1e ]# su – antdb

              • 编辑分布式版本的安装配置文件

                [antdb@508d5fdc9a1e ~]$ vi home/install/setup/common/initconf-d.ini
                [client]
                cluster_type = D
                [env_info]
                env = antdb,127.0.0.1,22,/data/antdb/app/antdb,env01
                [node_info]
                node = env01,0,1,1,4000,/data/antdb/node/mn_1,master
                node = env01,0,2,2,4010,/data/antdb/node/mn_2,slave
                node = env01,0,3,3,4020,/data/antdb/node/mn_3,slave
                node = env01,1,4,4,5000,/data/antdb/node/dn1_1,master
                node = env01,1,5,5,5010,/data/antdb/node/dn1_2,slave
                node = env01,1,6,6,5020,/data/antdb/node/dn1_3,slave
                node = env01,2,7,7,6000,/data/antdb/node/dn2_1,master
                node = env01,2,8,8,6010,/data/antdb/node/dn2_2,slave
                node = env01,2,9,9,6020,/data/antdb/node/dn2_3,slave
                node = env01,1024,10,10,4090,/data/antdb/node/cn_1
                node = env01,1024,11,11,5090,/data/antdb/node/cn_2

                表1:配置项说明

                参数名

                说明

                cluster_type
                固定值D,表示分布式版本
                env
                环境信息定义,格式:host_user,host_ip,host_port,antdb_apppath, env_name
                host_user
                主机安装用户
                host_id
                主机IP地址
                host_port
                安装用户登录时使用的SSH端口
                antdb_apppath
                AntDB-M程序安装目录
                env_name
                标识安装用户的环境名称定义
                node
                节点信息定义,格式:env_name,antdb_distribution_id,server_id, antdb_access_id,antdb_port,antdb_datapath, role
                env_name
                安装节点所用的环境名称定义
                antdb_distribution_id
                分片ID 管理节点:0 数据节点:1~1023(同一分片内主备配置一致) 计算节点:1024
                server_id
                分布式节点编号,AntDB-M内部的标识,唯一
                antdb_access_id
                节点编号,集群内唯一
                antdb_port
                节点的服务端口
                antdb_datapath
                节点使用的数据文件目录,需指定为空目录;
                role
                节点的角色,master(主节点),slave(备节点)配置高可用集群时需填写

                在命令行提示符下执行安装,输入命令sh home/install/antdb_m.sh -c home/install/setup/common/initconf-d.ini
                  [antdb@508d5fdc9a1e ~]$ sh /home/install/antdb_m.sh -c /home/install/setup/common/initconf-d.ini
                  AntDB install begins
                  [Info] Checking OS information ... ok
                  [Info] Checking hardware information ... ok
                  [Attention] What going to show below is AntDB product use agreement. Ready to read it? [yes/no, Default: yes]
                  输入yes显示并阅读AntDB产品协议
                    [Attention] What going to show below is AntDB product use agreement. Ready to read it? [yes/no, Default: yes]yes
                    输入yes同意AntDB产品协议
                      AsiaInfo Anhui's contact information is provided below:
                      Address: 12/F, Tower A, Huanglong Time Plaza, No.278 Tianmushan Road, Xihu District, Hangzhou, Zhejiang Province
                      Postcode: 310000
                      Tel: 86-571-8190 3773
                      Website:asiainfoah.com
                      National Service Hotline: 4001068668
                      [Caution] Do you agree to the product agreement? [yes/no, Default: yes] yes
                      选择安装目录
                        [Info] Choose an empty directory to install AntDB. [Default: /data/antdb/app/antdb]
                        输入回车后,安装程序将会自动完成安装,并提示是否进行初始化
                          [Attention] Excute 'source /data/antdb/.bashrc' to make the environment variables take effect.
                          [Attention] For better performance of database, following files can be used as reference to set OS kernel config manually.
                          If you want to modify these parameters, please modify the following files before initialization. (ps.Donot change the user name "install_user")
                          /home/install/setup/common/kernel_limits.conf
                          /home/install/setup/common/kernel_sysctl.conf
                          AntDB install succeeds!
                          [Attention] What going to do below is AntDB initialization. Have you changed the configuration file (initconf-d.ini) ? [yes/no, Default: yes]yes
                          输入yes,安装程序将会自动完成初始化并启动AntDB-M分布式集群,如下图所示:
                          图2:启动AntDB-M分布式集群
                          • 安装完成后重新载入环境变量,让安装时设置的环境变量对当前用户生效
                            [antdb@508d5fdc9a1e ~]$ source ./.bashrc
                            • 访问分布式集群,默认登录用户为root,密码为123456,出于安全考虑,建议首次登录后进行密码修改
                            在容器内访问可使用本地ip地址127.0.0.1进行连接:
                              [antdb@508d5fdc9a1e ~]$ antdb -uroot -p123456 -h127.0.0.1 -P4000
                              外部主机访问该容器内的分布式集群,则把ip地址修改为宿主机的ip,端口修改为容器启动时映射的端口,命令行如下所示:
                                antdbinstall% antdb -uroot -p123456 -h192.168.1.131 -P40000

                                三、AntDB-M分布式数据库初体验
                                AntDB-M分布式数据库在Docker容器中启动后,就可以通过命令行方式在AntDB-M数据库中进行操作。接下来将通过一些操作演示,来对AntDB-M分布式数据库有一个初步的认识和了解。
                                【查看节点信息】
                                命令行中查询节点信息的SQL如下:
                                  select m.ip,n.* from antdb_config.antdb_machines_info m left join information_schema.antdb_node_info n on m.sharding_id=n.sharding_id and m.access_id=n.access_id order by sharding_id;
                                  查询结果如下图所示:
                                  图3:查询结果
                                  从查询结果中可以看到节点信息中包含了节点的IP地址、分片信息、节点类型、主备角色、服务端口等,通过这个信息,可以方便的查看各个节点的状态,及时发现异常及时处理。
                                  【创建数据库】
                                    antdb> CREATE DATABASE ctest;
                                    +--------+----------------+---------+
                                    | NodeId | DistributionId | Message |
                                    +--------+----------------+---------+
                                    | 4 | 1 | OK |
                                    | 7 | 2 | OK |
                                    | 10 | 1024 | OK |
                                    | 11 | 1024 | OK |
                                    +--------+----------------+---------+
                                    4 rows in set (0.11 sec)
                                    【创建分布式表】
                                    创建一张名称为product的分布式表
                                      antdb> CREATE TABLE product (
                                      ->id int NOT NULL PRIMARY KEY,
                                      ->productNo varchar(50) DEFAULT NULL,
                                      ->name varchar(100) DEFAULT NULL,
                                      ->price decimal(10,2) DEFAULT NULL -> )COMMENT='table_type=sharding,sharding_key=id,sharding_type=hash';
                                      +--------+----------------+---------+
                                      | NodeId | DistributionId | Message |
                                      +--------+----------------+---------+
                                      | 4 | 1 | OK |
                                      | 7 | 2 | OK |
                                      | 10 | 1024 | OK |
                                      | 11 | 1024 | OK |
                                      +--------+----------------+---------+
                                      4 rows in set (0.81 sec)
                                      在COMMENT中的关键字说明如下:
                                      table_type:表类型,支持sharding,global,single,分别表示分布式表,全局表,单节点表
                                      sharding_key:分片键的列名,支持多个字段组合,以|分隔,表类型为sharding时选填,不填默认以表的主键为分片键
                                      sharding_type:分片键类型,支持hash,range,list,表类型为sharding时选填,不填默认为hash类型
                                      【查看分布式表的元数据信息】
                                        antdb> select * from antdb_config.antdb_table_sharding_info;
                                        +-------------------+--------------+---------------+-------------------+
                                        | table_name | col_name | table_type | sharding_type |
                                        +-------------------+--------------+---------------+-------------------+
                                        | ./ctest/product | id | sharding | hash |
                                        +-------------------+--------------+---------------+-------------------+
                                        1 row in set (0.01 sec)
                                        表中记录了分片键列名,表的类型以及分片键的类型
                                        【插入数据】
                                          antdb> INSERT INTO product values(1, 'No1001', '产品1', 15.23),(2, 'No1002', '产品2', 18.50),(3, 'No1003', '产品3', 8.99);
                                          【查询数据分布】
                                          先连接数据分片1,查询当前数据分片所存储的数据:
                                            [antdb@508d5fdc9a1e ~]$ antdb -uroot -p123456 -h127.0.0.1 -P5000
                                            antdb> call crab.switch_mode(0);
                                            +------------+------+------+
                                            | NAME | FROM | TO |
                                            +------------+------+------+
                                            | CRAB_MODE | 1 | 0 |
                                            +------------+------+------+
                                            1 row in set (0.00 sec)
                                            antdb> select * from ctest.product;
                                            +----+-----------+---------+-------+
                                            | id | productNo | name | price |
                                            +----+-----------+---------+-------+
                                            | 2 | No1002 |产品2 | 18.50 |
                                            | 3 | No1003 |产品3 | 8.99 |
                                            +----+-----------+---------+-------+
                                            2 rows in set (0.00 sec)
                                            其中crab.switch_mode()内置函数传入参数0表示只查询本节点的数据,从查询结果可以得知,数据分片1存储了2条数据;
                                            连接数据分片2,查询该数据分片上存储的数据:
                                              [antdb@508d5fdc9a1e ~]$ antdb -uroot -p123456 -h127.0.0.1 -P6000
                                              antdb> call crab.switch_mode(0);
                                              +------------+------+------+
                                              | NAME | FROM | TO |
                                              +------------+------+------+
                                              | CRAB_MODE | 1 | 0 |
                                              +------------+------+------+
                                              1 row in set (0.00 sec)
                                              antdb> select * from ctest.product;
                                              +----+-----------+---------+-------+
                                              | id | productNo | name | price |
                                              +----+-----------+---------+-------+
                                              | 1 | No1001 |产品1 | 15.23 |
                                              +----+-----------+---------+-------+
                                              1 row in set (0.00 sec)
                                              由查询结果可知,数据分片2存储了1条数据,说明数据是分布式存储的。
                                              另外一种更简单的查询方法,可直接在管理节点查询元数据统计信息,如下所示:
                                                antdb> select * from information_schema.antdb_table_stats;
                                                +----------+---------------+-------------------+----------+-----------------+-------------+
                                                | TABLE_ID | NAME | STATS_INITIALIZED | NUM_ROWS | GLOBAL_NUM_ROWS | MANAGE_INFO |
                                                +----------+---------------+-------------------+----------+-----------------+-------------+
                                                | 1070 | ctest/product | sharding | 0 | 3 | 2:1,1:2, |
                                                +----------+---------------+-------------------+----------+-----------------+-------------+
                                                1 row in set (0.00 sec)
                                                其中GLOBAL_NUM_ROWS列记录了表中所有的数据行数,MANAGE_INFO列记录了各个数据分片存储的数据条数,2:1,1:2表示分片2存储1条数据,分片1存储2条数据,与上面单独连接数据分片查询数据条数的结果也保持了一致。

                                                总结
                                                以上就是AntDB-M在Docker容器内的一键分布式部署操作介绍,以及分布式表操作的简单体验。篇幅有限,如对AntDB-M分布式数据库的一些进阶内容感兴趣,请持续关注亚信安慧AntDB数据库公众号。

                                                关于亚信安慧AntDB数据库
                                                AntDB数据库始于2008年,在运营商的核心系统上,服务国内24个省市自治区的数亿用户,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行超十年,并在通信、金融、交通、能源、物联网等行业成功商用落地。

                                                点击了解 往期精彩


                                                点击“阅读原文”
                                                查看更多AntDB技术加油站内容
                                                🔽

                                                文章转载自AntDB数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                评论