部署Docker搭建mysql一主两从
为什么要使用mysql主从集群
简单来说,如果对数据库的读和写都在同一个数据库服务器中操作,数据库的压力会变大,导致读写性能会下降。为了提升数据库性能,优化用户体验,可以通过做主从复制(读写分离)来减轻主数据库的负载。 而且如果主数据库宕机,可快速将业务系统切换到从数据库上,可避免数据丢失。
基于docker,手动搭建mysql主从集群
案例环境
操作系统 | IP地址 | 配置 | 主要软件 | 备注 |
---|---|---|---|---|
centos7.9 | 192.168.10.128 | 2C2G | docker20 |
#1、关闭防火墙
#2、修改selinux文件
#3、搭建时间同步
案例实施
拉去镜像
docker pull mysql:5.7.28
docker images
启动镜像,并设置master需要配置的参数,设置server-id和开启logbin
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:5.7.28 --server-id=1 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --log-bin=mysql-bin --sync_binlog=1
进入容器,创建主从同步账号
docker exec -ti mysql bash mysql -uroot -p123456 CREATE USER 'root'@'172.17.%.%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE ON *.* TO 'root'@'172.17.%.%'; FLUSH PRIVILEGES; #查看master的binlog信息 SHOW MASTER STATUS;
查看一下容器的ip
docker inspect 容器ID | grep IPAddress”
启动slave容器,实现主从同步
docker run --name slave -e MYSQL_ROOT_PASSWORD="123456" -d mysql:5.7.28 --server-id=2 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
进入容器,连接master,然后开启同步
docker exec -ti slave bash mysql -uroot -p123456
这里master_host就是刚刚看到的master的ip,master_user就是我们创建用于同步的账号,master_log_file和master_log_pos就是通过show master status获得到的
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='kgc_root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=773; #MASTER_LOG_FILE和MASTER_LOG_POS以实际为准 START SLAVE; #查看slave同步状态 SHOW SLAVE STATUS\G; set global read_only=1; #只读模式
启动slave2容器,实现主从同步
docker run --name slave2 -e MYSQL_ROOT_PASSWORD="123456" -d mysql:5.7.28 --server-id=2 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
启动容器
docker exec -it slave2 bash
#####进入容器
mysql -uroot -p123456
CHANGE MASTER TO MASTER_HOST='172.17.0.2',MASTER_USER='kgc_root',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=773; #MASTER_LOG_FILE和MASTER_LOG_POS以实际为准
测试同步
1.进入master,创建一个测试数据库
docker exec -ti mysql bash mysql -uroot -p123456 CREATE DATABASE test;
2.进入slave,slave2查看对应的test库是否同步过来
docker exec -ti slave bash mysql -uroot -p123456 SHOW DATABASES;