部署 MySQL 主从集群

此文档描述在 DockerCentos 7 中搭建 MySQL主从集群的过程;该方案在主数据库出现宕机时并不会自行切换至备数据库,备数据库仅提供备份功能;欢迎参与 Rainbond开源社区 提供数据库高可用自动切换方案。

相关信息

数据库类型版本字符编码
MySQL8.0utf8mb4

在 Docker 中部署 MySQL 主从集群

在主从服务器中执行以下命令获取镜像:

  1. docker pull mysql:8.0

主从数据库配置文件

主数据库配置文件

vim /var/lib/mysql/my.cnf

  1. [mysqld]
  2. pid-file = /var/run/mysqld/mysqld.pid
  3. socket = /var/run/mysqld/mysqld.sock
  4. datadir = /var/lib/mysql
  5. secure-file-priv= NULL
  6. # Disabling symbolic-links is recommended to prevent assorted security risks
  7. symbolic-links=0
  8. # 服务端默认utf8编码
  9. character-set-server=utf8mb4
  10. # 默认存储引擎
  11. default-storage-engine=INNODB
  12. # 主从配置
  13. log-bin=binlog
  14. server-id=121
  15. gtid-mode=on
  16. enforce-gtid-consistency=on
  17. log-slave-updates=on
  18. expire_logs_days=14
  19. # Compatible with versions before 8.0
  20. default_authentication_plugin=mysql_native_password
  21. skip-host-cache
  22. skip-name-resolve
  23. [client]
  24. #设置客户端编码
  25. default-character-set=utf8mb4
  26. [mysql]
  27. # 设置mysql客户端默认编码
  28. default-character-set=utf8mb4
  29. # Custom config should go here
  30. !includedir /etc/mysql/conf.d/
  31. # Custom config should go here
  32. !includedir /etc/mysql/conf.d/
  33. ``` 从数据库配置文件
  34. vim /var/lib/mysql/my.cnf

[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL

Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

服务端默认utf8编码

character-set-server=utf8mb4

默认存储引擎

default-storage-engine=INNODB

主从配置

server-id=122 gtid-mode=on enforce-gtid-consistency=on log-slave-updates=on expire_logs_days=14

Compatible with versions before 8.0

default_authentication_plugin=mysql_native_password skip-host-cache skip-name-resolve

[client]

设置客户端编码

default-character-set=utf8mb4 [mysql]

设置mysql客户端默认编码

default-character-set=utf8mb4

Custom config should go here

!includedir /etc/mysql/conf.d/

Custom config should go here

!includedir /etc/mysql/conf.d/

  1. ### 启动主数据库

docker run —name mysql_master —restart=always \ -p 3306:3306 \ -v /var/lib/mysql/my.cnf:/etc/mysql/my.cnf \ -v /var/lib/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=Root123456 \ -d mysql:8.0

  1. - 创建 `slave` 用户并授权

进入数据库

docker exec -it mysql_master bash

创建用户授权

mysql> CREATE USER ‘slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘slave’; mysql> GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’; mysql> flush privileges;

  1. - 获取主节点当前 `binary log` 文件名和位置 `position`

mysql> SHOW MASTER STATUS; +———————-+—————+———————+—————————+—————————————————————+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +———————-+—————+———————+—————————+—————————————————————+ | binlog.000003 | 868 | | | 1b009ef8-a67f-11ea-8c9a-0242ac110002:1-8 | +———————-+—————+———————+—————————+—————————————————————+ 1 row in set (0.00 sec)

  1. ### 启动从数据库

docker run —name mysql_slave —restart=always \ -p 3306:3306 \ -v /var/lib/mysql/my.cnf:/etc/mysql/my.cnf \ -v /var/lib/mysql/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=Root123456 \ -d mysql:8.0

  1. ### 配置主从复制

进入数据库

docker exec -it mysql_slave bash

主从配置

mysql> CHANGE MASTER TO mysql> MASTER_HOST=’192.168.0.10’, mysql> MASTER_USER=’slave’, mysql> MASTER_PASSWORD=’slave’, mysql> MASTER_PORT=3306, mysql> MASTER_LOG_FILE=’binlog.000003’, mysql> MASTER_LOG_POS=868;

开启主从同步

mysql> start slave;

再查看主从同步状态

mysql> show slave status;

  1. 这里只要看到两个参数 `Slave_IO_Running` `Slave_SQL_Running` 都为 **true** **Error** 字段都为空则主从集群正常工作。
  2. ### 建库
  3. 在主数据库创建 Rainbond 部署所需的数据库,查看从服务器是否同步更新了数据
  4. - 在主库创建库

mysql> create database console; mysql> create database region;

  1. - 在从库查看

mysql> show databases; +——————————+ | Database | +——————————+ | information_schema | | console | | mysql | | performance_schema | | region | | sys | +——————————+ 5 rows in set (0.00 sec)

  1. 数据同步成功,则主从复制部署完成
  2. ## 在 Centos 7 中部署 MySQL 主从集群
  3. ### 通过 YUM 安装 MySQL
  4. 在主从服务器中均需要执行
  5. #### 下载 rpm 包

wget http://repo.mysql.com/mysql80-community-release-el7-1.noarch.rpm rpm -ivh mysql80-community-release-el7-1.noarch.rpm

  1. #### 卸载 mariadb

rpm -qa|grep mariadb rpm -e mariadb-libs-5.5.65-1.el7.x86_64 —nodeps

  1. #### 安装 MySQL

yum -y install mysql-server

  1. ##### ![](/projects/rainbond-5.14-zh/2784761944588797d2499f21c74860ca.svg)danger
  2. 如果出现 `mysql-community-client-8.0.28-1.el7.x86_64.rpm` 的公钥尚未安装,在安装之前执行 `rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022`
  3. #### 启动 MySQL

systemctl restart mysqld systemctl enable mysqld

  1. #### 获取 MySQL 密码并修改和配置远程访问

获取密码

grep “A temporary password is generated for root@localhost” /var/log/mysqld.log

登录数据库

mysql -u root -p

修改密码

alter user ‘root’@’localhost’ identified by ‘Root123456!’;

开启远程访问

update mysql.user set host = ‘%’ where user = ‘root’; alter user ‘root’@’%’ identified by ‘Root123456!’ password expire never; alter user ‘root’@’%’ identified with mysql_native_password by ‘Root123456!’; flush privileges;

  1. ### 主从数据库配置文件
  2. #### 修改主和从节点配置文件
  3. 主数据库配置文件
  4. vim /etc/my.cnf

character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci character_set_server=utf8mb4 collation_server=utf8mb4_unicode_ci

默认存储引擎

default-storage-engine=INNODB

# Compatible with versions before 8.0

default_authentication_plugin=mysql_native_password skip-host-cache skip-name-resolve

主从配置

log-bin=binlog server-id=1 gtid-mode=on enforce-gtid-consistency=on log-slave-updates=on

[client]

设置客户端编码

default-character-set=utf8mb4 [mysql]

设置mysql客户端默认编码

default-character-set=utf8mb4

  1. vim /etc/my.cnf

修改为utf8编码

character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci character_set_server=utf8mb4 collation_server=utf8mb4_unicode_ci

默认存储引擎

default-storage-engine=INNODB

Compatible with versions before 8.0

default_authentication_plugin=mysql_native_password skip-host-cache skip-name-resolve

主从配置

server-id=2 gtid-mode=on enforce-gtid-consistency=on log-slave-updates=on

[client]

设置客户端编码

default-character-set=utf8mb4 [mysql]

设置mysql客户端默认编码

default-character-set=utf8mb4

  1. 重启主和从数据库

systemctl restart mysqld

  1. ### 配置主从复制
  2. #### 在主节点创建slave账号

CREATE USER ‘slave’@’%’ IDENTIFIED WITH mysql_native_password BY ‘slave’; GRANT REPLICATION SLAVE ON . TO ‘slave’@’%’; flush privileges;

  1. #### 获取主节点当前 binlog 和 position

SHOW MASTER STATUS; +———————-+—————+———————+—————————+—————————————————————+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +———————-+—————+———————+—————————+—————————————————————+ | binlog.000003 | 868 | | | 1b009ef8-a67f-11ea-8c9a-0242ac110002:1-8 | +———————-+—————+———————+—————————+—————————————————————+

  1. #### 配置从节点连接主节点

mysql> CHANGE MASTER TO mysql> MASTER_HOST=’192.168.0.10’, mysql> MASTER_USER=’slave’, mysql> MASTER_PASSWORD=’slave’, mysql> MASTER_PORT=3306, mysql> MASTER_LOG_FILE=’binlog.000003’, mysql> MASTER_LOG_POS=868;

启动从节点

mysql> start slave;

再查看主从同步状态

mysql> show slave status;

  1. 这里只要看到两个参数 `Slave_IO_Running` `Slave_SQL_Running` 都为 **true** **Error** 字段都为空则主从集群正常工作。
  2. ### 建库
  3. 在主数据库创建 Rainbond 部署所需的数据库,查看从服务器是否同步更新了数据
  4. - 在主库创建库

mysql> create database console; mysql> create database region;

  1. - 在从库查看

mysql> show databases; +——————————+ | Database | +——————————+ | information_schema | | console | | mysql | | performance_schema | | region | | sys | +——————————+ 5 rows in set (0.00 sec) ```

数据同步成功,则主从复制部署完成