分库分表之mysql主从复制集群搭建
1、简介官网https://shardingsphere.apache.org/index_zh.html文档https://shardingsphere.apache.org/document/5.1.1/cn/overview/Apache ShardingSphere 由 JDBC、Proxy 和 Sidecar规划中这 3 款既能够独立部署又支持混合部署配合使用的产品组成。2、ShardingSphere-JDBC程序代码封装定位为轻量级 Java 框架在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库以 jar 包形式提供服务无需额外部署和依赖可理解为增强版的 JDBC 驱动完全兼容 JDBC 和各种 ORM 框架。3、ShardingSphere-Proxy中间件封装定位为透明化的数据库代理端提供封装了数据库二进制协议的服务端版本用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL版本它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端如MySQL Command Client, MySQL Workbench, Navicat 等操作数据对 DBA 更加友好。MySQL主从同步原理基本原理slave会从master读取binlog来进行数据同步具体步骤step1master将数据改变记录到二进制日志binary log中。step2当slave上执行start slave命令之后slave会创建一个IO 线程用来连接master请求master中的binlog。step3当slave连接master时master会创建一个log dump 线程用于发送 binlog 的内容。在读取 binlog 的内容的操作中会对主节点上的 binlog 加锁当读取完成并发送给从服务器后解锁。step4IO 线程接收主节点 binlog dump 进程发来的更新之后保存到中继日志relay log中。step5slave的SQL线程读取relay log日志并解析成具体操作从而实现主从操作一致最终数据一致。2、一主多从配置服务器规划使用docker方式创建主从服务器IP一致端口号不一致2.1、准备主服务器step1在docker中创建并启动MySQL主服务器端口3306拉取镜像dockerpull docker.1ms.run/library/mysql:latestdockerrun-d\-p3306:3306\-v/home/run/mysql/master/conf:/etc/mysql/conf.d\-v/home/run/mysql/master/data:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD123456\--namemysql-master\docker.1ms.run/library/mysql:latest执行结果step2创建MySQL主服务器配置文件默认情况下MySQL的binlog日志是自动开启的可以通过如下配置定义一些可选配置vim/home/run/mysql/master/conf/my.cnf配置内容[mysqld]# 服务器唯一id默认值1server-id1# 设置日志格式默认值ROWbinlog_formatSTATEMENT# 二进制日志名默认binlog# log-binbinlog# 设置需要复制的数据库默认复制全部数据库#binlog-do-dbmytestdb# 设置不需要复制的数据库#binlog-ignore-dbmysql#binlog-ignore-dbinfomation_schema服务重启dockerrestart mysql-masterbinlog格式说明binlog_formatSTATEMENT日志记录的是主机数据库的写指令性能高但是now()之类的函数以及获取系统参数的操作会出现主从数据不同步的问题。binlog_formatROW默认日志记录的是主机数据库的写后的数据批量操作时性能较差解决now()或者 user()或者 hostname 等操作在主从机器上不一致的问题。binlog_formatMIXED是以上两种level的混合使用有函数用ROW没函数用STATEMENT但是无法识别系统变量binlog-ignore-db和binlog-do-db的优先级问题step3使用命令行登录MySQL主服务器#进入容器env LANGC.UTF-8 避免容器中显示中文乱码dockerexec-itmysql-masterenvLANGC.UTF-8 /bin/bash#进入容器内的mysql命令行mysql-uroot-p#修改默认密码校验方式ALTERUSERroot%IDENTIFIED WITH mysql_native_password BY123456;step4主机中创建slave用户-- 创建slave用户CREATEUSERmysql_slave%;-- 设置密码ALTERUSERmysql_slave%IDENTIFIEDBY123456;-- 授予复制权限GRANTREPLICATIONSLAVEON*.*TOmysql_slave%;-- 刷新权限FLUSHPRIVILEGES;执行结果step5主机中查询master状态执行完此步骤后不要再操作主服务器MYSQL防止主服务器状态值变化SHOWMASTERSTATUS;高版本使用SHOW BINARY LOG STATUS;记下File和Position的值。执行完此步骤后不要再操作主服务器MYSQL防止主服务器状态值变化。2.2、准备从服务器可以配置多台从机slave1、slave2…这里以配置slave1为例step1在docker中创建并启动MySQL从服务器端口3307dockerrun-d\-p3308:3306\-v/home/run/mysql/slave1/conf:/etc/mysql/conf.d\-v/home/run/mysql/slave1/data:/var/lib/mysql\-eMYSQL_ROOT_PASSWORD123456\--namemysql-slave1\docker.1ms.run/library/mysql:latest执行结果step2创建MySQL从服务器配置文件vim/home/run/mysql/slave1/conf/my.cnf配置如下内容[mysqld] # 服务器唯一id每台服务器的id必须不同如果配置其他从机注意修改id server-id2 # 中继日志名默认xxxxxxxxxxxx-relay-bin #relay-logrelay-bin重启MySQL容器dockerrestart mysql-slave1step3使用命令行登录MySQL从服务器#进入容器dockerexec-itmysql-slave1envLANGC.UTF-8 /bin/bash#进入容器内的mysql命令行mysql-uroot-p#修改默认密码校验方式ALTERUSERroot%IDENTIFIED BY123456;执行结果step4在从机上配置主从关系在从机上执行以下SQL操作CHANGE MASTERTOMASTER_HOST172.18.8.229,MASTER_USERmysql_slave,MASTER_PASSWORD123456,MASTER_PORT3307,MASTER_LOG_FILEbinlog.000003,MASTER_LOG_POS1450;新版本执行命令CHANGEREPLICATIONSOURCETOSOURCE_HOST172.18.8.229,SOURCE_USERmysql_slave,SOURCE_PASSWORD123456,SOURCE_PORT3307,SOURCE_LOG_FILEbinlog.000003,SOURCE_LOG_POS1450;旧参数≤ MySQL 8.0.22新参数≥ MySQL 8.0.23MASTER_HOSTSOURCE_HOSTMASTER_USERSOURCE_USERMASTER_PASSWORDSOURCE_PASSWORDMASTER_PORTSOURCE_PORTMASTER_LOG_FILESOURCE_LOG_FILEMASTER_LOG_POSSOURCE_LOG_POSCHANGE MASTER TOCHANGE REPLICATION SOURCE TO执行结果2.3、启动主从同步启动从机的复制功能执行SQLSTARTSLAVE;-- 查看状态不需要分号SHOWSLAVESTATUS\G高版本-- 4. 启动复制 (新命令)STARTREPLICA;-- 5. 查看状态 (新命令)SHOWREPLICASTATUS\G两个关键进程下面两个参数都是Yes则说明主从配置成功Replica_IO_Running: Connecting Replica_SQL_Running: Yes2.4、实现主从同步在主机中执行以下SQL在从机中查看数据库、表和数据是否已经被同步CREATEDATABASEdb_user;USEdb_user;CREATETABLEt_user(idBIGINTAUTO_INCREMENT,unameVARCHAR(30),PRIMARYKEY(id));INSERTINTOt_user(uname)VALUES(zhang3);INSERTINTOt_user(uname)VALUES(hostname);主机执行从机查看结果存在异常不要用宿主机的IP地址用容器内的IP地址STOP REPLICA;CHANGE REPLICATION SOURCE TOSOURCE_HOST172.17.0.2, -- 主库容器内网IPSOURCE_USERmysql_slave,SOURCE_PASSWORD123456,SOURCE_PORT3306, -- 【关键修改】这里必须是3306不是3307SOURCE_LOG_FILEbinlog.000003,SOURCE_LOG_POS1450;START REPLICA;从库查看数据同步成功2.5、停止和重置需要的时候可以使用如下SQL语句-- 在从机上执行。功能说明停止I/O 线程和SQL线程的操作。stop slave;-- 在从机上执行。功能说明用于删除SLAVE数据库的relaylog日志文件并重新启用新的relaylog文件。reset slave;-- 在主机上执行。功能说明删除所有的binglog日志文件并将日志索引文件清空重新开始所有新的日志文件。-- 用于第一次进行搭建主从库时进行主库binlog初始化工作reset master;2.6、常见问题问题1启动主从同步后常见错误是Slave_IO_Running No 或者 Connecting的情况此时查看下方的Last_IO_ERROR错误日志根据日志中显示的错误信息在网上搜索解决方案即可典型的错误例如Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: Client requested master to start replication from position file size解决方案-- 在从机停止slaveSLAVE STOP;-- 在主机查看mater状态SHOWMASTERSTATUS;-- 在主机刷新日志FLUSH LOGS;-- 再次在主机查看mater状态会发现File和Position发生了变化SHOWMASTERSTATUS;-- 修改从机连接主机的SQL并重新连接即可问题2启动docker容器后提示WARNING: IPv4 forwarding is disabled. Networking will not work.此错误虽然不影响主从同步的搭建但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接C:\Users\administratormysql-h192.168.100.201-P3306-uroot-p解决方案#修改配置文件vim/usr/lib/sysctl.d/00-system.conf#追加net.ipv4.ip_forward1#接着重启网络systemctl restart network参考链接B站传送门