本文记录下通过MySQL Replication在Docker环境下,通过多个容器 实现数据库主从配置。
MySQL Replication就不多解释了,简单说就是MySQL非常出色的一个功能,该功能将一个MySQL实例中的数据复制到另一个MySQL实例中。整个过程是异步进行的,但由于其高效的性能设计,复制的延时非常小。MySQL复制功能在实际的应用场景中被广泛的应用于保证数据系统数据的安全性和可扩展设计中。想了解更多可从网上找更多的资料。
首先当然是准备好一台安装好docker的linux环境,然后就直接开始:
下文中出现的ip:112.74.41.236 都是我服务器的ip地址,可替换成自己的本机ip。
#配置容器环境
#创建并启动主库 容器
docker run --name master -e MYSQL_ROOT_PASSWORD=123456 -p 9001:3306 -d mysql
#创建并启动从库 容器
docker run --name slave -e MYSQL_ROOT_PASSWORD=123456 -p 9002:3306 -d mysql
#然后docker ps查看启动的容器
#主服务器 数据库配置
#首先进入主库容器内部
#docker exec -it master bash
#然后配置主库docker 容器内mysql配置文件my.cnf,在[mysqld]下修改即可,修改后重启数据库容器,使配置生效:
#vi /etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=1 //[必须]服务器唯一ID,默认是1
#登录主库mysql数据库
#mysql -uroot -p123456
#在主库上创建同步用户并授权
CREATE USER 'replicate'@'112.74.41.236' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'replicate'@'112.74.41.236';
FLUSH PRIVILEGES;
#最后增加远程访问用户 并赋予所有权限,远程访问测试用
CREATE USER yang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'yang'@'%';
#修复远程登录报报 caching_sha2_password异常
ALTER USER 'yang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'yang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
#查询master的状态,此处File,Position数据在配置从库时用到
show master status;
#配置从数据库
#首先进入从库容器内部
#docker exec -it slave bash
#然后配置从库docker 容器内mysql配置文件my.cnf,在[mysqld]下修改即可,修改后重启数据库容器,使配置生效:
#vi /etc/mysql/my.cnf
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=2 //[必须]服务器唯一ID,默认是1,从库设置为2
#登录从库mysql数据库
#mysql -uroot -p123456
配置从服务器Slave:(后面两个数据从主库查询得出)
change master to master_host='112.74.41.236',master_port=9001,master_user='replicate',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=1593;
start slave;
查询slave的状态,Slave_IO_Running及Slave_SQL_Running进程必须正常运行,即YES状态,否则都是错误的状态
show slave status\G
#最后同样增加远程访问用户 并赋予所有权限,远程访问测试用
CREATE USER yang IDENTIFIED BY '123456';
GRANT ALL ON *.* TO 'yang'@'%';
#修复远程登录报报 caching_sha2_password异常
ALTER USER 'yang'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;
ALTER USER 'yang'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
FLUSH PRIVILEGES;
至此同步相关配置 已完成,接下来可以测试:
#在主库insert一条记录,从库基本实时从主库同步过来了数据,实现了主从数据同步配置。
#测试脚本
#创建数据库
drop database if exists my_test;
create database my_test;
use my_test;
#创建测试表
CREATE TABLE `user_info` (
`user_num` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`user_id` varchar(36) NOT NULL COMMENT '用户ID',
`user_name` varchar(50) DEFAULT NULL COMMENT '用户名字',
`mobile` varchar(50) DEFAULT NULL COMMENT '手机号码',
`password` varchar(255) DEFAULT NULL COMMENT '密码',
`user_status` int(11) DEFAULT NULL COMMENT '状态 0审核中 1有效 2无效',
`create_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`user_num`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户信息表';
#测试插入
insert into user_info values (null, UUID(), 'yang', '15914338482', '123456', 1, now(), now());