centos7用docker部署Mysql主从复制
安装Docker和Docker Compose:
安装预置:
sudo yum update
yum install python3-pip
sudo yum group install "Development Tools"
sudo yum install epel-release
sudo yum install openssl-devel libffi-devel python3-devel
安装docker:
yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
ls /var/lib/docker
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
systemctl start docker
安装docker-compose :
sudo rm /usr/local/bin/docker-compose (删除旧的)
sudo curl -L "https://developer.aliyun.com/compose/docker-compose/$(uname -s)/$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker compose version (验证版本,旧命令不能用了:docker-compose version)
创建一个目录用于存储MySQL数据和配置文件:mkdir mysql_replication
cd mysql_replication
mkdir data
mkdir data/master
mkdir data/slave
在mysql_replication目录下编辑docker-compose.yml文件:
对于使用Docker部署的MySQL容器,通过command选项提供了启动参数。其中的--log-bin参数用于开启二进制日志(binary log),--binlog-do-db=mydb则指定要记录二进制日志的数据库为mydb,其他参数根据需要进行配置。
version: '3' services: master: image: mysql:5.7 command: --server-id=1 --log-bin --binlog-do-db=mydb --innodb_flush_log_at_trx_commit=1 restart: always environment: MYSQL_ROOT_PASSWORD: rootpassword volumes: - ./data/master:/var/lib/mysql slave: image: mysql:5.7 command: --server-id=2 --log-bin --replicate-do-db=mydb --innodb_flush_log_at_trx_commit=1 restart: always depends_on: - master environment: MYSQL_ROOT_PASSWORD: rootpassword MYSQL_MASTER_HOST: master MYSQL_MASTER_PORT: 3306 MYSQL_MASTER_USER: root MYSQL_MASTER_PASSWORD: rootpassword volumes: - ./data/slave:/var/lib/mysql
docker compose up -d (docker-compose 这个格式不能用了)
配置主从复制:
进入Master容器:sudo docker exec -it mysql_replication_master_1 bash
登录MySQL服务器并创建用于复制的用户:
bash
mysql -uroot -p
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
EXIT;
获取Master容器的IP地址:ifconfig(记下eth0网卡的IP地址)
[root@localhost mysql_replication]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' 9c9a9ae4a343
172.19.0.2
进入Slave容器:sudo docker exec -it mysql_replication_slave_1 bash
登录MySQL服务器并配置复制:
bash
mysql -uroot -p
CHANGE MASTER TO MASTER_HOST='master', MASTER_PORT=3306, MASTER_USER='replication_user', MASTER_PASSWORD='password';
START SLAVE;
EXIT;
验证:
登录到 MySQL 从服务器(Slave)的容器或主机上,并执行以下操作:
使用 MySQL 客户端登录到从服务器的 MySQL 服务器。
运行 SHOW SLAVE STATUS\G; 命令,查看从服务器的复制状态。
在 SHOW SLAVE STATUS 的输出中,可以关注以下几个重要字段来验证复制是否正常:
Slave_IO_Running: 若值为 "Yes",表示从服务器的 I/O 线程正在运行。
Slave_SQL_Running: 若值为 "Yes",表示从服务器的 SQL 线程正在运行。
Last_Error: 如果发生错误,将在此字段中显示相关信息。
Seconds_Behind_Master: 显示从服务器落后于主服务器的秒数。若该值为 0 或接近 0,则表示复制是实时的。
Mysql主从原理:
配置mysql主节点的my.cnf文件,开启二进制日志(binary log);
对于Docker 环境(MySQL 8.0)可通过command选项提供了启动参数。
其中的--log-bin参数用于开启二进制日志(binary log),--binlog-do-db=mydb则指定要记录二进制日志的数据库为mydb
从服务器上的my.cnf文件中配置连接主服务器的参数,包括主服务器的IP地址、端口、用户名和密码等
从服务器连接到主服务器,并发送一个请求,会包含从服务器读取主服务器二进制日志的位置)。如:./data/slave:/var/lib/mysql
主服务器收到从服务器的复制请求,它开始将数据更改以事件(event)的形式写入二进制日志。这些事件包括INSERT、UPDATE、DELETE等操作。
从服务器不断地读取主服务器的二进制日志文件,并解析其中的事件。从服务器将这些事件应用到自己的数据库上,使得从服务器的数据与主服务器保持同步。
从服务器会将每次成功应用的事件在自己的复制位置上进行记录,以便下次连接主服务器时,可以从上次断开的位置继续复制。
异步复制:主从复制一般是异步进行的,即主服务器不会等待从服务器确认已经成功应用了复制数据,而是继续处理其他的数据库操作。这种机制保证了主服务器的高可用性和性能。
通过主从复制,可以实现数据备份、读写分离、负载均衡等目的。主服务器负责写入数据,而从服务器可以用于查询和读取操作,提高数据库性能和可用性。