由于下一步Nacos需要数据库环境,所以先把数据库搭建完成,顺便先做个redis单机
以下环境基于上一篇说过的环境,不在叙述,以后默认window10开发,组件环境基于docker容器,不在详说。
开始。
下载最新VMware Workstation 15 Player 安装过程不详述,。
在VM中安装Centos7,过程不详述,有问题请百度。
安装docker:
yum install -y docker
补充命令:
启动:systemctl start docker开机启动:systemctl enable docker重启:systemctl restart docker
Docker 镜像加速:
编辑 vi /etc/docker/daemon.json

搭建Mysql 主从:
拉取Mysql镜像:
docker pull mysql:8.0
启动镜像,一主(mysqlmaster)二从(mysqlslave1、mysqlslave2)
docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0docker run -p 3001:3306 --name mysqlslave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0docker run -p 3002:3306 --name mysqlslave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
执行过程
[root@localhost was]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE[root@localhost was]# docker pull mysql:8.0Trying to pull repository docker.io/library/mysql ...8.0: Pulling from docker.io/library/mysql123275d6e508: Pull complete27cddf5c7140: Pull completec17d442e14c9: Pull complete5fc78b1e06f8: Pull completecd38802f42bb: Pull completeb370e336f220: Pull completef519d6d4d2f6: Pull completec52c0310cd34: Pull completecd74fd7796ae: Pull complete3f08e322a29c: Pull complete2caa0eda62a7: Pull completeeac28354a6fe: Pull completeDigest: sha256:7901b65a6be478f7f15348dec0440c491a364af202112c61cb3925d7fb67d8f4Status: Downloaded newer image for docker.io/mysql:8.0[root@localhost was]# docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.087b18ef6fdd08f04e4707e91e68b1e2ea555968b8273a3472700f119bf65157d[root@localhost was]# docker run -p 3001:3306 --name mysqlslave1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.08894535bf6da2c14b1df74a0a7f66a6e58d748bfdfe489780366e6bec580335e[root@localhost was]# docker run -p 3002:3306 --name mysqlslave2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0b19c6b9d0845b06287b78627e1b45a2a6524c6382a2ab00608cbd8630bf3e64d[root@localhost was]# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEdocker.io/mysql 8.0 0f39f4b4d96c 28 hours ago 547 MB[root@localhost was]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb19c6b9d0845 mysql:8.0 "docker-entrypoint..." 23 seconds ago Up 18 seconds 33060/tcp, 0.0.0.0:3002->3306/tcp mysqlslave28894535bf6da mysql:8.0 "docker-entrypoint..." 41 seconds ago Up 36 seconds 33060/tcp, 0.0.0.0:3001->3306/tcp mysqlslave187b18ef6fdd0 mysql:8.0 "docker-entrypoint..." 52 seconds ago Up 51 seconds 33060/tcp, 0.0.0.0:3000->3306/tcp mysqlmaster[root@localhost was]#
docker images:查看当前镜像
docker pull mysql:8.0 从中央仓库(上面修改镜像加速的地址)拉取名称为mysql:8.0的镜像
docker run -p 3000:3306 --name mysqlmaster -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
docker run 启动镜像
-p 3000:3306 使用宿主机3000端口映射容器3306端口
--name mysqlmaster 容器名称为 mysqlmaster
-e MYSQL_ROOT_PASSWORD=123456 设置mysql密码为 123456
-d mysql:8.0 容器使用镜像名称为mysql:8.0的镜像启动
docker ps -a 查看当前容器
CONTAINER ID 容器ID
IMAGE 容器使用镜像
COMMAND 最后执行命令
CREATED 创建时间
STATUS 容器状态
PORTS 容器端口
NAMES 容器名称
开始主从配置
搭建过程参考: https://www.cnblogs.com/songwenjie/p/9371422.html
[root@localhost was]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb19c6b9d0845 mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3002->3306/tcp mysqlslave28894535bf6da mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3001->3306/tcp mysqlslave187b18ef6fdd0 mysql:8.0 "docker-entrypoint..." About an hour ago Up About an hour 33060/tcp, 0.0.0.0:3000->3306/tcp mysqlmaster[root@localhost was]# docker exec -it 87b18ef6fdd0 /bin/bashroot@87b18ef6fdd0:/# cd /etc/mysqlroot@87b18ef6fdd0:/etc/mysql# vi my.cnfbash: vi: command not foundroot@87b18ef6fdd0:/etc/mysql# apt-get install vimReading package lists... DoneBuilding dependency treeReading state information... DoneE: Unable to locate package vimroot@87b18ef6fdd0:/etc/mysql# apt-get update·········
docker exec -it 87b18ef6fdd0 /bin/bash 进入容器ID为87b18ef6fdd0 (Master)的容器
vi my.cnf 编辑MySql配置文件
因为镜像没有vim,所以需要先安装vim,安装vim如果报错,需要先更新apt-get update
vim my.cn
然后在[mysqld]节点下添加
[mysqld]## 同一局域网内注意要唯一server-id=100## 开启二进制日志功能,可以随便取(关键)log-bin=mysql-bin
保存退出容器,然后重启容器
docker restart mysqlmaster
连接mysql数据库,并创建主从同步账户
root@87b18ef6fdd0:/# mysql -uroot -p123456mysql: [Warning] Using a password on the command line interface can be insecure.Welcome to the MySQL monitor......mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';Query OK, 0 rows affected (0.10 sec)mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';Query OK, 0 rows affected (0.01 sec)
配置从库以mysqlslave1为例:
进入容器,编辑my.cnf
[mysqld]## 设置server_id,注意要唯一server-id=101## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用log-bin=mysql-slave-bin## relay_log配置中继日志relay_log=edu-mysql-slave1-relay-bin
完成后重启容器
mysqlslave2同样操作,注意mysqlslave2的server-id=102
Master(主)和Slave(从)配置
在Master容器中进入mysql,执行show master status;
mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 711 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
记住 File 和Position后面要用
进入mysqlslave1 容器,进入mysql执行:
change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 711, master_connect_retry=30;
命令说明:
master_host :Master的地址,指的是容器的独立ip,可以通过docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称|容器id
查询容器的ip
[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlmaster172.17.0.2[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlslave1172.17.0.3[root@localhost was]# docker inspect --format='{{.NetworkSettings.IPAddress}}' mysqlslave2172.17.0.4
master_port:Master的端口号,指的是容器的端口号
master_user:用于数据同步的用户
master_password:用于同步的用户的密码
master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
在Slave 中的mysql终端执行show slave status \G;
用于查看主从同步状态。

正常情况下,SlaveIORunning 和 SlaveSQLRunning 都是No,因为我们还没有开启主从复制过程。使用start slave
开启主从复制过程,然后再次查询主从同步状态show slave status \G;
。

如果SlaveIORunning一直是Connecting,则说明主从复制一直处于连接状态,看err信息,应该是密码问题。
解决方法:
进入master容器的mysql执行:
输入ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
然后重新配置主从关联即可
注意:需要先停止主从同步: stop slave ;
然后在master重新执行查询:
mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 994 | | | |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
在mysqlslave1 重新配置主从关联,修改master_log_pos的值为新的Position 值
mysql> stop slave ;Query OK, 0 rows affected (0.03 sec)mysql> change master to master_host='172.17.0.2', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos= 994, master_connect_retry=30;Query OK, 0 rows affected, 2 warnings (0.03 sec)

SlaveIORunning 和 SlaveSQLRunning 都是Yes,说明主从复制已经开启。此时可以测试数据同步是否成功。
mysqlslave2 同样进行主从同步配置
使用数据库连接工具连接一主二从数据库


在主库创建数据库测试

刷新从库:

看到两个从库都已经更新,说明主从配置成功。
缺陷,这种做法,所有从库可接受主库的变更,而主库不接受从库的变更。
本篇到此为止,后续有更深的研究使用后续再更新,目前知识仅到这里。欢迎拍砖!
如果你觉得对你有用,请关注下呗,点个在看也行!




