docker mysql 主从

一般不会在一台服务器上启动两个docker做主从,因为服务器一挂,两个容器都挂了

 

192.168.59.102 mysql1 master

192.168.59.103 mysql2 slave

 

1、安装mysql

本次使用docker 安装mysql

#docker run -p 3312:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.29

#docker run -p 3306:3306 --name mysql2 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.29  

 2、开启mysql1mysql2的navicat访问

>use mysql;

>UPDATE user SET HOST = '%' WHERE USER ='root';

失败,查看user表

>select host,user,plugin from user;

root的host已经是%,跳过 

>ALTER user 'root'@'%' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;

>ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

>FLUSH PRIVILEGES;

 

 3、配置master

选择mysql1作为master

登录容器mysql1

修改文件 /etc/mysql/my.cnf

添加以下信息

log-bin=master-bin
server-id=1】

 

登录mysql1的数据库

mysql2(slave)配置一个用户名/密码和权限

#创建一个slave1密码123456的用户, 

mysql> create user 'slave1'@'192.168.59.103' identified by '123456';

mysql>ALTER user 'slave1'@'192.168.59.103' IDENTIFIED BY '123456' PASSWORD EXPIRE NEVER;

#踩坑记录,如果不设置 PASSWORD EXPIRE NEVER,slave数据库连接一直提示密码无法验证

#或者slave1用户不指定IP:'slave1'@'%',就可以不设置 PASSWORD EXPIRE NEVER

mysql>ALTER user 'slave1'@'192.168.59.103' IDENTIFIED WITH mysql_native_password BY '123456';

#给slave1分配权限,所有数据库.所有表

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'192.168.59.103';

#查看slave1的权限

mysql>show grants for 'slave1'@'192.168.59.103';

重启mysql服务

再登录数据库查看master状态

mysql> show master status;

 

  注意:master-bin.000001157,slave配置用到

 

4、配置slave

选择mysql2作为slave

登录容器mysql2

修改文件 /etc/mysql/my.cnf

添加以下信息

log-bin=relay-bin
server-id=2】

 

 

 登录mysql2的数据库,将slave指向master

mysql>CHANGE MASTER TO
>MASTER_HOST='master所在服务器的IP',
>MASTER_USER='master授权的账号',
>MASTER_PASSWORD='master授权的密码',

>MASTER_PORT=master端口号,
>MASTER_LOG_FILE='master的日志文件名',
>MASTER_LOG_POS=master的日志所在位置;

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

mysql>CHANGE MASTER TO
>MASTER_HOST='192.168.59.102',
>MASTER_USER='slave1',
>MASTER_PASSWORD='123456',

>MASTER_PORT=3312,

>MASTER_LOG_FILE='master-bin.000001',
>MASTER_LOG_POS=157;

启动slave

mysql>start slave;

查看slave

 mysql>show slave status\G;

 

 

 两个都为Yes,启动成功

 

 

验证:(192.168.59.102192.168.59.103需要同步的数据库.表要一样的结构)

 在192.168.59.102上插入一条信息

 

192.168.59.103同时同步到一条记录 

 

 

 

 

 

注意


1)开启了主从复制,slave库如果写入数据的话,可能导致数据回滚从而主从复制线程中断

 

mysql> stop slave;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql > SET GLOBAL server_id=2; 
mysql> start slave;
2)停止slave的复制可以使用命令:
mysql>stop slave;
3)重启master服务器后,日志文件名会产生变化,如果无法同步数据,先stop slave;再CHANGE MASTER TO MASTER_LOG_FILE='master的日志文件名';来修改配置。

 

 4)max_connection_errors数量饱和,使slave服务器无法链接master服务器

解决方法1:修改提高允许的max_connection_errors数量:(这种方法不是长期)
set global max_connect_errors = 1000; show variables like '%max_connect_errors%';
解决方法2:使用mysqladmin flush-hosts 命令清理一下hosts文件
mysqladmin --socket=/tmp/mysql.sock --port=3306 -uroot -p flush-hosts
或者 mysql> flush hosts; 也可以
最后修改my.cnf配置文件 vi /etc/my.cnf:max_connect_errors = 1000
"注:max_connect_errors相关说明
max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。如果希望重置此计数器的值,则必须重启MySQL服务器或者执行 mysql> flush hosts; 命令。当这一客户端成功连接一次MySQL服务器后,针对此客户端的max_connect_errors会清零。
  如果max_connect_errors的设置过小,则网页可能提示无法连接数据库服务器;而通过SSH的mysql命令连接数据库,则会返回 ERROR 1129 (00000): Host 'gateway' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts' 错误。
功能与作用:一般来说建议数据库服务器不监听来自网络的连接,仅仅通过sock连接,这样可以防止绝大多数针对mysql的攻击;如果必须要开启mysql的网络连接,则最好设置此值,以防止穷举密码的攻击手段"

posted @   leihongnu  阅读(375)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示