大家好啊,黄油弟好久没写博客了。最近在看尚硅谷的谷粒商城,寻思着也搞个分布式玩玩,但是得要mysql主从配置呀。心想这还有什么难的,结果前前后后配了1天半,这边就把详细过程和坑分享给大家。(关于工具的安装就不废话啦)
请大家有点耐心,你碰到的问题下面可能就有!
现在docker盛行,那就直接用docker pull mysql安装;既然是主从,那肯定要开两个容器啦,一个作为主服务器来写,一个作为从服务器来读。具体参考的命令和图片如下,也就是将mysql配置文件挂载到指定的目录下,更好找寻,master类似slave配置:
docker run -p 3307:3306 --name mysql-slave
-v /mysql/slave/conf:/etc/mysql/conf.d
-v /mysql/slave/logs:/logs
-v /mysql/slave/data:/var/lib/mysql
-e MYSQL_ROOT_PASSWORD=123456 -d mysql
在接下来就需要对数据库进行配置,配置文件是你之前挂载目录conf下的my.cnf,但是原本是没有的,需要你自建一个。(这里不要去修改其他的cnf文件,比如data里的auto.cnf,会产生意外的结果),具体内容可参考下方(master的):
从上至下依次为编码设置、服务器id设置、只读与否设置、同步的数据库与不同步的数据库设置(slave从数据库只需修改id和read-only)
接下来便是在windows上测试两个mysql连接,这时候会出现第一个问题!
2003 - Cant't connect to MySQL server on 'ip'(10060 "Unknown error")
我是一个很特殊的原因,我在my.cnf中设置了免密登陆,但是在容器里又设置了123456的密码,因此导致连接不上。只要吧设置的免密去掉就可以了!
之后在容器内部进行主从服务器的设置。
主服务器:
- grant all privileges on *.* to 'root'@'%' with grant option; //给root分配权限
- flush privileges;
- create user 'backup'@'%' identified by '123456'; //创建用户名密码
- grant peplication slave on *.* to 'backup'@'%'; //分配slave权限给它
- 可在mysql数据库的user表里查看分配结果
这里有两个要点:1.如果提示你权限不足,可能是因为你以无密登陆,此时必须改为有密码登陆!2.mysql8和mysql5有区别,mysql5可以创建授权连打,但是mysql8必须分开!
从服务器:
- change master to master_host='192.168.226.129',master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=1069,master_port=3306,get_master_public_key=1;
- start slave; //开启从状态
- show slave status\G; //查看状态
这里需要注意的就是参数别打错,参数在主服务器端用show master status;查看。
有些小伙伴可能注意到我在连接master时加粗了一句命令get_master_public_key=1,这个是针对错误ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.
也就是如果你不加这句,slave会连接失败一直处于connecting状态,这个报错在status里会有。这是mysql8的原因,连接时加上这条命令就ok了。
最后效果如下:
在指定数据库内进行添加删除表等操作,从数据库也能马上获得结果了。但是其实整个过程中还有其他一些问题,但是忘了,你们碰到了可以留言,一起解决它。