Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]系统环境:Ubuntu 18.04.4 Docker 19.03.6 一、MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.1…

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用

一、MySQL读写分离主从模式

1. 下载镜像

docker pull mysql
当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

2. 启动主节点并修改配置文件

docker run -it --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql bash
修改/etc/mysql/my.cnf配置文件(还得先apt update更新软件包列表才能安装vim等编辑工具,比较繁琐,所以可以选择先配置好my.cnf文件再docker run -v 挂载进容器)
配置文件 my.cnf 修改如下:

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql

# 以上是原有默认配置,add variables如下:
# 在同一个Master-Slave集群里不能有重复id
server-id       = 3306
# 不配置默认3306
# port		= 3306
# 二进制日志文件存储路径及名称(在docker容器内涉及到权限问题,所以直接写在datadir下)
log-bin         = /var/lib/mysql/binlog
# 需要开启binlog的数据库,多个则配置多行binlog-do-db
binlog-do-db    = training
# binlog-do-db	= db2
# binlog-do-db	= db3
# 密码认证方式(加密方式) MySQL 8.0+ 默认是caching_sha2_password
# 如果需要直接连接可以如下改回老版本的mysql_native_password或者create user时identified with mysql_native_password by <passwd>针对单个用户
# default_authentication_plugin	= mysql_native_password

代码100分

注:修改完配置文件后需要重启mysql才能生效,一般命令是systemctl restart mysqld,但是在docker容器中没有权限执行systemctl命令,所以选择退出容器后 docker restart <container>

代码100分docker exec -it mysql bash
mysql -uroot -p [-hx.x.x.x -P3306]
# 创建用户, @"ip"可以用@"%",不限IP
create user "replica"@"x.x.x.x" identified by "123456";
# 赋予复制权限
GRANT REPLICATION SLAVE ON *.* to "replica"@"x.x.x.x";
FLUSH PRIVILEGES;
# 查看主机状态
show master status;

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
记下File和Position两个参数值在从库连接主库时将用到

3. 从节点配置
# 容器内依然使用3306端口,免去修改端口的麻烦,宿主机端口使用3307
docker run -it --name mysql_3307 -p 3307:3306 -e MYSQL_ROOT_PASSWORD mysql bash

从节点my.cnf配置主要修改server-id不同,不需要log-bin和binlog-do-db参数

代码100分[mysqld]
server-id       = 3307
# 容器内端口
# port		= 3306
# 读写分离,从库只读(0: 读写,1: 只读)
read_only	= 1
# 限制super用户,read_only只限制普通用户写操作
super_read_only	= 1

重启容器后生效

Ctrl+P+Q 快捷键
docker restart mysql_3307
docker exec -it mysql_3307
mysql -uroot -p123456	# 如果容器内也使用3307端口,需跟上参数 -P3307

stop slave;
# 连接主机	CHANGE MASTER TO option [, option] ...
change master to master_host="xxx.xxx.xxx.xx",
master_port=3306,
master_user="replica",
master_password="123456",
# 这两个参数要跟上述截图master status的参数值一致
master_log_file="binlog.000010",
master_log_pos=155,
# 默认使用caching_sha2_password加密方式时添加如下参数
get_master_public_key=1,
# 或者使用master_public_key_path指定主机公钥文件
master_public_key_path="/etc/mysql/master_rsa_public.key";

# 启动slave进程
# 查看从机状态
show slave statusG

至此主从复制配置完成,Slave_IO_Running和Slave_SQL_Running都为Yes说明开启主从同步成功,
否则可以查看Slave_SQL_Running_State状态查看失败原因,或者没有没有执行start slave; Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
change master的更多参数可见官网:https://dev.mysql.com/doc/refman/8.0/en/change-master-to.html
关于主机公钥文件获取:
进入master后show variables like “%caching_sha2_password%”;
可以看到Caching_sha2_password_rsa_public_key或者key_path: public_key.pem,这个文件路径:/var/lib/mysql/public_key.pem
拷贝–BEGIN……END–这部分内容到从服务器,可以新建文件/etc/mysql/master_rsa_public.key写入。
change master时master_public_key_path="/etc/mysql/master_rsa_public.key"参数指定 ;
客户端登录时mysql -uroot -p --server-public-key-path=/etc/mysql/master_rsa_public.key指定

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]

4. 备份主库已有数据

完成上述步骤后,后续对主机的写操作才会同步到从机,开启同步前主机已有数据并不会同步,需要备份后导入从库,再开启主从同步。
(1)备份前锁定主库,只允许读不允许写,防止备份过程中、开启主从同步前有新数据插入

mysql> show global variables like "%read_only%";
mysql> set global read_only=1;
mysql> set global super_read_only=1	# 限制super用户写操作
# 如果当前不是super用户,需要限制super用户写操作就执行给所有表加读锁命令,但是当前连接不能退出,否则就自动释放锁了
mysql> flush tables with read lock;

(2)备份主库
mysqldump语法:
Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
备份命令: docker exec mysql /usr/bin/mysqldump -uroot -p123456 training > mysql_master_backup.sql
注:对于警告不要在命令行输入密码的问题,可以先在/etc/mysql/my.cn添加配置:

[mysqldump]
user		= root
password	= 123456

然后执行docker exec mysql mysqldump training > mysql_master_backup.sql
(3)将备份数据导入从库
注:需要在从库中建立好同名数据库才能将数据导入从库
mysql> create database training;
同理在从库的my.cnf中添加配置:

[mysql]
user		= root
password	= 123456

导入数据: cat mysql_master_backup.sql | docker exec -i mysql_3307 /usr/bin/mysql training
(4)开启主从同步
也就是上面2、 3点的步骤了,最好是在锁表前先配置好,只留最后 change master 和 start slave 到这里执行,以减少锁表的时间。
change master 注意修改 master_log_file 和 master_log_pos 的值与 master status 的值一致。
(5)释放主库的锁

mysql> unlock tables;
mysql> set global read_only=0;
mysql> set global super_read_only=0;
mysql> show global variables like "%read_only%";

注:线上环境要注意尽量减少锁表的时间和锁表的范围!

mysql> show full processlist; 可以看到: Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
至此读写分离的主从架构就搭建完成了,但不会自动进行主备切换,自动切换需要第三方工具配合,如:
Keepalived 与MySQL互为主从自动切换配置
MHA 实现MySQL主从自动切换 高可用 (Master High Availability)

对于配置文件错误无法启动容器的情况可以先把配置文件复制出来修改好再复制回去:

docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH
docker cp [OPTIONS] SRC_PATH CONTAINER:DEST_PATH
docker cp mysql_3307:/etc/mysql/my.cnf ./my.cnf
docker cp ./my.cnf mysql_3307:/etc/mysql/my.cnf

端口开放情况排查:

  • 能否ping通
  • netstat -apt 端口监听状态
  • telnet ip port 能否远程连接
  • ECS 安全规则配置
  • 防火墙(ufw)
  • iptables (iptables -I INPUT -p tcp –dport 3308 -j ACCEPT)

二、分布式数据库中间件Mycat分库分表简单应用

1. Mycat 安装

Mycat 官网 查找所需版本下载链接

# 下载
wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz Mycat-server-1.6.7.4-release-linux.tar.gz
# 解压至 /etc/,会自动创建 mycat 目录
tar -zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /etc

Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
conf目录下有三个主要的配置文件:

  • server.xml  Mycat系统配置信息,包括账号密码、权限、端口等参数
  • scheme.xml  Mycat的逻辑库、表、分片规则、DataNode以及DataSource
  • rule.xml   表拆分规则定义

因为Mycat到目前为止,还不支持caching_sha2_password的加密方式,所以连接节点时mycat.log日志会报错如下:
can”t connect to mysql server ,errmsg:Client does not support authentication protocol requested by server;
Docker搭建MySQL读写分离主从模式 & 分布式数据库中间件Mycat分库分表应用[亲测有效]
只能更改登录user@ip的密码加密方式为较早版本的mysql_native_password:

mysql> select user, host, plugin from mysql.user;
mysql> ALTER USER "root"@"%" IDENTIFIED BY "123456" PASSWORD EXPIRE NEVER;
mysql> ALTER USER "root"@"%" IDENTIFIED WITH mysql_native_password BY "123456";
mysql> FLUSH PRIVILEGES;
mysql> select user, host, plugin from mysql.user;

待续……

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9047.html

(0)
上一篇 2023-02-16
下一篇 2023-02-16

相关推荐

  • Linux安装Python

    Linux安装Python在安装Python之前,需要准备好以下工具:

    2024-09-02
    26
  • 使用Python编写更快的算法

    使用Python编写更快的算法Python是一种强大而简单易学的编程语言。对于许多类别的问题,Python是一种很好的解决方案。然而,以牺牲效率为代价的语言也常常会发生在Python上,因为它往往比编译语言慢得多。在这篇文章中,我们将讨论如何使用Python编写更快的算法,同时保持代码简洁易懂。

    2024-01-03
    107
  • strcnmp函数的使用-23

    strcnmp函数的使用-23#include #include main() { char *list[]={“qwertytyy”,”qwexfgdgrgg”,”12344ryryyry”,”asdddff”}; int x…

    2023-04-11
    173
  • Linux内核优化_Linux优化

    Linux内核优化_Linux优化现在MySQL运行的大部分环境都是在Linux上的,如何在Linux操作系统上根据MySQL进行优化,我们这里给出一些通用简单的策略。这些方法都有助于改进MySQL的性能。 闲话少说,进入正题。 一…

    2022-12-16
    142
  • mysql系列(九)——sql优化「建议收藏」

    mysql系列(九)——sql优化「建议收藏」一、

    2023-03-18
    159
  • mongoDB在windows系统下的启动与连接。

    mongoDB在windows系统下的启动与连接。mongodb的安装非常简单,官网有提供安装版和绿色版的下载(外网,速度慢的一批,网速跟不上的同志建议从其他渠道下载),我本地装的是安装版的,目录为默认目录。再此不细聊如何安装,直接进入主题,首先是如

    2023-03-20
    151
  • Python List计数:快速统计数据出现次数

    Python List计数:快速统计数据出现次数Python是一种广泛使用的高级编程语言,用于广泛的应用程序开发,其语言特性之一是灵活而强大的数据结构支持。Python List是一个动态的数组,可以容纳不同类型的元素。Python List计数是指通过Python编写程序来找出列表中每个元素出现的次数,这种方法在数据科学,迭代和数据分析中非常常见。

    2024-03-12
    85
  • excel快捷小技巧_电子表格办公小技巧汇总大全

    excel快捷小技巧_电子表格办公小技巧汇总大全天下武功,唯快不破。快既是一种境界,也是一种能力。今天就和大家分享6个Excel快速操作小技巧,让你可以节省更多时间,毕竟时间就是生命,时间就是金钱。1、快速求和求和大家都知道可以使用SUM函数,但是

    2023-03-02
    157

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注