目录
(5)给从节点或许Binlog创建一个普通账户,并设置一定读权限
一、主从架构服务器规划
上篇文章我们分析了集群架构的优点,并简单了解了水平分片、垂直分片对于主从节点网络规划的影响。但是为了方便入门,我们这里采用最简单的规划方式:一主两从,并且从节点直接从主节点获取同步日志。

而端口号设计如下:

二、Docker的容器、仓库、镜像分别是啥?
Docker 仓库可以类比成手机里的应用商店 ,它是存放各种应用安装包的集合;镜像就像是商店里的单个应用安装包 (比如微信、小红书的安装包),是只读的、打包好的 "应用模板";容器则是这些应用安装包运行起来的实例,也就是你手机上正在使用的微信、小红书 App。
简单来说:
- 仓库:应用商店,存各种镜像。
- 镜像:应用安装包,是静态的模板。
- 容器:正在运行的 App,是动态的实例。
不过Docker相较于普通虚拟机的优点在于:极致的轻量化、安全的隔离性、方便的多开性。即一个应用软件可以多开几次,每一次开启都在一个独立的Docker容器中,互不干扰。
三、主节点配置
(1)修改配置文件:修改端口号与文件映射等
由于MySQL服务器是运行在Dokcer中的,而一台Ubuntu机器上运行了多个Docker容器进程,他们有着共同的IP地址,所以需要通过端口号来区分每一个Docker容器,从而实现主从架构的配置。
配置端口号显然可以直接通过修改/etc/mysql下的可编辑文本配置文件来实现,即:

但如果我们有多个Docker容器,则需要进入每一个Docker,分别修改端口号等配置信息,这样未免有点太过麻烦。于是我们选择将每一个Docker的配置文件都映射到宿主机的某一个文件上,以后就可以直接在宿主机上修改配置信息了。
于是我们先在宿主机创建一些目录,方便后续设置映射:
cpp
#创建目录
#这里的路径可以自定义,但是一定要方便查看、记忆
mkdir -p /bit/mysql/master/conf
mkdir -p /bit/mysql/master/mysql

创建好目录之后,下一步就是在Docker中安装mysql,给mysql设置好端口号、id、名字等,更重要的是建立与宿主机的文件映射关系。
cpp
sudo docker run -d \
-p 53306:3306 \
-v /bit/mysql/master/conf:/etc/mysql/conf.d \
-v /bit/mysql/master/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name bit-mysql-master \
mysql:8.0
其中这两行-v的就是在建立目录映射。而其他的操作也是必要的。执行完成这一步之后,就已经在Docker中一键安装好了合适的mysql应用,并且基本的配置也都完成了,同时该docker容器已经跑在后台了。
可以使用sudo docker ps来查看是否启动:

(2)进入Docker容器启动mysql
cpp
#进入名为 bit-mysql-master 的容器,打开一个交互式的 bash 终端。
#并临时设置环境变量,把编码集改为UTF8,避免中文乱码
sudo docker exec -it bit-mysql-master env LANG=C.UTF-8 /bin/bash

cpp
#在mysql的命令行中登录root账户,并输入密码
mysql -uroot -p123456

后续你可以自由的退出mysql命令行以及Docker命令行了,不用担心退出就停止运行了。他们只是退出了交互终端,而在后台默默的运行。
(3)外部连接测试:Navicat连接
在Ubuntu命令行中使用ip a查看宿主机的ip地址,这是外部连接的关键。毕竟外部连接只能感受到宿主机,然后由宿主机和Docker软件进行端口映射转发。



(4)在宿主机创建配置文件并生效
cpp
#用vim创建并编写my.cnf配置文件
sudo vim /bit/mysql/master/conf/my.cnf
然后将以下配置信息全部拷贝到里面去:
cpp
[mysqld]
# 服务器唯一ID,集群中每个节点都不能重复,主库用 13253306,从库需要改成别的数字
#这里的id号一般是取自宿主机的ip地址+该Docker的端口号。比如我这里就是XXX 132:53306
server-id=13253306
# 开启二进制日志,文件前缀是 binlog,主从复制必须开启
log-bin=binlog
# 二进制日志格式,ROW 格式会记录每一行数据的变化,是生产环境推荐的安全格式
binlog_format=ROW
# 二进制日志保留10天(864000秒),防止日志文件占满磁盘
binlog_expire_logs_seconds=864000
# 事务提交前,强制把 binlog 写入磁盘,防止宕机导致日志丢失
sync-binlog=1
关于这个配置文件,它主要就是设置了一下该节点的id号、和二进制日志的格式、信息等。这个二进制文件就是上一篇文章说的主从节点之间用于数据同步的关键。
然后重启Docker容器里面的mysql服务,使刚刚的配置信息生效。
cpp
#这一步是在宿主机执行的
sudo docker restart bit-mysql-master

并在外部连接Navicat中查看配置文件是否生效了。

(5)给从节点或许Binlog创建一个普通账户,并设置一定读权限
因为从节点需要不断从主节点获取Binlog文件,然后在自己本地进行回放。所以必须能够访问Mysql服务器,而Mysql规定想要访问必须得建立连接。之前学习的时候我们都是使用root账户,但这个权限过高,给从节点不具备安全性。因此需要创建一个普通账户,并给他一定读权限。
这里的账户仅仅用于连接权限管理,而不在意每次连接从哪里开始读。这个是由从节点自己记录到自己本地的文件中的,每次读取binlog之前都先看看自己上次读到哪里了。所以一个账户多方共用。
cpp
#以下代码在Navicat中执行
create user 'bit_slave'@'%' identified with mysql_native_password by '123456';


cpp
grant REPLICATION SLAVE on *.* to 'bit_slave'@'%';


cpp
flush privileges;

cpp
select u.host, u.user, u.Repl_slave_priv from mysql.user u;

cpp
show master status;

这里我们看到有829个字节的数据在binlog.000003文件在,我们可以直接在宿主机查看是否真的有:
四、从节点配置
(1)创建配置文件、并启动Docker容器
在Ubunt宿主机上执行这句代码,它会自动创建映射目录并且启动一个运行mysql的Docker容器。
cpp
sudo docker run -d \
-p 53307:3306 \
-v /bit/mysql/slave1/conf:/etc/mysql/conf.d \
-v /bit/mysql/slave1/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
--name bit-mysql-slave1 \
mysql:8.0


(2)创建配置文件
在这里需要给刚刚创建的从节点,设置节点id、中继日志名等,与主机创建的配置文件基本一致。这里的文件名仍然是my.cnf,要放在mysql/slave2/conf路径下。
cpp
# MySQL服务器节点
[mysqld]
# 服务器唯一id,默认值为1
server-id=13253307
# 二进制日志基本名,Linux下默认为binlog,window下默认为"机器名-bin"
# 生产环境推荐自定义日志路径
log-bin=binlog
# 二进制日志的格式,默认为ROW,生产环境也推荐用ROW
binlog_format=ROW
# 二进制日志过期时间,指定10天,默认30天
binlog_expire_logs_seconds=864000
# 在事务提交之前把二进制日志写入磁盘
sync-binlog=1
################################ 从服务器配置 ################################
# 中继日志基本名,默认为"机器名-relay-bin",也可以指定自定义路径
relay-log=relay-bin
#以下配置都先不启用,后续有需要的话再逐一开启
# 服务器启动时不启动复制,稍后手动启动使用start REPLICA语句。
# MySQL8.0.26之前用skip-slave-start=ON,稍后手动启动使用start SLAVE语句。
# skip-replica-start=ON
# SQL线程执行的更新写入副本自己的二进制日志,MySQL8.0.26之前用log_slave_updates=ON
# 如果要实现 "A服务器 <-- B服务器 <-- C服务器" 这种链式日志同步,则B服务器即是主又是从,需要开启该选项
# log-replica-updates=ON
# 禁用二进制日志
# skip-log-bin
# 指定需要复制的数据库,默认复制全部数据库
# binlog-do-db=db_name
# 设置不需要复制的数据库,每行指定一个数据库,可以配置多行
# binlog-ignore-db=db_name1
# binlog-ignore-db=db_name2
然后重启该节点,使配置有效。
cpp
sudo docker restart bit-mysql-slave1

(3)给从节点配置主节点信息与连接账户
在从节点的交互端口输入一下代码:
cpp
CHANGE MASTER TO
MASTER_HOST = '192.168.23.132',
MASTER_PORT = 53306,
MASTER_USER = 'bit_slave',
MASTER_PASSWORD = '123456',
MASTER_LOG_FILE = 'binlog.000003',
MASTER_LOG_POS = 829;
最后重复以上步骤,创建第二个从节点即可。
(4)测试日志同步性
首先将两个从节点都开启同步:
cpp
#在各自节点的mysql交互终端中输入:
START REPLICA;
然后我们在主节点创建一个表,插入一定数据,观察剩下两个从节点是否数据同步了。
cpp
#创建一个数据库
CREATE DATABASE IF NOT EXISTS bit_db;
#使用该表
use bit_db;
#创建表
create table if not exists t_user(
id BIGINT PRIMARY KEY auto_increment,
name varchar(20) not NULL
);
#插入一条记录
INSERT into t_user (name) values('张三');

