ToB企服应用市场:ToB评测及商务社交产业平台

标题: Docker搭建MySQL主从复制 [打印本页]

作者: 拉不拉稀肚拉稀    时间: 2024-6-11 11:48
标题: Docker搭建MySQL主从复制
Docker部署MySQL主从复制


  
一、构建MySQL镜像


  1. # 创建mysql工作目录
  2. [root@docker-01 ~]# mkdir mysql
  3. [root@docker-01 ~]# cd mysql
  4. # 创建mysql文件Dockerfile
  5. [root@docker-01 mysql]# cat Dockerfile
  6. # 指定基础镜像
  7. FROM centos:7.6.1810
  8. # 安装MySQL依赖软件,创建MySQL用户
  9. RUN yum clean all && yum makecache && yum -y remove mariadb && yum -y install vim numactl wget net-tools lrzsz libaio gcc gcc-c++ net-tools && useradd -M -s /sbin/nologin mysql
  10. # 开始安装MySQL
  11. ADD mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz ./
  12. RUN mv mysql-5.7.28-linux-glibc2.12-x86_64 /usr/local/mysql && mkdir /usr/local/mysql/data && chown -R mysql:mysql /usr/local/mysql/data/ && cd /usr/local/mysql/bin/ && ./mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize &> /var/log/mysql_password.log
  13. # 上传配置文件
  14. COPY my.cnf /etc/my.cnf
  15. RUN cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld && chmod +x /etc/rc.d/init.d/mysqld
  16. # 上传系统服务文件
  17. COPY mysql.service /lib/systemd/system/
  18. ENV PATH /usr/local/mysql/bin:$PATH
  19. EXPOSE 3306
  20. # 创建mysql配置文件
  21. [root@docker-01 mysql]# cat my.cnf
  22. [client]
  23. socket=/usr/local/mysql/data/mysql.sock
  24. [mysqld]
  25. socket=/usr/local/mysql/data/mysql.sock
  26. # 绑定监听地址0.0.0.0
  27. bind-address = 0.0.0.0
  28. # 禁止域名解析,减少mysql对外部连接客户端DNS解析的时间
  29. skip-name-resolve
  30. # 设置端口为3306
  31. port=3306
  32. # 设置mysql的安装目录
  33. basedir=/usr/local/mysql
  34. # 设置mysql数据库的数据的存放目录
  35. datadir=/usr/local/mysql/data
  36. # 允许最大连接数
  37. max_connections=2048
  38. # 服务端使用的字符集默认为utf8
  39. character-set-server=utf8
  40. # 创建新表时将使用默认存储引擎
  41. default-storage-engine=INNODB
  42. # sql语句不区分大小写
  43. lower_case_table_names=1
  44. # 设置一次消息传输的最大值
  45. max_allowed_packet=16M
  46. # 创建mysql服务控制文件
  47. [root@docker-01 mysql]# cat mysql.service
  48. [Unit]
  49. Description=mysqld
  50. After=network.target
  51. [Service]
  52. Type=forking
  53. ExecStart=/etc/rc.d/init.d/mysqld start
  54. ExecReload=/etc/rc.d/init.d/mysqld restart
  55. ExecStop=/etc/rc.d/init.d/mysqld stop
  56. PrivateTmp=true
  57. [Install]
  58. WantedBy=multi-user.target
  59. [root@docker-01 mysql]# ls
  60. Dockerfile  my.cnf  mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz  mysql.service
  61. # 构建MySQl镜像
  62. [root@docker-01 mysql]# docker build -t mysql:5.7.28 .
复制代码
二、构建systemctl管理MySQL服务镜像


  1. [root@docker-01 ~]# mkdir systemctl
  2. [root@docker-01 ~]# cd systemctl/
  3. [root@docker-01 systemctl]# cat Dockerfile
  4. # 基于刚刚的mysql镜像构建system镜像,作用是更好管理容器中的mysql服务
  5. FROM mysql:5.7.28
  6. ENV container docker
  7. RUN (cd /lib/systemd/system/sysinit.target.wants/; for i in *; do [ $i == \
  8. systemd-tmpfiles-setup.service ] || rm -f $i; done); \
  9. rm -f /lib/systemd/system/multi-user.target.wants/*; \
  10. rm -f /etc/systemd/system/*.wants/*; \
  11. rm -f /lib/systemd/system/local-fs.target.wants/*; \
  12. rm -f /lib/systemd/system/sockets.target.wants/*udev*; \
  13. rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \
  14. rm -f /lib/systemd/system/basic.target.wants/*; \
  15. rm -f /lib/systemd/system/anaconda.target.wants/*;
  16. # 在容器创建一个挂载点,这个挂载点将会跟宿主机或者别的容器交互
  17. VOLUME ["/sys/fs/cgroup"]
  18. CMD ["/usr/sbin/init"]
  19. # 构建systemctl镜像master
  20. [root@docker-01 systemctl]# docker build -t system:master .
  21. # 构建systemctl镜像slave
  22. [root@docker-01 systemctl]# docker build -t system:slave .
复制代码
三、运行容器


  1. [root@docker-01 ~]# docker images
  2. REPOSITORY   TAG        IMAGE ID       CREATED        SIZE
  3. system       master     20e2772fd585   47 hours ago   6.72GB
  4. system       slave      20e2772fd585   47 hours ago   6.72GB
  5. mysql        5.7.28     9d559d0e3cf8   47 hours ago   6.72GB
  6. centos       7.6.1810   f1cb7c7d58b7   5 years ago    202MB
  7. # 创建master容器
  8. [root@docker-01 ~]# docker run -d --hostname master --name master -p 13306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:master
  9. # 创建slave容器
  10. [root@docker-01 ~]# docker run -d --hostname slave --name slave -p 23306:3306 --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro system:slave
复制代码
四、登录容器

4.1、设置master

  1. # 登录master容器
  2. [root@docker-01 ~]# docker exec -it master bash
  3. # 查看临时mysql密码
  4. [root@master /]# tail -1 /var/log/mysql_password.log
  5. 2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
  6. # 设置主服务器ID
  7. [root@master /]# cat >> /etc/my.cnf << EOF
  8. server-id = 1
  9. log-bin = master-bin               #开启二进制日志
  10. binlog_format = mixed
  11. EOF
  12. [root@master /]# systemctl start mysqld
  13. [root@master /]# netstat -anpt
  14. Active Internet connections (servers and established)
  15. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
  16. tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      316/mysqld
  17. # 登录数据库更改密码
  18. [root@master /]# mysql -u root -p
  19. Enter password:   ## 输入临时密码
  20. mysql> set password=password('wzh.2005');
复制代码
4.2、设置slave

  1. # 登录slave容器
  2. [root@docker-01 ~]# docker exec -it slave bash
  3. # 查看临时mysql密码
  4. [root@slave /]# tail -1 /var/log/mysql_password.log
  5. 2024-05-25T04:21:20.466885Z 1 [Note] A temporary password is generated for root@localhost: MD)M;qyC0r_0
  6. # 设置从服务器ID
  7. [root@slave /]# cat >> /etc/my.cnf << EOF
  8. server-id = 2                      #需保证主库和从库的server_id不
  9. relay-log = relay-log-bin          #开启中继日志
  10. relay-log-index = slave-relay-bin.index   #中继日志开启索引
  11. read_only=1
  12. EOF
  13. [root@slave /]# systemctl start mysqld
  14. [root@slave /]# netstat -anpt
  15. Active Internet connections (servers and established)
  16. Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name   
  17. tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      326/mysqld
  18. # 登录数据库更改密码
  19. [root@slave /]# mysql -u root -p
  20. Enter password:                 ## 输入临时密码
  21. mysql> set password=password('wzh.2005');
复制代码
五、授权从库

  1. # 给从服务器授权,允许使用myslave的身份复制master中的所有数据库的所有表数据,并指定密码为“wzh.2005”
  2. [root@master /]# mysql -u root -pwzh.2005
  3. mysql> grant replication slave on *.* to 'myslave'@'192.168.93.%' identified by 'wzh.2005';
  4. # 两个容器之间使用172.17.0.0网段通信
  5. mysql> grant replication slave on *.* to 'myslave'@'172.17.0.%' identified by 'wzh.2005';
复制代码
六、更改UUID


  1. # 两个uuid保持不一样即可,修改过后别忘记重启mysql服务
  2. [root@master /]# cat /usr/local/mysql/data/auto.cnf
  3. [auto]
  4. server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110004
  5. [root@slave /]# cat /usr/local/mysql/data/auto.cnf
  6. [auto]
  7. server-uuid=3ca0adc5-1a4e-11ef-9c25-0242ac110005
复制代码
七、毗连主数据库

  1. [root@slave /]# mysql -u root -pwzh.2005
  2. mysql> change master to master_host='192.168.93.165',master_port=13306,master_user='myslave',master_password='wzh.2005',master_log_file='master-bin.000001',master_log_pos=990;
  3. mysql> start slave;
  4.              Slave_IO_Running: Yes
  5.             Slave_SQL_Running: Yes
复制代码
八、验证

  1. # 在主库创建kgc库
  2. [root@master /]# mysql -u root -pwzh.2005
  3. mysql> create database kgc;
  4. # 从库查看是否同步主库kgc数据库
  5. mysql> show databases;
  6. +--------------------+
  7. | Database           |
  8. +--------------------+
  9. | information_schema |
  10. | kgc                |
  11. | mysql              |
  12. | performance_schema |
  13. | sys                |
  14. +--------------------+
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4