gpt4 book ai didi

docker配置Mysql主从集群

转载 作者:我是一只小鸟 更新时间:2023-04-14 14:31:26 38 4
gpt4 key购买 nike

docker 配置Mysql集群

Docker version 20.10.17, build 100c701 。

MySQL Image version: 8.0.32 。

Docker container mysql-master is source. mysql-replica is replication. 。

master == source. replica == slave.名称叫法不一样而已.

Choose one of the way ,与replica同步数据两种情况:

  1. source有存在的数据并且你想同步到replica,这种需要mysqldump备份source数据,然后CHANGE REPLICATION SOURCE TO
  2. you are setting up a new source and replica combination,其实就是你source没有数据,没有想同步到replica的,这种的不需要mysqldump备份source数据复原到replica,直接CHANGE REPLICATION SOURCE TO

网络大多为第二种情况,那么我就写第一种情况,第一种情况基本就多了mysqldump这个步骤.

Pull MySQL image And run mysql-master

                        
                          docker pull mysql/mysql-server:latest

                        
                      

你可以去Docker Hub寻找适合的版本: docker hub 。

主节点的my.cnf配置为:

                        
                          [mysqld]
server_id=1
socket=/var/lib/mysql/mysql.sock
user=mysql

                        
                      

Mysql8很多配置已经为默认,比如binlog默认开启,log_replica_updates默认开启,注意server_id需要source和replica不要相同.

datadir文件夹下要注意为空才行,否则会启动不成功。如果启动过程遇到任何问题,可以使用 docker logs mysql-master 命令查看出了什么问题.

注意docker使用mount命令,需要文件或者文件夹都存在,而-v不需要。 可搜索--mount和-v两个命令的区别.

                        
                          docker run -p 3307:3306 --name mysql-master \
--mount type=bind,src=/root/working/mydata/mysql-master/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/root/working/mydata/mysql-master/datadir,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql/mysql-server:latest

                        
                      

-p: 3307为云服务器端口,我用他连接datagrip。3306为容器内部端口.

mount:src为云服务路径,dst为容器内部路径.

MYSQL_ROOT_PASSWORD:为root用户指定密码,否则需要在docker logs去查看此容器自己生成的密码.

创建一个远程访问的账号和一个做主从同步的账号

创建一个远程访问的账号,方便我们使用datagrip等工具连接我们的数据库.

注意云服务器的 安全组规则, 是否把我们需要的端口放开了,比如3306,3307,3308 。

docker exec -it mysql-master mysql -uroot -p 命令进入到数据库,root账号的密码为上面我们设置的 root 。

进来数据库后,我们创建账号:

                        
                          #添加远程登录用户
CREATE USER 'keboom'@'%' IDENTIFIED BY 'keboom';
GRANT ALL PRIVILEGES ON *.* TO 'keboom'@'%';

                        
                      

keboom这个账号用来datagrip软件连接我们的数据库.

接着我们创建一个用来做主从同步的用户:

                        
                          CREATE USER 'repl'@'%' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

                        
                      

repl这个账号用来replica节点来向source节点同步数据.

mysqldump命令在主库备份数据,接着从库恢复此备份

  1. 在主库执行 FLUSH TABLES WITH READ LOCK; 将主库只读,这时记录主库binlog位置,并做mysqldump备份。备份做好之后,则解锁.

  2. 我们新开一个终端,进入数据库执行 SHOW MASTER STATUS\G 获得主库binlog位置.

                                
                                  mysql> SHOW MASTER STATUS\G
    *************************** 1. row ***************************
                 File: binlog.000002
             Position: 2185
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    
    
                                
                              
  3. 我们再新开一个终端,执行 docker exec -it mysql-master bash ,进入容器进行备份.

    注意 docker exec -it mysql-master bash 和 docker exec -it mysql-master mysql -uroot -p 区别 。

  4. mysqldump -uroot -p --databases test --source-data > dbdump.db ,这里我自己创建了一个test数据库,我只备份这一个数据库。可以在test数据库创建一个表,插入几条数据,用来验证同步数据是否成功.

  5. UNLOCK TABLES; 备份好数据之后,就可以解锁了.

启动replica节点

replica—my.cnf配置为:

                        
                          [mysqld]
server_id=21
socket=/var/lib/mysql/mysql.sock
user=mysql

                        
                      
                        
                          docker run -p 3308:3306 --name mysql-replica \
--mount type=bind,src=/root/working/mydata/mysql-replica/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/root/working/mydata/mysql-replica/datadir,dst=/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql/mysql-server:latest

                        
                      
  1. replica启动好后,将 dbdump.db 文件复制到挂载的目录下,进入到replica容器,执行 mysql -uroot -p < dbdump.db ,这时我们就把备份恢复到从节点了,我们可以在主库试着添加几条数据,可以看到此时从库还不能同步数据.

  2. 进入到replica数据库,执行命令:

                                
                                  CHANGE REPLICATION SOURCE TO
        -> MASTER_HOST='172.17.0.2',SOURCE_USER='repl',SOURCE_PASSWORD='repl',SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=2185,GET_MASTER_PUBLIC_KEY=1;
    
    MASTER_PORT如果你的mysql用的不是3306,记得设置一下。
    
                                
                              

    获得MASTER_HOST,可执行:

                                
                                  docker inspect mysql-master | grep IP                                   
                "LinkLocalIPv6Address": "",
                "LinkLocalIPv6PrefixLen": 0,
                "SecondaryIPAddresses": null,
                "SecondaryIPv6Addresses": null,
                "GlobalIPv6Address": "",
                "GlobalIPv6PrefixLen": 0,
                "IPAddress": "172.17.0.2",
                "IPPrefixLen": 16,
                "IPv6Gateway": "",
                        "IPAMConfig": null,
                        "IPAddress": "172.17.0.2",
                        "IPPrefixLen": 16,
                        "IPv6Gateway": "",
                        "GlobalIPv6Address": "",
                        "GlobalIPv6PrefixLen": 0,
    
    
                                
                              

    SOURCE_USER就是我们在主库创建的用于主从同步的用户.

    SOURCE_LOG_FILE,SOURCE_LOG_POS是上面在主库中查询到的.

    GET_MASTER_PUBLIC_KEY,mysql8 默认使用 caching_sha2_password authentication plugin。replica需要向source获得公匙.

  3. START REPLICA,

  4. SHOW REPLICA STATUS\G 查看同步状态。如果 Replica_IO_Running 和 Replica_SQL_Running 都为Yes那么基本就成功了。如果有其他问题,可以通过docker logs mysql-replica查看日志.

可以试试在test数据库的表中插入几条数据,看看从库是否同步过来.

参考文档: https://dev.mysql.com/doc/refman/8.0/en/binlog-replication-configuration-overview.html 。

最后此篇关于docker配置Mysql主从集群的文章就讲到这里了,如果你想了解更多关于docker配置Mysql主从集群的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com