建议先从第四点看起,很多问题可以迎刃而解。
目录
一 配置MYSQL
对于配置MySQL,我总结为下面几点:
- 在本地先写好mysql的配置
- 利用docker拉取网络上的MySQL镜像
- 构建docker容器,使拉取的镜像与本地的配置形成映射
分点来讲
在本地写好mysql需要的配置,首先需要在/usr/local (一般的本地文件放置的地方)下面创建software文件夹,并在里面创建一个mysql文件夹,然后在mysql文件夹中创建3306文件夹,然后在里面分别创建data文件夹还有conf文件夹。具体的结构如图所示。
然后在conf中创建一个my.cnf文件,然后就可以在里面写mysql相关的配置了。
pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL default_authentication_plugin=mysql_native_password # Custom config should go here !includedir /etc/mysql/conf.d/ server_id=200 log_bin=mysql-bin binlog_format=row
其中重要的是server_id,他是MySQL 中用来标识不同服务器(实例)的一个唯一标识符。在 MySQL 主从复制和多主复制等场景中,这个属性非常重要。
配置
log_bin=mysql-bin
启用了 MySQL 的二进制日志功能,并将生成的日志文件前缀设置为 "mysql-bin",而binlog_format=row
则指定了二进制日志记录的格式为 "row",以保证在主从复制中数据的精确复制和一致性。
本地配置好了就可以在网络上拉取MySQL的镜像了(如果延迟很高的话,可以去查找替换阿里云等镜像的方法或者使用魔法也可以)
拉取的代码如下
docker pull mysql
如果需要拉取指定版本,则只需要在mysql后面加上:并附上指定版本即可。
最后就是构建docker容器来运行mysql了,这一步也很简单。代码如下
docker run -it \ --name mysql_3306 \ --privileged \ -p 3306:3306 \ -v /usr/local/software/mysql/3306/conf/my.cnf:/etc/mysql/my.cnf \ -v /usr/local/software/mysql/3306/data:/var/lib/mysql \ -v /usr/local/software/mysql/3306/mysql-files:/var/lib/mysql-files \ -e MYSQL_ROOT_PASSWORD=123 \ -d mysql
简单解释下,docker run 是用来创建和启动一个新容器的代码,-it是可以让你进入容器的交互式终端,从而可以直接在容器内执行命令和操作。这在需要手动进入容器内部进行一些配置、调试、或者查看容器中的日志等情况下非常有用。
--name 是这个容器的名字,注意name必须是唯一的,不能重复。
--privileged 设置容器公开权限(默认为true)
-p 端口号 具体是指将前面的宿主机的端口号映射到后面的docker容器内部的mysql的端口号,可以通过宿主机的
3306
端口与运行在 Docker 容器中的MySQL数据库进行交互,实现在宿主机上访问MySQL服务的目的-v linux挂载文件夹/文件和容器内路径的映射 注意这里的映射路径得跟我们第一步的本地配置文件的路径对的上
-e 环境变量 这里可以用来设置docker容器中的mysql 的账号密码
-d 指后台运行容器,可以避免对接下来的操作造成影响。
到这一步结束,就已经成功地配置了MySQL。
docker exec -it mysql_3306 bash
使用上面的指令,进入容器内,然后输入mysql -uroot -p123来检验MySQL是否成功安装
二 搭建mysql的主从关系
通过上面的步骤已经成功配置了一个MySQL了,但是实际生产过程中,面对了大量数据的问题,如果不做优化的话,MySQL既得做增删改,又得做查询工作,这样性能会严重下降,所以通过搭建MySQL的主从关系,将一部分的查询任务交给容器中的其他MySQL来完成,很大程度上提高了性能、可用性和灵活性。下面将会详细阐述如何搭建MySQL的主从关系。
首先,我们需要进入mysql容器,输入命令: show variables LIKE 'log_%',来检查binlog是否开启。
binlog
是主服务器上记录所有数据更改操作的日志,而relaylog
是从服务器上记录接收自主服务器的数据更改操作的日志。这两种日志的正确运行和同步,确保了主从复制的正确性、可靠性和一致性,是主从复制机制的基础。
保证了log_bin开启之后,我们开始搭建mysql的master服务器
这里基本的配置,之前已经做好了,这里我们可以将之前创建的mysql容器直接当作主服务器,我们先获取他的一些基本信息
docker inspect mysql_3306 |grep IPA
这个指令可以获取主服务器的容器内ip,之后配置从服务器会用到。
接着我们进入容器
docker exec -it mysql_3306 bash
在容器中输入
mysql -uroot -p123
进入MySQL服务,然后我们先创建一个用户来与从(slave)服务通信(并且给他一定的权限,保证日志文件能安全地发送到从服务器)
create user ‘slave’@’%’ identified by ‘123’; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO ‘slave’@’%’; ALTER USER ‘slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘123’; flush privileges;
执行上面的指令后,就可以创建一个名为slave,密码为123的用户,并且给他一定的权限,最后刷新权限。
在这之后,我们还需要在mysql的操作界面输入
show master status;
来查看主服务器的状态
file是指二进制日志文件的起始文件名,Position是指起始文件位置,后面我们配置从服务器的时候,需要用到Position来保证主从同步的准确性。
主服务器配置完,我们进行从服务器的配置。
跟之前的mysql配置一样,只需要修改my.cnf文件中中的一点内容即可
pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL default_authentication_plugin=mysql_native_password # Custom config should go here !includedir /etc/mysql/conf.d/ server_id=210 log_bin=mysql-slave01-bin relay_log=wnhz-relay-bin read_only=1
这里的server_id之前说过了,不能够重复,所以这里改成210,加上了relay_log,用来记录从主服务器上获取的二进制日志。另外read_only=1规定了从服务器的只读操作,避免了意外的修改。
跟之前一样创建了mysql的容器之后(注意端口号不要一样,之前用的3306,这里可以用3310或者其他的)最重要的一步:
进入从服务器的容器后,进入mysql服务,输入以下指令
change master to master_host='172.17.0.2', master_user='slave', master_password='123', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1404;
这里的172.17.0.2就是之前配置主服务器时查询出来的ip,master_user就是创建的那个通信对象,
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=1404;一定要跟主服务器中show master status查询出来的内容一模一样!(可能会发生变化,所以需要重新按照之前的方式查询一次)
指令运行完,主从关系已经绑定,接下来要开启slave
start slave;
开启完成之后,继续输入
show slave status \G;
来查询主从状态
一定得是两个Yes才算搭建完成。
至此,mysql 的主从已经搭建完毕,通过测试,已经实现了主从的功能。
若配置完还是无法实现主从同步关系。可以尝试以下的指令:
stop slave;
reset slave;
start slave;
三 限制从进行增删改
进入从容器中的mysql服务里,创建对应的对象,只给读权限
create user 'rdb'@'%' identified WITH mysql_native_password by '123';
grant select ON *.* to 'rdb'@'%';
flush privileges;
四 开端口
此外,每一个容器都要在机器上开通对应的端口如3306,3310等。
指令如下:
firewall-cmd —zone=public —add-port=端口号/tcp —permanent
以上就是MySQL的配置以及搭建主从的大致过程,欢迎有疑问的小伙伴在评论区留言,也欢迎各位大佬指正。