专业的营销型网站公司,陕西高端品牌网站建设价格,百度搜索引擎的功能,无锡做公司网站多少钱安装docker的步骤、使用命令就不写了#xff0c;本文章是基于会使用docker、linux基本命令的基础上来写的。 开始步骤#xff1a;
1. 拉取 mysql 镜像
docker pull mysql:8.0.32
2. 启动容器并运行mysql a. 准备mysql的配置文件#xff08;该配置文件是#xff1a;mysq… 安装docker的步骤、使用命令就不写了本文章是基于会使用docker、linux基本命令的基础上来写的。 开始步骤
1. 拉取 mysql 镜像
docker pull mysql:8.0.32
2. 启动容器并运行mysql a. 准备mysql的配置文件该配置文件是mysql:8.0.32直接启动后的翻译过后的原始配置文件
# 关于如何更改设置的建议请参考
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html[mysqld]
#
# 去掉前导的 #并设置用于 MySQL 中最重要的数据缓存的内存量。
# 对于专用服务器从总内存开始设置为 70%否则为 10%。
# innodb_buffer_pool_size 128M
#
# 去掉前导的 # 以启用一个非常重要的数据完整性选项在备份之间记录
# 二进制日志中的更改。
# log_bin
#
# 去掉前导的 # 以设置主要用于报告服务器的选项。
# 对于事务和快速 SELECT默认值更快。
# 根据需要调整大小尝试找到最佳值。
# join_buffer_size 128M
# sort_buffer_size 2M
# read_rnd_buffer_size 2M# 去掉前导的 # 以恢复到先前的 default_authentication_plugin 值
# 这将提高与旧客户端的兼容性。有关背景信息请参阅
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-pluginmysql_native_password
skip-host-cache
skip-name-resolve
datadir/var/lib/mysql
socket/var/run/mysqld/mysqld.sock
secure-file-priv/var/lib/mysql-files
usermysqlpid-file/var/run/mysqld/mysqld.pid[client]
socket/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
重点将配置文件在计算机本地创建好后面会用来挂载到docker里的mysql的my.cnf 文件
只需要在本地创建 3个 my.cnf 文件复制上面的内容 再分别在文中任意位置最好放当中 添加 server_id100、server_id101、server_id102 属性即可没有顺序值也可以是1、2、3任意的不同就行作用只是标记启动的不同数据库拥有不同的id如果3个数据库不在一个服务器上就不需要添加这个配置了。
下面是挂载的内容解释-- 启动一个mysql将数据挂载到本地目录/Users/wangqinmin/docker/mysql/master_slave/master_data
-- 配置文件挂载到mysql8.0.32的my.cnf文件位置在/etc/my.cnf/Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf
-- 日志文件挂载到/Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql
-- SELECT ... INTO OUTFILE 操作导出的文件挂载到/Users/wangqinmin/docker/mysql/master_slave/file/mysql-files
b. 写好命令开始执行 docker run --name mysql_master_33066 -v /Users/wangqinmin/docker/mysql/master_slave/data/master_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/master_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/master_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql-files:/var/lib/mysql-files -p 33066:3306 -e MYSQL_ROOT_PASSWORDwangqinmin -d mysql:8.0.32docker run --name mysql_slave_33067 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave1_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave1_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave1_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave1:/var/lib/mysql-files -p 33067:3306 -e MYSQL_ROOT_PASSWORDwangqinmin -d mysql:8.0.32docker run --name mysql_slave_33068 -v /Users/wangqinmin/docker/mysql/master_slave/data/slave2_data:/var/lib/mysql -v /Users/wangqinmin/docker/mysql/master_slave/conf/slave2_conf/my.cnf:/etc/my.cnf -v /Users/wangqinmin/docker/mysql/master_slave/log/slave2_log:/var/log/mysql -v /Users/wangqinmin/docker/mysql/master_slave/file/mysql_files_slave2:/var/lib/mysql-files -p 33068:3306 -e MYSQL_ROOT_PASSWORDwangqinmin -d mysql:8.0.32
3. 从上面的挂载目录命名就可以看出我准备将 33066 作为主数据库33067和33068做为从数据库 4. 主从复制就是在数据库上做配置的设置重点在这里但是很简单就几条命令 1. 进入33066主库 docker容器中
docker exec -it mysql_master_33066 /bin/bash a. 首先 mysql -uroot -p 进入mysql 或者用 Navicat 工具连接 b. 执行以下两条命令
-- 创建名字为copy_file_wangqinmin 密码为wangqinmin 访问ip为任意ip的用户
CREATE USER copy_file_wangqinmin% IDENTIFIED BY wangqinmin;-- 为名字是 copy_file_wangqinmin 的用户只设置 REPLICATION SLAVE 复制数据的权限
GRANT REPLICATION SLAVE ON *.* TO copy_file_wangqinmin%;-- mysql8.0.32 需要执行这个命令搭建完成后发现没有连接成功看错误日志后添加的这一段命令
-- 否则会有错误日志
-- error connecting to master copy_file_wangqinmin192.168.1.3:33066 - retry-time: 60 retries: 1 message: Authentication plugin caching_sha2_password reported error: Authentication requires secure connection.
ALTER USER copy_file_wangqinmin% IDENTIFIED WITH mysql_native_password BY wangqinmin;-- 刷新权限
FLUSH PRIVILEGES; c. 重启主库和从库
docker restart mysql_master_33066 mysql_slave_33067 mysql_slave_33068 d. 在主库上执行以下命令并记下 File 和 Position 的值
SHOW MASTER STATUS;
我这里获取到的数据为
因为mysql都在docker内部安装所以容器的本地ip是127.0.0.1但是本机外部的本地ip也是127.0.0.1所以需要查询外部电脑的ip地址
我的ip地址是 192.168.1.3 2. 进入33067从库 docker容器中
docker exec -it mysql_slave_33067 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后分别执行以下3条命令
-- 停止从库的复制进程。这是为了确保在修改主从配置时不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST192.168.1.3,MASTER_PORT33066,MASTER_USERcopy_file_wangqinmin,MASTER_PASSWORDwangqinmin,MASTER_LOG_FILEbinlog.000002,MASTER_LOG_POS721;-- 启动从库的复制进程开始从主库复制数据。
START SLAVE; 3. 进入33068从库 docker容器中
docker exec -it mysql_slave_33068 /bin/bash
进入mysql中 或者 用 Navicat 工具连接后分别执行以下3条命令
-- 停止从库的复制进程。这是为了确保在修改主从配置时不会有正在运行的复制进程。
STOP SLAVE;-- 指定从库要去主库的哪个位置开始复制数据。
CHANGE MASTER TOMASTER_HOST192.168.1.3,MASTER_PORT33066,MASTER_USERcopy_file_wangqinmin,MASTER_PASSWORDwangqinmin,MASTER_LOG_FILEbinlog.000002,MASTER_LOG_POS721;-- 启动从库的复制进程开始从主库复制数据。
START SLAVE;
解释
MASTER_HOST192.168.1.3: 指定主库的 IP 地址。MASTER_PORT33066: 指定主库的端口号。MASTER_USERcopy_file_wangqinmin: 指定用于连接主库的用户。MASTER_PASSWORDwangqinmin: 指定主库用户的登录密码。MASTER_LOG_FILEbinlog.000002: 指定主库的二进制日志文件。MASTER_LOG_POS721: 指定从主库的从哪个二进制日志位置开始复制数据。 最后一步查看从库的状态确定从库是否已经连接到主库是否能够复制文件和sql 在从库上执行以下命令
SHOW SLAVE STATUS;
确保 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes 如果一直没有连接上可以尝试先重启主库再重启从库。如果还不行就看看是不是ip或者是参数填写错误。
或者查看错误日志
执行命令查看错误日志这里是我不断调试过程中发现的错误日志SHOW SLAVE STATUS;
给大家看一下成功的结果
这时候向主库 【创建数据库添加数据修改数据等等】导致数据变化的操作。从库都会实时的进行数据变更。
有一点要注意的是虽然实现了主从复制但是依然会有延迟并且可能由于网络、IO、CPU等因素的影响最终会导致数据的不一致问题这个问题不能被完全解决只能优化同时某些业务如果要求数据一致的情况下还是需要直接去读主库。
注意还没有完 。
上面只是搭建还有关闭、启动数据库也是有步骤的。
思想很简单
1. 先关闭从库再关闭主库
2. 先启动主库再启动从库。 关闭
我们需要
1. 先关闭从库的复制功能 (这个是有顺序的必须先执行)STOP SLAVE;
2. 然后关闭主库systemctl stop mysql 我这里是docker 就直接 docker stop 容器ID
3. 再关闭多个从库我这里是两个systemctl stop mysql 我这里是docker 就直接 docker stop 容器ID启动
1. 先启动主库systemctl start mysql
2. 再启动多个从库systemctl start mysql
3. 从库执行 每个从库都执行START SLAVE;
4. 然后看一下状态是否正确 正确就可以了SHOW SLAVE STATUS; 5. 要完成读写分离的话我使用 sharding jdbc来完成。让主库完成 增、删、改的操作让从库的轮询访问来完成读的操作。 未完待续