mysql是现在项目开发中的常见数据库,为了提升mysql的性能,今天就试着搭建一个基于binlog进行主从复制的mysql数据库。
1、拉取mysql镜像
docker pull mysql
2、启动mysql镜像
docker run -p 3306:3306 --name mysql-master -v $PWD/master-logs:/logs -v $PWD/master-data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
docker run -p 3307:3306 --name mysql-slave -v $PWD/slave-logs:/logs -v $PWD/slave-data:/mysql_data -e MYSQL_ROOT_PASSWORD=123456 -d mysql
查看镜像:
3、配置mysql用户
#进入镜像
docker exec -it mysql-master bash
#输入密码,登录mysql
mysql -u root -p
#执行sql
#添加远程登录用户
CREATE USER 'master'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'master'@'%';
FLUSH PRIVILEGES;
添加用户及指定验证规则,主要是mysql8的默认验证规则需要修改,不然使用navicat远程登录失败。可通过SQl命令进行查看。
select host,user,plugin from mysql.user;
mysql-slave的容器也参照master的进行设置
#添加远程登录用户
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
使用navicat分别登录,验证无误。
4、配置mysql主从
4.1 配置master
通过docker exec -it mysql-master bash命令进入
cd /etc/mysql切换到/etc/mysql目录下,然后vi my.cnf对my.cnf进行编辑。
此时会报出bash: vi: command not found,需要我们在docker容器内部自行安装vim。使用apt-get install vim命令安装vim,出现E: Unable to locate package vim,使用apt-get update更新源。
由于下载速度很慢,所以我切换了一下源到阿里云。
mv /etc/apt/sources.list /etc/apt/sources.list.bak
echo "deb http://mirrors.aliyun.com/debian buster main" >> /etc/apt/sources.list
echo "deb http://mirrors.aliyun.com/debian buster-updates main" >> /etc/apt/sources.list
然后在执行apt-get update,速度会有明显提升。然后再次执行apt-get install vim即可成功安装vim。
在my.cnf文件中添加如下内容
server-id=100
log-bin=mysql-bin
重启msater镜像,使配置生效。
在msater数据库创建同步用户并授予用户 slave REPLICATION SLAVE权限和REPLICATION CLIENT权限,用于在主从库之间同步数据。
CREATE USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;
至此,主数据库配置完成。
4.2 配置slave
和配置master一样,修改my.cnf文件(vim的安装参考master数据库),添加如下配置:
server-id=101
#开启二进制日志功能
log-bin=mysql-slave-bin
#relay_log配置中继日志
relay_log=mysql-relay-bin
配置完成后,重启slave容器。
4.3 主从配置
先查看msater容器的独立ip,并记录下来,一会配置slave要使用。通过执行如下命令:
docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master
进入到msater的msql中,获取file文件名称和position位置,并记录下来,然后保持主master数据不变(即不进行任何操作)。
show master status;
在Slave 中进入 mysql,执行如下语句
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos= 375, master_connect_retry=30;
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
接着启动从库,start slave;然后查看状态show slave status \G。如下即为正常。
验证:
通过在主库常见表或者插入输入,在从库能查到,表示主从同步搭建成功。
参考资料:https://blog.csdn.net/qq_26789969/article/details/82686625