MySQL高可用性是确保数据库系统在面临故障或计划维护时仍然可用的重要因素之一。
原理
- master将数据改变记录到二进制日志(binary log)中
- slave将master的binary log events拷贝到它的中继日志(relay log)
- slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)
注意:
- 主DB server和从DB server数据库的版本一致
- 主DB server和从DB server数据库数据一致
- 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一
主从复制
主从复制是一种基本的高可用性方案。它可以用于将读负载分散到多个从数据库,并在主数据库发生故障时提供故障切换。
ps:主从复制是一个单向复制过程,只有主库向从库传输数据。
搭建
前置准备
- 准备
my.cnf
数据库配置文件,酌情修改[mysqld] # 基本设置 datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # 长连接设置 wait_timeout=600 interactive_timeout=600 # 缓冲池设置 key_buffer_size=64M innodb_buffer_pool_size=512M innodb_log_file_size=64M # 字符集设置 character-set-server=utf8mb4 collation-server=utf8mb4_general_ci # 服务器 ID,如果是主从复制,需要设置不同的值 server-id=1 # 开启二进制日志,用于主从复制 log-bin=mysql-bin binlog_format=row # 单个数据库包的最大大小 max_allowed_packet = 1024M [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
docker-compose.yml
,酌情修改,且network:mysql已提前创建version: '2' services: mysql: image: mysql:latest container_name: master01 environment: MYSQL_ROOT_PASSWORD: "123456" volumes: - $PWD/config:/etc/mysql/conf.d ports: - "13306:3306" command: > --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authentication-plugin=mysql_native_password networks: - mysql networks: mysql: external: true
- 相关目录结构
主库
- 创建master01并观察相关启动日志
- 工具连接测试,并检查
log_bin
是否开启
- 创建同步用户
create user 'slave'@'%' identified by '123456'; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'slave'@'%'; ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; flush privileges;
- 查看master状态
从库
-
配置文件稍作修改
# 中继日志名称 relay_log=wnhz-relay-bin
-
启动slave01,并观察启动日志
-
从库设置和主库连接
CHANGE MASTER TO master_host = 'master01', master_user = 'slave', master_password = '123456', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 1123;
注意和主库的对应关系:
-
开启slave
start slave;
-
查看slave日志
-
查看slave状态
-
验证:master建库,刷新slave,数据得到同步体现
主主互备
两个MySQL服务器都充当主服务器和从服务器两个角色。这意味着两个服务器之间可以相互写入和读取数据。当一个服务器写入数据时,它将数据同步到另一个服务器,反之亦然。
真正意义上的主主互备还需要处理一些额外的问题和配置:像是心跳检测,需要一种机制来监测主库的可用性。又或者是故障转移,某个主库监测到不可用时,需要自动切换到另一个主库,以确保系统的高可用性。又或者是冲突解决方案,当两个主库同时接收写入请求时,可能会导致数据冲突。需要一种机制来解决这些冲突,确保数据的一致性等。
本文只从数据库层面构建所谓的主主互备,具体选择如Galera Cluster或MySQL Group Replication又或者是MyCat中间件去解决上述问题,并不做具体演示。
搭建
上文中,搭建了主从复制,实现了主库增删改,从库数据自动同步的效果。实现主主互备,当在此基础上,实现所谓的从库中增删改,主库跟着同步的效果。此时,两个数据库对于自己来说,都是主库(负责接收写操作),对于对方来说,都是对方的从库(负责接收对方主库的数据更改)。
- slave库中创建用于同步的账号
- master库设置和slave库的连接
- 修改slave库中的信息可以看到master库中也做了更改
ps
:实际上的主主互备一般都与主从复制结合使用,即:有A、B、C、D、E、F 六个数据库,其中AB为主主互备,ACD为主从复制(A主,C、D从),BEF也为主从复制(B主,E、F从)