一.安装docker

详情访问教程

如果想要使用Linux图形化界面,可以安装宝塔面板,或者Linux系统桌面版

二.安装MySQL

1.在docker中拉取MySQL镜像(版本可自行选择,这里是8.0.20)

docker pull mysql:8.0.20

2.查看docker镜像

docker images

三.部署MySQL集群(一主二从)

  1. 创建主从MySQL的配置及数据文件的存储目录
# 创建主服务的配置目录和数据目录
mkdir -p /usr/local/mysqlData/master/cnf
mkdir -p /usr/local/mysqlData/master/data

# 创建1号从服务器的配置目录和数据目录
mkdir -p /usr/local/mysqlData/slave/cnf
mkdir -p /usr/local/mysqlData/slave/data

# 创建2号从服务器的配置目录和数据目录
mkdir -p /usr/local/mysqlData/slave2/cnf
mkdir -p /usr/local/mysqlData/slave2/data

创建两个从服务器的配置是因为MySQL配置的server-id不能重复

  1. 配置主服务器的配置文件
vim /usr/local/mysqlData/master/cnf/mysql.cnf

配置文件如下

[mysqld]
## 设置server_id,注意要唯一
server-id=1
## 开启binlog
log-bin=mysql-bin
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
##设置字符编码为utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4

  1. 配置从服务器的配置文件
# 1号从服务器
vim /usr/local/mysqlData/slave/cnf/mysql.cnf
# 2号从服务器
vim /usr/local/mysqlData/slave2/cnf/mysql.cnf

配置文件如下(1号的server-id设置为2,2号的server-id设置为3,不重复即可)

[mysqld]
## 设置server_id,注意要唯一
server-id=2
## 开启binlog
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## binlog缓存
binlog_cache_size=1M
## binlog格式(mixed、statement、row,默认格式是statement)
binlog_format=mixed
##设置字符编码为utf8mb4
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
slave_skip_errors=1062
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4

  1. 创建主从MySQL容器
# 主服务器实例化
docker run -itd -p 3307:3306 --name master -v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/master/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.20
# 1号从服务器实例化
docker run -itd -p 3308:3306 --name slaver -v /usr/local/mysqlData/slave/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/slave/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.20
# 2号从服务器实例化
docker run -itd -p 3309:3306 --name slaver4 -v /usr/local/mysqlData/slaver4/cnf:/etc/mysql/conf.d -v /usr/local/mysqlData/slaver4/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.35

参数解释

-p 指定容器暴露的端口,宿主机(物理机)端口: docker实例端口
-p 3307:3306 把物理机的3307端口给实例的端口3306端口进行映射

-v 给容器挂载存储卷,挂载到容器的某个目录
-v /usr/local/mysqlData/master/cnf:/etc/mysql/conf.d 把刚创建的配置文件夹映射成实例的/etc/mysql/conf.d
-v /usr/local/mysqlData/master/data:/var/lib/mysql 数据文件夹的映射

-e 指定环境变量,容器中可以使用该环境变量
-e MYSQL_ROOT_PASSWORD=123456 设置MySQL的root账号密码为123456

  1. 查看创建的容器
# 查看运行中的容器
docker ps -a
# 查看全部容器
docker ps

  1. 创建mysql连接用户
#进入到主服务的MySQL
docker exec -it master mysql -uroot -p123456

# 创建用户 reader设置密码为reader
CREATE USER reader IDENTIFIED BY 'reader';
# 给予reader同步权限及远程连接
GRANT REPLICATION SLAVE ON *.* to 'reader'@'%';
FLUSH PRIVILEGES;

注解:其余的用户,远程连接的自行设置

  1. 获取主服务器的连接信息
# MySQL的连接信息
SHOW MASTER STATUS;

#新开连接 获取master实例的在docker的地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' master

  1. 从服务器连接主服务器(两台从服务器均是以下操作,要进入从服务的MySQL中设置)

    # 配置连接的参数
    change master to master_host='172.17.0.2',master_user='reader',master_password='reader',master_log_file='mysql-bin.000002',master_log_pos=156,get_master_public_key=1;
    # 启动同步
    start slave;
    # 查看是否成功
    show slave status\G

    # 两项都为Yes时代表成功。
    # Slave_IO_Running: Yes
    # Slave_SQL_Running: Yes

    # 失败需要使用停止连接后检查其他账号密码,地址,pos等参数

    # 停止连接,如果一次成功无需使用该命令
    stop slave;
    #清除主从关系
    RESET SLAVE ALL;

{% label primary @注意如果无法成功,请在从服务器上也配置用户和主服务一样 %}

三.结果

主服务器执行命令

SHOW SLAVE HOSTS;

能从主服务器查询到从服务器的ID以及端口。完成MySQL部署。

四 为了安全,要为刚刚新建的用户新建数据库和授权对改数据库的操作

  1. 切换root用户新建数据库

    CREATE DATABASE mydatabase
    CHARACTER SET utf8mb4
    COLLATE utf8mb4_unicode_ci;

    上述命令将创建名为 “mydatabase” 的数据库,并将字符集设置为 “utf8mb4”,排序规则设置为 “utf8mb4_unicode_ci”。

  2. 查看数据库列表

    SHOW DATABASES;

  3. 授权

    GRANT SELECT, INSERT, UPDATE, DELETE ,CREATE,DROP ON mydatabase.* TO 'reader'@'%';

    上述命令将授予名为 “reader” 的用户在 “mydatabase” 数据库上的 SELECT、INSERT、UPDATE 和 DELETE,CREATE,DROP 权限,"%"为远程,“localhost为本地主机只能本地连接”。

  4. 刷新权限

    FLUSH PRIVILEGES;

  5. 确认权限是否生效

    SHOW GRANTS FOR 'username'@'host';

    将 “username” 和 “host” 替换为你创建的用户的用户名和主机。