配置2个mysql 主从
3个nacos
nginx反向代理
docker run -di --name=mysql_master -p 33306:3306 -e MYSQL_ROOT_PASSWORD=556798 mysql
–name 代表容器名称可以用来启动停止重启容器
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口 向外映射端口 通过linux访问
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD是root用户的登陆密码
#同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引
apt-get update
#安装vim
apt-get install -y vim
#进入刚才创建的容器 mysql_master 是你之前设置的 --name
docker exec -it mysql_master /bin/bash
vim /etc/mysql/my.cnf
新增信息
[mysqld]
## 设置server_id,注意要唯一
server-id=101
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
## 永久设置时区时间
default-time_zone = '+8:00'
参考图片 下方图片只是参考 server-id=101 这个才是正确的
mysql -u root -p #登录
登录输入不显示密码不要以为输入不了
登录之后
MySQL8的默认的密码加密策略发生了变化,之前的一些客户端的软件会出现无法登录的 情况。
解决:
使用mysql原生的命令进去,使用之前的密码加密策略重新修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
#本地登录(如果用原生的命令行的话,不用改)
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '556798';
#远程登录
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '556798';
#创建同步用户
CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY '556798';
#授权
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'admin'@'%';
#然后修改root权限
use mysql;
#在 mysql 数据库的 user 表中查看当前 root 用户的相关信息
select host, user, authentication_string, plugin from user;
#授权 root 用户的所有权限并设置远程访问
GRANT ALL ON *.* TO 'root'@'%';
#刷新权限列表
flush privileges;
#查看关键信File和Position字段的值,在后面的操作完成之前,
#需要保证master库不能做任何操作,否则将会引起状#态变化,
#File和Position字段的值变化。 如下图需要记下来在下面2.4步骤需要 下图中的mysql-slave-bin.000001 156
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-slave-bin.000001
Position: 156
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
#退出mysql
exit;
#退出容器
exit;
#再退出到宿主容器查看mysql的映射端口
firewall-cmd --zone=public --list-ports
#将mysql端口的防火墙打开 xxxxx 端口
firewall-cmd --zone=public --add-port=3363/tcp --permanent
#重新载入
firewall-cmd --reload
docker restart mysql_master
至此,master数据库安装配置完成。
docker run -di --name=mysql_slave -p 33307:3306 -e MYSQL_ROOT_PASSWORD=556798 mysql
#将mysql端口的防火墙打开 xxxxx 端口
firewall-cmd --zone=public --add-port=33307/tcp --permanent
#重新载入
firewall-cmd --reload
mysql -uroot -p556798
#本地要用客户端比如navicat连接,设置root的认证方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '556798';
#然后修改root权限
use mysql;
#在 mysql 数据库的 user 表中查看当前 root 用户的相关信息
select host, user, authentication_string, plugin from user;
#授权 root 用户的所有权限并设置远程访问
GRANT ALL ON *.* TO 'root'@'%';
#刷新权限列表
flush privileges;
change master to master_host='ip', master_user='root', master_password='556798', master_port=33306, master_log_file='mysql-slave-bin.000001', master_log_pos= 156, master_connect_retry=30,get_master_public_key=1;
参数介绍
master_host:Master的地址,指的是容器的独立IP,可以通过下面命令查询
[root@localhost ~]# docker inspect --format='{
{.NetworkSettings.IPAddress}}' 5c2 172.17.0.4
master_port: Master的端口,指的是容器的端口号,不是映射端口
master_user:用于数据同步的用户
master_password:用户同步的用户的密码
master_log_file:指定Slave从哪个日志文件开始复制数据,即上文中提到的File字段的值
master_log_pos:指从哪个Position开始读,即上文中提到的Position字段的值
master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
备注:之所以设置get_master_public_key=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password
正常情况下,Slave_IO_Running 和 Slave_SQL_Running 都是No,因为我们还没有开启主从复制的过程
start slave;![在这里插入图片描述](https://img-blog.csdnimg.cn/2020122616343472.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80ODI1NTgwNw==,size_16,color_FFFFFF,t_70#pic_center)
再次查询主从同步状态
show slave status \G;
然后退出重启容器。其他的slave的安装配置方法和slave的方法一样,区别就是cnf文件中的server-id不能相同罢了
3.1. 使用start slave开启主从复制过程后,如果SlaveIORunning一直是Connecting,则说明主从复制一直处于拦截状态,这种情况一般是下面集中原因造成的,可以根据Last_IO_Error提示予以排除。
解决办法:检查IP,端口
检查是否创建用于同步的用户和用户密码是否正确
检查master的position
3.2. 如果开启主从复制失败,需要修改和重启,可参考下方提示
停止主从复制
stop slave;
重置之前的配置信息
reset slave;
启动主从复制
start slave;
看上面的
数据库初始化脚本:https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
需要修改ip为自己的ip端口的话 -p 位置左边修改可访问端口 右边修改容器内端口默认8848
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=ip:38848,ip:38849,ip:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=ip地址 \
-e MYSQL_SERVICE_PORT=33306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=556798 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=ip地址 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38848:8848 \
--name nacos48 \
--restart=always \
nacos/nacos-server
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=ip:38848,ip:38849,ip:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=ip地址 \
-e MYSQL_SERVICE_PORT=33306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=556798 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=ip地址 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38849:8848 \
--name nacos49 \
--restart=always \
nacos/nacos-server
docker run -d \
-e MODE=cluster \
-e NACOS_APPLICATION_PORT=8848 \
-e NACOS_SERVERS=ip:38848,ip:38849,ip:38850 \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=ip地址 \
-e MYSQL_SERVICE_PORT=33306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=556798 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e NACOS_SERVER_IP=ip地址 \
-e JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m \
-p 38850:8848 \
--name nacos50 \
--restart=always \
nacos/nacos-server
MODE=cluster 集群模式
NACOS_APPLICATION_PORT=8848 容器nacos端口
NACOS_SERVERS=ip:38848,ip:38849,ip:38850 集群每个nacos-server服务
SPRING_DATASOURCE_PLATFORM=mysql 独立支持mysql
NACOS_SERVER_IP=ip 可选值hostname/ip 默认ip
MYSQL_* 相关
MYSQL_SERVICE_DB_NAME=nacos_config 数据库初始化脚本数据库名称
数据库初始化脚本:https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql
JVM_XMS=215m -e JVM_XMX=215m -e JVM_XMN=215m
-p 38850:8848 38850宿主机端口:8848 nacos访问端口
–restart=always 重启docker服务会启动该容器
nacos/nacos-server:1.3.1 nacos镜像版本
如下直接全部复制进xshell
firewall-cmd --zone=public --add-port=38848/tcp --permanent
firewall-cmd --zone=public --add-port=38849/tcp --permanent
firewall-cmd --zone=public --add-port=38850/tcp --permanent
firewall-cmd --zone=public --add-port=33306/tcp --permanent
firewall-cmd --reload
如果是阿里云服务器要去开启安全组规则
访问地址1:http://宿主机IP:38848/nacos
访问地址2:http://宿主机IP:38849/nacos
访问地址3:http://宿主机IP:38850/nacos
默认登录账号密码都是nacos
如图则集群搭建成功
nacos集群就到这里
错误总结:无法连接
IP地址 ,mysql 账号 密码
# 启动
docker run -d --name nginx-test nginx:1.19.0
# 进入容器
docker exec -it nginx-test /bin/bash
# 进入容器内部后,找到配置文件路径
cd /etc/nginx/conf.d/default.conf
# 查看nginx.conf配置文件
2.创建文件
mkdir -p /home/dockerdata/
#在dockerdata文件下创建log文件件
mkdir log
copy配置文件default.conf到自己创建的文件:
# copy配置文件default.conf到/home/dockerdata
docker cp nginx-test:/etc/nginx/conf.d/default.conf /home/dockerdata
# 也可以copy前端html到/home/dockerdata
docker cp nginx-test:/usr/share/nginx/html /home/dockerdata
填写自己nacos的IP
#新增,为了演示,故不配置权重
upstream cluster {
server ip:8848;
server ip:8848;
server ip:8848;
}
server {
listen 80;
server_name localhost;
#新增,配置nginx的日志级别debug
#error_log /var/log/nginx/debug.log debug;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
#新增,转向集群配置
location /nacos {
proxy_pass http://cluster;
}
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
docker run -d -p 80:80 --name nginx -v /home/dockerdata/html:/usr/share/nginx/html -v /home/dockerdata/log:/var/log/nginx -v /home/dockerdata/default.conf:/etc/nginx/conf.d/default.conf nginx:1.19.0
启动命令简要:
docker run -d \
-p 80:80 \ # 主机80端口映射容器80端口
--name nginx \ # 容器名称nginx
--network anet \ # 指定网络,anet
-v /home/dockerdata/html:/usr/share/nginx/html \ # 映射html到主机
-v /home/dockerdata/log:/var/log/nginx \ # 映射日志文件到主机
-v /home/dockerdata/default.conf:/etc/nginx/conf.d/default.con \ # 映射主机配置文件到nginx
nginx:1.19.0
开发端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
至此,我的nacos集群配置全部完成,实现 Nginx(1台) + Nacos(3台) + Mysql(2台)的配置