- 准备工作
在开始分库分表及读写分离功能的实现前,需要完成以下准备工作:
- 安装和配置Docker
- 创建两个或以上的Mariadb容器
- 使用mydumper工具备份原始数据库中的表
- 在备份数据上运行分库分表工具
-
按照需要在不同的数据库中保存备份数据
-
实现分库分表功能
按照以下步骤实现分库分表功能:
- 创建用于存储分片的数据容器。可使用以下命令创建数据容器:
docker run -itd --name db_part1 -e MYSQL_ROOT_PASSWORD=123456 mariadb
- 在容器中启动mysql客户端,并创建用于存储分片数据的数据库,例如table_1:
docker exec -it db_part1 mysql -uroot -p123456 --execute="CREATE DATABASE table_1"
-
安装分库分表工具Pool,详见:https://github.com/crossoverJie/cim
-
在Pool的目录下执行以下命令,将配置文件config.yml复制到类似db_sample的文件夹中,并在其中添加分片数据的配置:
cp config/config.yml db_sample/
- 修改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。
- 运行Pool,启动分片服务:
java -jar pool.jar db_sample/config.yml
- 通过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分库分表的功能。
- 实现读写分离功能
按照以下步骤实现读写分离功能:
-
在Docker中创建两个Mariadb容器,用于存储主从复制数据。
-
在主库中,创建新用户并授予读写权限,例如:
CREATE USER 'replicator'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replicator'@'%';
- 在从库中,连接主库,进行数据复制。
CHANGE MASTER TO MASTER_HOST='主库IP地址',MASTER_USER='replicator',MASTER_PASSWORD='123456',MASTER_LOG_FILE='该文件第一条记录的File值',MASTER_LOG_POS=该文件第一条记录的Position值;
START SLAVE;
- 基于主从复制实现读写分离。在主库的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
```
- 开启Mariadb服务,并使用新增的用户进行读写分离的测试,例如:
docker exec -it db_master mysql -ureplicator -p123456 -e "use test_db; insert into test values(2019, 'good')"
通过以上步骤,便可成功实现Mariadb的分库分表以及读写分离的功能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Docker实现Mariadb分库分表及读写分离功能 - Python技术站