近况
复习redis的时候有看到缓存一致性方面的知识,这部分很重要,我感觉我只是了解了一个大概,
回头看能不能水一波缓存同步的博客,今天尝试搭建了一下mysql主从复制,记录一下,以后忘记可以看看
docker-compose搭建Mysql主从复制步骤
基本配置文件及目录
mysql-master-slave/ ├── docker-compose.yaml ├── master │ ├── conf │ │ └── my.cnf │ ├── data │ ├── Dockerfile │ ├── logs │ └── wanyi.sql └── slave ├── conf │ └── my.cnf ├── data ├── Dockerfile ├── logs └── wanyi.sql #master中除my.cnf有略微差别外,其他都与slave中配置文件一致
wanyi.sql
create database wanyi; use wanyi; DROP TABLE IF EXISTS `wanyi`; CREATE TABLE `wanyi` ( `id` int(11) NOT NULL COMMENT 'id', `name` varchar(32) NOT NULL COMMENT '姓名', PRIMARY KEY (`id`) USING BTREE )ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='test for mysq-master-slave'; INSERT INTO `wanyi` VALUES (1,"万一"); INSERT INTO `wanyi` VALUES (2,"万二"); INSERT INTO `wanyi` VALUES (3,"万三");
Dockerfile
#设定初始镜像mysql版本 FROM mysql #设定工作目录,用于处理初始化mysql的sql文件 WORKDIR /docker-entrypoint-initdb.d #默认mysql无法输入中文,修改编码使其支持中文 ENV LANG=C.UTF-8 #加入需要初始化的sql文件 ADD ./wanyi.sql .
My.cnf
master中My.cnf[mysqld] ## server_id,一般设置为IP,注意要唯一 server_id=1 log_bin=mysql-bin ## 需要主从复制的数据库 binlog-do-db=wanyi ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql ## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M ## 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一) binlog_format=mixed ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 binlog_expire_logs_seconds=3600 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062
slave中My.cnf
[mysqld] ## 设置server_id,一般设置为IP,注意要唯一 server_id=2 ## 需要主从复制的数据库 replicate-do-db=wanyi ## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步) binlog-ignore-db=mysql ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用 log_bin = mysql-bin ## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存 binlog_cache_size=1M ## 主从复制的格式(mixed,statement,row,默认格式是statement) binlog_format=row ## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。 binlog_expire_logs_seconds=3600 ## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。 ## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致 slave_skip_errors=1062 ## relay_log配置中继日志 relay_log=replicas-mysql-relay-bin ## log_slave_updates表示slave将复制事件写进自己的二进制日志 log_slave_updates=1 ## 防止改变数据(除了特殊的线程) read_only=1
docker-compose.yaml
version: '3' services: mysql-master: build: ./master environment: - "MYSQL_ROOT_PASSWORD=root" ports: - "33065:3306" container_name: mysql-master volumes: - "./master/data/:/var/lib/mysql/" #mysql数据目录 - "./master/logs/:/var/log/mysql/" #mysql的日志目录 - "./master/conf/:/etc/mysql/conf.d/" #mysql的配置目录 command: [ '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci', '--lower_case_table_names=1' ] restart: always hostname: mysql-master links: - mysql-slave mysql-slave: build: ./slave environment: - "MYSQL_ROOT_PASSWORD=root" ports: - "33066:3306" container_name: mysql-slave restart: always hostname: mysql-slave volumes: - "./slave/data/:/var/lib/mysql/" #mysql数据目录 - "./slave/logs/:/var/log/mysql/" #mysql的日志目录 - "./slave/conf/:/etc/mysql/conf.d/" #mysql的配置目录
配置mysql权限
当我们启动两个mysql容器后,我们需要使用sqlyog或者Navicat连接这两个mysql,但是因为是mysql8版本
我们并不能直接使用工具连接上,所以我们需要更改这两个mysql的root用户权限。进入这两个mysql容器的mysql中,执行下面两句命令:
#用于更换MySQL root账户的密码和加密方式 ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY '123765'; #用于刷新权限 FLUSH PRIVILEGES;
在master容器的mysql中,查询出File和Position字段的值
在slave容器的mysql中,执行下面语句
CHANGE MASTER TO MASTER_HOST='47.98.138.53',MASTER_PORT=33065, MASTER_USER='root',MASTER_PASSWORD='root',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=2797; # MASTER_LOG_FILE的值就是master中File字段的值, # MASTER_LOG_POS的值就是master中Position字段的值,这是在确定slave从哪里开始复制 #重新启动slave,使配置生效 stop slave start slave
执行上面语句,相当于slave容器的mysql作为了master容器mysql的从机,
我们可以通过命令查看从机状态:show slave status
如果出现下面Slave_SQL_ Running和Slave_IO_Running字段的值都为YES,
Slave_IO_Status值为:Waiting for source to send event
,则表示部署成功,从机可以从主机中拷贝数据文章及资料