docker 安装mysql(单机版以及 主从模式)

向右看齐 2023-02-28 04:28 117阅读 0赞

单机版 Mysql

1、拉取镜像:docker pull daocloud.io/library/mysql:5.7.6(根据自己的来)

20200720100903315.png

2、准备Mysql数据存放目录,我这里是:/home/docker-volume/data/mysql-master(我在后面要搭建读写分离)

3、执行指令启动Mysql

  1. docker run --name mysql-master --privileged=true -v /home/docker-volume/mysql-master/data:/var/lib/mysql -v /home/docker-volume/mysql-master/conf:/etc/mysql/conf.d -p 9091:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6

注意这里: —privileged=true 需要加,这个参数的作用是:使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。

如果不加该参数,挂载卷那会提示报错,如下:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70

加入参数后成功:

20200720112037690.png

使用GUI工具连接

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70 1

成功

主从复制安装

master节点

在宿主机上找个目录创建 my.cnf文件,写入

  1. [mysqld]
  2. #唯一ID
  3. server-id=1
  4. # 开启binlog 文件记录
  5. log-bin=mysql-bin
  6. #记录日志的数据库
  7. binlog-do-db=test
  8. #不记录数据库
  9. binlog-ignore-db=mysql

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70 2

注:也可以先启动容器,不用提前写好配置,后面改也行,只是要重启而已,按自己的方式来就行

启动master

  1. docker run --name mysql-master --privileged=true -v /home/docker-volume/mysql-master/data:/var/lib/mysql -v /home/docker-volume/mysql-master/conf:/etc/mysql/conf.d -p 9091:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6

尝试远程连接" class="reference-link">20200720165858592.png 尝试远程连接

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70 3

查看master状态

  1. show master status;

20200720165957926.png

注:记住File 和 Position参数,后面要用

创建连接账户

进入mysql操作界面,在主服务器上为从服务器建立一个连接帐户,该帐户必须授予REPLICATION SLAVE权限。因为从mysql版本3.2以后就可以通过REPLICATION对其进行双机热备的功能操作。

  1. GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* to 'back'@'%' identified by 'back';

刷新权限

  1. flush privileges;

查看是否成功

  1. show grants for 'back'@'%';

20201209094600281.png

从服务器

创建配置文件

  1. [mysqld]
  2. server-id=2
  3. log-bin=mysql-bin
  4. replicate-do-db=test
  5. replicate-ignore-db=mysql,information_schema,performance_schema

20200720170715305.png

运行容器

  1. docker run --name mysql-slave --privileged=true -v /home/docker-volume/mysql-slave/data:/var/lib/mysql -v /home/docker-volume/mysql-slave/conf:/etc/mysql/conf.d -p 9092:3306 -e MYSQL_ROOT_PASSWORD=123456 -d daocloud.io/library/mysql:5.7.6

20200720170848702.png

这时候 master 和 slave都已经正常启动,现在就是同步

注:这里最好进入容器进行远程连接master数据库,验证是否能够连通,避免网络问题

进入容器命令

  1. docker exec -it mysql-slave /bin/bash

在容器中尝试远程连接命令

  1. mysql -h 172.17.0.3 -P 3306 -u back -p

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70 4

设置主从同步

先停止主从同步,不然没法进行修改

  1. stop slave;

修改slave status ,一定要先停止

  1. change master to master_host='172.17.0.3',master_port=3306,master_user='back ',master_password='back',master_log_file='mysql-bin.000006',master_log_pos=728;

启动slave

  1. start slave;
  2. show slave status;

20200720174442275.png

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dhbmd4dWVsZWkwMzY_size_16_color_FFFFFF_t_70 5 如果显示

Slave_IO_State : Connecting to master

Slave_IO_Running: NO

Slave_IO_SQL_Runing : NO

一般来说都是失败的

一般来说:

  • 网络不通
  • 密码不对
  • pos不对
  • 授权问题

如果所有参数显示正常,但是同步数据同步不了

重置以下slave 配置

  1. stop slave;
  2. reset slave;
  3. change master to master_host='172.17.0.3',master_port=3306,master_user='back',master_password='back',master_log_file=
  4. 'mysql-bin.000007',master_log_pos=2164;
  5. start slave;
  6. show slave status;

测试效果

主机运行

  1. INSERT INTO `t_user`
  2. VALUES
  3. (5,"shuen" );

查看从机已经获取了数据

2020072017502178.png

搞定,一般来说 按照步骤都是没有问题的,最可能出问题的是在进行start slave; 一般网络问题偏多,多注意以下防火墙等。遇到问题不要慌,先确定问题点,再进行处理。

思考

Mysql主从延时一直都是个问题,网上很多资料都有说过使用Mysql的半同步状态可以很好的解决主同步延时问题。

理想的情况下:

  • 数据库硬件性能好
  • 数据库、表结构设计合理
  • SQL语句优化得好。

在这样的情况下应该不会有什么延时问题。但事实上就我所在的公司里数据库的设计、表的设计、SQL语句等都是一个问题。正因为这些问题导致了再牛B的半同步复制都无法解决到我的主从数据延时问题。

解决方案 : 基于GTID 同步复制 + 插件(Semi-sync) 实现半同步复制

基于GTID 复制

GTID介绍

从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式。通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID。这种方式强化了数据库的主备一致性,故障恢复以及容错能力。

GTID (Global Transaction ID)是全局事务ID,当在主库上提交事务或者被从库应用时,可以定位和追踪每一个事务,对DBA来说意义就很大了,我们可以适当的解放出来,不用手工去可以找偏移量的值了,而是通过CHANGE MASTER TO MASTER_HOST=’xxx’, MASTER_AUTO_POSITION=1的即可方便的搭建从库,在故障修复中也可以采用MASTER_AUTO_POSITION=‘X’的方式。

主服务器配置

  1. [mysqld]
  2. server-id=110
  3. #开启binlog
  4. log_bin=master-bin
  5. #binlog 模式 有三种
  6. binlog_format=row
  7. # 文件大小以及过期时间
  8. expire_logs_days = 7
  9. max_binlog_size = 500M
  10. #gtid 同步复制
  11. gtid_mode=on
  12. enforce-gtid-consistency
  13. log-slave-updates=ON
  14. #记录哪些库 忽略哪些库
  15. binlog-do-db = campus_20191011_online
  16. binlog-ignore-db=mysql
  17. innodb_flush_log_at_trx_commit=1
  18. log_error = /data/mysql/mysql-error.log
  19. slow_query_log = On
  20. long_query_time = 2
  21. slow_query_log_file = /data/mysql/mysql-slow.log
  22. log-queries-not-using-indexes
  23. sync_binlog=1
  24. #1表明不区分大小写 默认0 区分
  25. lower_case_table_names=1

从服务器

  1. [mysqld]
  2. server-id = 61
  3. #开启binlog
  4. log_bin=slave-bin
  5. binlog_format=row
  6. #gtid 同步复制
  7. gtid_mode=on
  8. enforce-gtid-consistency
  9. log-slave-updates=1
  10. #从服务器启动时候,跳过启动主从复制
  11. skip_slave_start=1
  12. master_info_repository=table
  13. relay_log_info_repository=table
  14. relay_log_recovery=1
  15. replicate-do-db=campus_20191011_online
  16. replicate-ignore-db=mysql,information_schema,performance_schema
  17. log_error = /data/mysql/mysql-error.log
  18. slow_query_log = On
  19. long_query_time = 2
  20. slow_query_log_file = /data/mysql/mysql-slow.log
  21. log-queries-not-using-indexes
  22. innodb_flush_log_at_trx_commit=2
  23. sync_binlog=0
  24. #1表明不区分大小写 默认0 区分
  25. lower_case_table_names=1
  26. #并行复制 5.7 正式启用
  27. slave-parallel-type=LOGICAL_CLOCK
  28. slave-parallel-workers=16
  29. slave_pending_jobs_size_max = 2147483648
  30. slave_preserve_commit_order=1

GTID 复制可以单独使用,因此本文就到这里了,后续更新semi_sync 半同步复制插件使用

查看GTID参数

show global variables like ‘%GTID%’;

查看binlog_format

show global variables like “binlog_format”

发表评论

表情:
评论列表 (有 0 条评论,117人围观)

还没有评论,来说两句吧...

相关阅读