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

  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日

相关文章

  • Springboot mybais配置多数据源过程解析

    下面就详细讲解“Springboot mybais配置多数据源过程解析”的完整攻略。 一、引入依赖 首先,我们需要在pom.xml文件中引入相关的依赖,具体如下: <dependencies> <!–SpringBoot启动器–> <dependency> <groupId>org.springframew…

    database 2023年5月18日
    00
  • php性能优化分析工具XDebug 大型网站调试工具

    下面是详细的攻略。 简介 XDebug是一款专业的PHP扩展,主要用于PHP代码的性能分析和调试。它具有以下特点: 支持代码覆盖率分析 支持性能分析 支持调试功能 支持远程调试 XDebug是一个非常强大的工具,在大型网站的调试和性能优化过程中,是不可缺少的。下面将介绍XDebug的基本用法和相关示例。 安装XDebug 在正式使用XDebug之前,需要先安…

    database 2023年5月22日
    00
  • MySQL数据更新操作的两种办法(数据可视化工具和SQL语句)

    MySQL数据库更新操作是指在已有数据的基础上对数据库中的数据进行修改。常见的两种更新方式为使用数据可视化工具和通过SQL语句手动更新数据库。 一、使用数据可视化工具更新数据库 打开MySQL数据可视化工具,如Navicat、Workbench等; 连接到需要修改的数据库; 选择需要修改的数据表,打开该表的编辑界面; 找到需要更新的数据行,双击该行进行编辑;…

    database 2023年5月22日
    00
  • 在 Ubuntu 16.04 为 Nginx 服务器安装 LEMP 环境(MariaDB,PHP 7 并支持 HTTP 2.0)

    下面我将为您详细讲解“在 Ubuntu 16.04 为 Nginx 服务器安装 LEMP 环境(MariaDB,PHP 7 并支持 HTTP 2.0)”的完整攻略。 环境要求 在开始设置 LEMP 环境之前,请确保已满足以下条件: 已使用 sudo 权限登录到 Ubuntu 16.04 服务器; 已安装 Nginx 服务器; 已配置域名解析到服务器的 IP …

    database 2023年5月22日
    00
  • Linux后台运行Python程序的几种方法讲解

    下面是Linux后台运行Python程序的几种方法的详细讲解。 1. 使用nohup命令 nohup命令可以使你在注销账户或关闭终端时,程序仍然保持运行。该命令的基本语法为: nohup python your_program.py & 其中,your_program.py为需要后台运行的Python程序文件名,&符号表示在后台运行程序。运行…

    database 2023年5月22日
    00
  • 如何使用Python更新数据库中的数据?

    当需要更新数据库中的数据时,可以使用Python连接到数据库并执行SQL UPDATE语句。以下是使用Python更新数据库中的数据的完整攻略: 连接数据库 要连接到数据库,需要提供数据库的主机名、用户名、密码和数据库名称。可以使用以下代码连接MySQL: import mysql.connector mydb = mysql.connector.conne…

    python 2023年5月12日
    00
  • MySQL实战之Insert语句的使用心得

    MySQL实战之Insert语句的使用心得 简介 Insert语句是MySQL中用于插入数据的关键字,它的正确使用对于数据的插入、更新等操作是非常重要的。本文将会详细讲解Insert语句的使用方法和心得,同时提供一些示例说明。 Insert语句的用法 Insert语句的基本语法如下所示: INSERT INTO table_name (column1, co…

    database 2023年5月22日
    00
  • MySQL由浅入深探究存储过程

    MySQL由浅入深探究存储过程攻略 什么是存储过程 存储过程是一种预编译的语句集合,可以被保存在数据库中并作为一个单元被调用。它可以接收参数并返回结果,是一种封装复杂操作的有效手段。存储过程可以提高数据库性能,优化应用程序的逻辑结构。 创建存储过程 创建存储过程可以使用CREATE PROCEDURE语句。 CREATE PROCEDURE procedur…

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