Docker实现Mariadb分库分表及读写分离功能

yizhihongxing
  1. 准备工作

在开始分库分表及读写分离功能的实现前,需要完成以下准备工作:

  1. 安装和配置Docker
  2. 创建两个或以上的Mariadb容器
  3. 使用mydumper工具备份原始数据库中的表
  4. 在备份数据上运行分库分表工具
  5. 按照需要在不同的数据库中保存备份数据

  6. 实现分库分表功能

按照以下步骤实现分库分表功能:

  1. 创建用于存储分片的数据容器。可使用以下命令创建数据容器:

docker run -itd --name db_part1 -e MYSQL_ROOT_PASSWORD=123456 mariadb

  1. 在容器中启动mysql客户端,并创建用于存储分片数据的数据库,例如table_1:

docker exec -it db_part1 mysql -uroot -p123456 --execute="CREATE DATABASE table_1"

  1. 安装分库分表工具Pool,详见:https://github.com/crossoverJie/cim

  2. 在Pool的目录下执行以下命令,将配置文件config.yml复制到类似db_sample的文件夹中,并在其中添加分片数据的配置:

cp config/config.yml db_sample/

  1. 修改db_sample文件夹中的config.yml文件,添加分片数据的配置。例如:

yml
dataSource:
names: ds_0,ds_1
ds_0:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/table_1?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
ds_1:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/table_2?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&maxReconnects=10&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
rule:
#分片策略
ds0:
dataSourceNames: ds_0,ds_1
algorithmClassName: com.alibaba.druid.pool.ha.HighAvailableLoadBalanceAlgorithm
ds1:
dataSourceNames: ds_0,ds_1
algorithmClassName: com.alibaba.druid.pool.ha.HighAvailableLoadBalanceAlgorithm
loadBalancer:
name: roundRobin
configMap:
ds_0: 50
ds_1: 50

在上述配置中,使用了两个数据库表,分别为table_1和table_2。

  1. 运行Pool,启动分片服务:

java -jar pool.jar db_sample/config.yml

  1. 通过mysql客户端连接分片服务,测试分片是否配置成功:

docker run -it --rm mariadb mysql -hlocalhost -P8081 -uroot -p123456 table_1

连接成功后,可执行以下SQL语句进行测试:

CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

通过以上步骤,便可成功实现Mariadb分库分表的功能。

  1. 实现读写分离功能

按照以下步骤实现读写分离功能:

  1. 在Docker中创建两个Mariadb容器,用于存储主从复制数据。

  2. 在主库中,创建新用户并授予读写权限,例如:

CREATE USER 'replicator'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'%';

  1. 在从库中,连接主库,进行数据复制。

CHANGE MASTER TO MASTER_HOST='主库IP地址',MASTER_USER='replicator',MASTER_PASSWORD='123456',MASTER_LOG_FILE='该文件第一条记录的File值',MASTER_LOG_POS=该文件第一条记录的Position值;
START SLAVE;

  1. 基于主从复制实现读写分离。在主库的cnf文件中添加读写分离的配置,例如:

```
[mysqld]
log_bin = mysql-bin
server-id = 1
binlog-format = row
transaction-isolation = READ-COMMITTED
binlog-do-db = test_db
bind-address = 0.0.0.0
skip-name-resolve
# 开启 GTID 之后必须配置如下三个参数
gtid_mode=ON
enforce_gtid_consistency=true
binlog_gtid_simple_recovery=ON
# 开启从库默认忽略错误以达到高可用的目的
slave-skip-errors=1062
read_only=ON
# 指定从库列表
relay-log-index= /data/mariadb2/data/relay-bin
relay-log = /data/mariadb2/data/relay-bin
slave-net-timeout=10
expire_logs_days = 30
max_binlog_size=100MB
# 配置用与读写分离的用户
[mysqld_multi]
mysqld1.cnf
mysqld2.cnf
[mysqld1]
server-id=1
datadir=/var/lib/msql
port=3306
log_bin =mysql-bin
binlog-format = row
log-slave-updates=ON
binlog_do_db=sbtest
bind-address=0.0.0.0
innodb_flush_log_at_trx_commit = 2
expire_logs_days=7
max_binlog_size=1000M
relay-log-index= /data/mariadb1/data/relay-bin
#relay_log_data_home_dir= /data/flashback/relat_log
relay_log = /data/mariadb1/data/relay-bin
read_only=1
skip-name-resolve
log-slave-updates
enforce-gtid-consistency
gtid-mode=on
report-host=mariadb_1
[mysqld2]
server-id=2
datadir=/var/lib/msql
port=3307
log_bin =mysql-bin
binlog-format = row
log-slave-updates=ON
binlog_do_db=sbtest
bind-address=0.0.0.0
innodb_flush_log_at_trx_commit = 2
expire_logs_days=7
max_binlog_size=1000M
relay-log-index= /data/mariadb2/data/relay-bin
#relay_log_data_home_dir= /data/flashback/relat_log
relay_log = /data/mariadb2/data/relay-bin
skip-name-resolve
log-slave-updates
enforce-gtid-consistency
gtid-mode=on
report-host=mariadb_2
read_only=1

[client]
user=root
socket=/var/run/mysqld/mysqld.sock

[mysql]
no-auto-rehash
```

  1. 开启Mariadb服务,并使用新增的用户进行读写分离的测试,例如:

docker exec -it db_master mysql -ureplicator -p123456 -e "use test_db; insert into test values(2019, 'good')"

通过以上步骤,便可成功实现Mariadb的分库分表以及读写分离的功能。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Docker实现Mariadb分库分表及读写分离功能 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • MySQL中库的基本操作指南(推荐!)

    MySQL是一种流行的开源关系型数据库管理系统,由于其使用方便、性能稳定、扩展能力强等特点,广泛被应用于各种Web应用程序中。在MySQL中,我们可以通过许多操作来管理和维护数据库,下面是一份MySQL中库的基本操作指南: 创建数据库 如果我们希望在MySQL中创建一个新的数据库,可以使用以下命令: CREATE DATABASE database_name…

    database 2023年5月22日
    00
  • 一文了解MySQL二级索引的查询过程

    让我来详细讲解一下“一文了解MySQL二级索引的查询过程”的完整攻略。 什么是MySQL二级索引 MySQL的二级索引也称为非聚集索引。通俗易懂的解释,就是在主索引外的索引,其存储方式为“单独索引”,不绑定表中的具体行数据。 MySQL二级索引查找流程概述 MySQL的二级索引在查找数据时,是通过B+树来实现的。以下是MySQL二级索引查找流程的概述: 从二…

    database 2023年5月22日
    00
  • mysql升级后报Table ‘mysql.servers’ doesn’t exist

    解决Table ‘mysql.servers’ doesn’t exist 今天遇到一事,就是我在升级mysql数据库后进入数据建立一远程用户,结果报错了。 mysql> flush privileges; ERROR 1146 (42S02): Table ‘mysql.servers’ doesn’t exist   这是由于升级完数据库后丢失原有…

    MySQL 2023年4月12日
    00
  • C#连接mysql数据库完整实例

    C#连接mysql数据库完整实例 前言 本文将介绍在C#中如何连接mysql数据库。通过阅读本文,你将学到如下知识: 下载并安装与mysql连接的必备工具; C#连接mysql数据库的代码; 如何进行数据库的增加/删除/修改/查询。 步骤 步骤一:安装mysql和mysql .NET Connector 下载并安装mysql数据库:从mysql官网下载安装m…

    database 2023年5月21日
    00
  • Android SQLite数据库版本升级的管理实现

    下面是详细讲解“Android SQLite数据库版本升级的管理实现”的完整攻略。 概述 在Android应用程序的开发中,我们通常需要使用SQLite数据库来存储数据,而数据库的版本升级是一个比较常见的操作。本篇攻略主要介绍如何在Android应用程序中实现SQLite数据库版本升级的管理。 步骤 1. 创建SQLiteOpenHelper子类 在Andr…

    database 2023年5月18日
    00
  • MySQL使用集合函数进行查询操作实例详解

    MySQL使用集合函数进行查询操作实例详解 在MySQL中,可以使用集合函数对数据进行聚合计算。本文将详细讲解MySQL中使用集合函数进行查询操作的步骤和示例。 集合函数 MySQL中的集合函数主要包括以下几个: COUNT:统计行数 SUM:求和 AVG:求平均值 MAX:求最大值 MIN:求最小值 使用这些函数可以轻松地对数据进行聚合计算。 查询操作实例…

    database 2023年5月22日
    00
  • MS SQL Server 和 PostgreSQL 的区别

    MS SQL Server和PostgreSQL都是常用的关系型数据库管理系统,但是它们有一些显著的区别。下面是它们之间的详细比较: 1. 开发与部署 MS SQL Server主要由Microsoft开发和维护,只能在Windows操作系统上运行。而PostgreSQL是一种开源软件,使用者可以在多种操作系统上运行,例如Windows,Linux和MacO…

    database 2023年3月27日
    00
  • Redis 的查询很快的原因解析及Redis 如何保证查询的高效

    Redis 具有查询快的特点是由于以下几个方面的原因: 1.基于内存的数据存储方式 Redis 是基于内存的数据库,所以具有非常快速的读写速度。Redis 能够达到如此高的性能指的是,通过数据缓存在内存中,可以大幅减少了 I/O 操作,从而提升了数据的访问速度。 与传统的关系型数据库相比,传统数据库对数据的存储是通过将数据写入磁盘中,因为 I/O 操作非常耗…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部