docker中Mylsq的主从搭建(超详细)一主多从
1. 安装docker
这里可以参考菜鸟教程的CentOS安装docker , https://www.runoob.com/docker/centos-docker-install.html
2. Docker中使用挂载模式安装mysql
使用docker pull mysql:5.7.31,从docker仓库中拉取mysql的5.7.31版本
使用docker images 查看本地的docker镜像,这个IMAGE ID很重要,虽然docker可以用应用的名称来启动,但是我建议还是使用IMAGE ID,稳一手。
然后我们进入home目录(home目录是我自己的习惯,你们可以选择其他文件夹),创建以下的文件结构
home
| ├ master
| | ├ my.cnf mysql外挂配置文件
| | ├ /mysql mysql数据以及日志文件存储地址
| | ├ /conf.d mysql多配置文件存储地址(本文中未使用)
| ├ slave1
| | ├ my.cnf mysql外挂配置文件
| | ├ /mysql mysql数据以及日志文件存储地址
| | ├ /conf.d mysql多配置文件存储地址(本文中未使用)
| ├ slave2
| | ├ my.cnf mysql外挂配置文件
| | ├ /mysql mysql数据以及日志文件存储地址
| | ├ /conf.d mysql多配置文件存储地址(本文中未使用)
在/home/master/my.cnf,/home/slave1/my.cnf,/home/slave2/my.cnf写入基础的mysql配置,这个步骤主要是要实现配置文件的挂载,稍后会写入主从的配置,写完my.cnf文件之后把文件权限设置为chmod 755 my.cnf,chmod 777 mysql/,chmod 777 conf.d/,否则docker无法读取文件和文件夹。
[mysqld]user=mysql
datadir = /var/lib/mysql/data
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
运行命令
docker run --restart=always --privileged=true -d -v /home/mysql/master/mysql/:/var/lib/mysql -v /home/mysql/master/conf.d:/etc/mysql/conf.d -v /home/mysql/master/my.cnf:/etc/mysql/my.cnf -p 0.0.0.0:3307:3306/tcp --name mysql-master-dev -e MYSQL_ROOT_PASSWORD=123456 d05c76dbbfcf(这里替换成你自己的镜像源ID)
参数解析:
--restart 设置容器自动重启。
-- privileged 设置容器内的bash用户权限为root
-v 挂载环境,后面携带的参数和你要挂载的mysql类型一致,例如Master使用master文件夹下的文件和文件夹,Slave用对应slave下的文件和文件夹。
-p 端口号,端口我们修改一下,Master使用3307,Slave1使用3317,Slave2使用3327。
--name 容器名,docker容器的名字是唯一的,不可重复。
-e 容器启动参数,这里我们设置mysql的root用户密码
启动完三个mysql之后,可以看一下我们在运行的容器 docker ps。可以看到我们的主从mysql都已经启动完毕了。
3. 配置mysql的主从
创建测试用的demo数据库,三个mysql中都创建,如果配置已有数据的数据库,则先停止mysql的Master写入功能,将数据库备份至从库。
配置Master:编辑 /home/mysql/master/my.cnf文件
[mysqld]user = mysql
datadir = /var/lib/mysql/data
character-set-server = utf8
default_authentication_plugin = mysql_native_password
#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)
#服务器ID,要求唯一,主从的server_id不能相同
server_id = 1
#log_bin文件地址(docker容器中地址)
log-bin = /var/lib/mysql/data/logs/mysql-bin
#需要同步的数据库,可以有多个
binlog-do-db = demo
#binlog-do-db=demo2
#开启Slave记录日志
log-slave-updates
#执行事物多少次之后,将执行sql记录到磁盘中
sync_binlog = 1
#自增偏移量:自增长字段从那个数开始,他的取值范围是
auto_increment_offset = 1
#自增步长:自增长字段每次递增的量
auto_increment_increment = 1
#日志清理时间(天)
expire_logs_days = 7
#信任存储函数创建者
log_bin_trust_function_creators = 1
#bin_log日志记录模式
#bin_log复制类型
# Statement(默认格式):每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
# Row:日志中会记录成每一行数据被修改的形式,然后在 slave 端再对相同的数据进行修改。
# Mixed:MySQL 会根据执行的每一条具体的 SQL 语句来区分对待记录的日志形式,也就是在 statement 和 row 之间选择一种。
binlog_format=mixed
#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
使用docker ps命令,查看Master主机的CONTAINER ID。
重启Master主机:docker restart cbff024b99f9(你自己的container id) -t 1
配置Slave:编辑/home/mysql/slave1/my.cnf文件
使用docker ps命令,查看Slave主机的CONTAINER ID。
重启Slave1主机:docker restart cbff024b99f9(你自己的container id) -t 1
[mysqld]user=mysql
datadir = /var/lib/mysql/data
character-set-server=utf8
default_authentication_plugin=mysql_native_password
#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)
#与Master相同配置不再赘述
server_id = 2
log-bin = mysql-bin
log-slave-updates
sync_binlog = 0
innodb_flush_log_at_trx_commit = 0
#从机复制那个库
replicate-do-db = demo
#设置在多少秒没收到主库传来的Binary Logs events之后,从库认为网络超时,Slave IO线程会重新连接主库。
slave-net-timeout = 60
log_bin_trust_function_creators = 1
#新增配置(记得把注解删掉,文本的编码不一致时,mysql无法识别配置文件)
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
同理,修改Slave2的配置。
使用docker inspect cbff024b99f9(你自己的container id),
查看Master和Slave在docker内的IP地址:
可以看到Master的IPAddress为172.17.0.2
同理可得Slave1的IPAddress为172.17.0.3,Slave2的IPAddress为172.17.0.4。
创建Slave的账号,登录Master机器,
grant replication slave on *.* to "slave1(Slave1用户名)"@"172.17.0.3(Slave1的IP地址)" identified by "123456(Slave1密码)";
grant replication slave on *.* to "slave2(Slave2用户名)"@"172.17.0.4(Slave2的IP地址)" identified by "123456(Slave2密码)";
flush privileges;
然后查看Master的状态,show master status。
进入Slave1,执行
change master to master_host="172.17.0.2",master_user="slave1",master_password="123456",master_log_file="mysql-bin.000001",master_log_pos=3379;
master_log_file为刚刚查看主机状态的File值。
master_log_pos为刚刚查看主机状态的Position值。
Slave2同理
4. 测试主从
进入demo数据库,创建demo表,
CREATE TABLE `demo` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
insert into demo(name) values ("张三"),("李四")
然后查看slave1和slave2的demo表中数据,如果与mater中数据一致,则docker中主从搭建成功。
以上是 docker中Mylsq的主从搭建(超详细)一主多从 的全部内容, 来源链接: utcz.com/z/534980.html