0%

Ubuntu中通过Docker安装配置MySQL主从节点

1.拉取MySQL5.7镜像到本地

1
2
3
4
docker pull mysql:5.7

# 如果你只需要跑一个mysql实例,不做主从,那么执行以下命令即可,不用再做后面的参考步骤: docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 然后用shell或客户端软件通过配置( 用户名:root 密码:132456 IP:你的本机ip 端口:3306)来登录即可

2.准备MySQL的配置文件

MySQL5.7安装之后的默认配置文件在/etc/mysql/my.cnf,而自定义的配置文件一般放在/etc/mysql/config.d这个路径下。
在本地host主机上自定义的某个目录下(如/data/mysql/conf/),先创建两个文件master.conf和slave.conf,分别用于配置主从两个节点。

  • /data/mysql/conf/master.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [client] 
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    log_bin = log #开启二进制日志,用于从节点的历史复制回放
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    server_id = 1 #需保证主库和从库的server_id不同, 假设主库设为1
    replicate-do-db=fileserver #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项
  • /data/mysql/conf/slave.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [client] 
    default-character-set=utf8
    [mysql]
    default-character-set=utf8
    [mysqld]
    log_bin = log #开启二进制日志,用于从节点的历史复制回放
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
    server_id = 2 #需保证主库和从库的server_id不同, 假设从库设为2
    replicate-do-db=fileserver #需要复制的数据库名,需复制多个数据库的话则重复设置这个选项

3. Docker分别运行MySQL主/从两个容器

将mysql主节点运行起来

1
2
mkdir -p /data/mysql/datam 
docker run -d --name mysql-master -p 13306:3306 -v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datam:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

运行参数说明:

1
2
3
4
5
–name mysql-master: 容器的名称设为mysql-master 
-p 13306:3306: 将host的13306端口映射到容器的3306端口
-v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : master.conf配置文件挂载
-v /data/mysql/datam:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datam, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456

将mysql从节点运行起来

1
2
mkdir -p /data/mysql/datas 
docker run -d --name mysql-slave -p 13307:3306 -v /data/mysql/conf/slave.conf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /data/mysql/datas:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

运行参数说明:

1
2
3
4
5
–name mysql-slave: 容器的名称设为mysql-slave 
-p 13307:3306: 将host的13307端口映射到容器的3306端口
-v /data/mysql/conf/master.conf:/etc/mysql/mysql.conf.d/mysqld.cnf : master.conf配置文件挂载
-v /data/mysql/datam:/var/lib/mysql : mysql容器内数据挂载到host的/data/mysql/datam, 用于持久化
-e MYSQL_ROOT_PASSWORD=123456 : mysql的root登录密码为123456

4.登录MySQL主节点配置同步信息

宿主机安装mysql客户端

1
sudo apt-get install -y mysql-client

登录mysql

1
2
# 192.168.1.xx 是你本机的内网ip 
mysql -u root -h 192.168.1.xx -P13306 -p123456

在mysql client中执行 (创建用于访问主节点来同步数据的帐号)

1
2
3
4
mysql> create user slave identified by 'slave'; 
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY 'slave';
mysql> flush privileges;
mysql> create database fileserver default character set utf8mb4;

再获取status, 得到类似如下的输出:

1
2
3
4
5
6
mysql> show master status\G; 
*************************** 1. row ***************************
File: log.000025
Position: 155 Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set: 1 row in set (0.00 sec)

5.登录MySQL从节点配置同步信息

  • 查看mysql master的容器独立ip地址

    1
    2
    docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master 
    # 比如输出得到: 172.17.0.2
  • 另开一个tab登录mysql

    1
    2
    # 192.168.1.xx 是你本机的内网ip 
    mysql -u root -h 192.168.1.xx -P13307 -p123456
  • 在mysql client中操作:

1
2
3
4
5
mysql> stop slave; 
mysql> create database fileserver default character set utf8mb4;
#注意其中的日志文件和数值要和上面show master status的值对应
mysql> CHANGE MASTER TO MASTER_HOST='前两个步骤中获得的mysql master ip',MASTER_PORT=3306,MASTER_USER='slave',MASTER_PASSWORD='slave',MASTER_LOG_FILE='log.000025',MASTER_LOG_POS=155;
mysql> start slave;

再获取status, 正常应该得到类似如下的输出:

1
2
3
4
5
mysql> show slave status \G; 
// ...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
// ...

到这时说明主从配置已经完成,可以尝试在主mysql的fileserver数据库里建表操作下,然后在从节点上检查数据是否已经同步过来。

几个指令

sudo netstat -antup -antup | grep docker 查看docker占用端口
ifconfig 查看本机ip

通过docker compose方式实现

https://github.com/mayinghan/mysql-master-slave-service