0


00后的一套高可用,惊艳了面试官,当场开了20万年薪

  1. 作者:IT邦德
  2. 中国DBA联盟(ACDU)成员,目前从事DBA及程序编程
  3. Web\java\Python)工作,主要服务于生产制造
  4. 现拥有 Oracle 11g OCP/OCM
  5. MysqlOceanbaseOBCA)认证
  6. 分布式TBase\TDSQL数据库、国产达梦数据库以及红帽子认证
  7. 从业10年以上DBA工作,在数据库领域有丰富的经验
  8. 擅长主流数据OracleMySQLPG 运维开发,
  9. 备份恢复,安装迁移,性能优化、故障应急处理等。

文章目录

前言

本文详细阐述了MySQL1主2从实现读写分离&负载均衡的高可用搭建

一、MySQL Router

1.1 介绍

  1. MySQL Router 的主要用途是读写分离,主主故障自动切换,负载均衡,连接池等。
  2. MySQL Router 最早是作为 MySQL-Proxy 的替代方案出现的。
  3. 作为一个轻量级中间件,MySQL Router 可在应用程序和后端
  4. MySQL 服务器之间提供透明路由和负载均衡,
  5. 从而有效提高 MySQL 数据库服务的高可用性与可伸缩行。
  6. MySQL 强烈建议使用 Router 8 MySQL Server 8 5.7 一起使用。
  7. MySQL Router MySQL 官方提供的一个轻量级中间件,
  8. 可以在应用程序与 MySQL 服务器之间提供透明的路由方式。
  9. 主要用以解决 MySQL 主从库集群的高可用、负载均衡、易扩展等问题。
  10. Router 可以与 MySQL Fabric 无缝连接,允许 Fabric 存储
  11. 和管理用于路由的高可用数据库服务器组,使管理 MySQL 服务器组更加简单。
  12. MySQL Router 是一个可执行文件,可以与应用程序在同一平台上运行,也可以单独部署。
  13. 虽然 MySQL Router InnoDB
  14. ClusterMySQL 7.X)的一部分,
  15. MySQL 5.6 等版本数据库仍然可以使用 Router 作为其中间代理层。MySQL Router 的配
  16. 置文件中包含有关如何执行路由的信息。
  17. 它与 MySQL 服务器的配置文件类似,
  18. 也是由多个段组成,每个段中包含相关配置选项。

在这里插入图片描述

1.2 下载

  1. 各种安装包的下载地址为:
  2. https://dev.mysql.com/downloads/router/

在这里插入图片描述

1.3 1主2从框架

在这里插入图片描述

二、搭建1主2从

Docker安装部署请参考博客:Docker入门

  1. [root@centos7 ~]# docker images
  2. [root@centos7 ~]# docker pull mysql:5.7.30
  3. [root@centos7 ~]# docker network create --subnet=172.72.0.0/24 mysql-network
  4. [root@centos7 ~]# docker network ls

在这里插入图片描述

  1. [root@centos7 ~]# mkdir -p /mysqltest1/master/conf.d
  2. [root@centos7 ~]# mkdir -p /mysqltest1/slave1/conf.d
  3. [root@centos7 ~]# mkdir -p /mysqltest1/slave2/conf.d

2.1 初始化容器

  1. docker run -d --name MSS5730M33062 \
  2. -h master -p 33062:3306 --net=mysql-network --ip 172.72.0.2 \
  3. -v /mysqltest1/master/conf.d:/etc/mysql/conf.d \
  4. -e MYSQL_ROOT_PASSWORD=root \
  5. mysql:5.7.30
  6. [root@centos7 ~]# docker update --restart=always MSS5730M33062
  7. docker run -d --name MSS5730M33063 \
  8. -h slave1 -p 33063:3306 --net=mysql-network --ip 172.72.0.3 \
  9. -v /mysqltest1/slave1/conf.d:/etc/mysql/conf.d \
  10. -e MYSQL_ROOT_PASSWORD=root \
  11. mysql:5.7.30
  12. [root@centos7 ~]# docker update --restart=always MSS5730M33063
  13. docker run -d --name MSS5730M33064 \
  14. -h slave2 -p 33064:3306 --net=mysql-network --ip 172.72.0.4 \
  15. -v /mysqltest1/slave2/conf.d:/etc/mysql/conf.d \
  16. -e MYSQL_ROOT_PASSWORD=root \
  17. mysql:5.7.30
  18. [root@centos7 ~]# docker update --restart=always MSS5730M33064

2.2 配置参数

  1. cat > /mysqltest1/master/conf.d/my.cnf <<"EOF"
  2. [mysqld]
  3. port=3306
  4. character_set_server=utf8mb4
  5. secure_file_priv=
  6. server-id = 573033062
  7. log-bin =
  8. binlog_format=row
  9. binlog-ignore-db = mysql
  10. binlog-ignore-db = information_schema
  11. binlog-ignore-db = performance_schema
  12. binlog-ignore-db = sys
  13. skip-name-resolve
  14. gtid-mode=ON
  15. enforce-gtid-consistency=on
  16. report_host=172.72.0.2
  17. EOF
  18. cat > /mysqltest1/slave1/conf.d/my.cnf <<"EOF"
  19. [mysqld]
  20. port=3306
  21. character_set_server=utf8mb4
  22. secure_file_priv=
  23. server-id = 573033063
  24. log-bin =
  25. binlog_format=row
  26. replicate_ignore_db=information_schema
  27. replicate_ignore_db=performance_schema
  28. replicate_ignore_db=mysql
  29. replicate_ignore_db=sys
  30. gtid-mode=ON
  31. enforce-gtid-consistency=ON
  32. skip_name_resolve
  33. report_host=172.72.0.3
  34. EOF
  35. cat > /mysqltest1/slave2/conf.d/my.cnf <<"EOF"
  36. [mysqld]
  37. user=mysql
  38. port=3306
  39. character_set_server=utf8mb4
  40. secure_file_priv=
  41. server-id = 573033064
  42. log-bin =
  43. binlog_format=row
  44. replicate_ignore_db=information_schema
  45. replicate_ignore_db=performance_schema
  46. replicate_ignore_db=mysql
  47. replicate_ignore_db=sys
  48. gtid-mode=ON
  49. enforce-gtid-consistency=ON
  50. skip_name_resolve
  51. report_host=172.72.0.4
  52. EOF

2.3 重启容器

  1. [root@centos7 ~]# docker restart MSS5730M33062
  2. [root@centos7 ~]# docker restart MSS5730M33063
  3. [root@centos7 ~]# docker restart MSS5730M33064
  4. [root@centos7 ~]# docker ps
  5. [root@centos7 ~]# docker exec -it MSS5730M33062 bash
  6. root@master:/# mysql -uroot -proot
  7. #CMD登陆查看
  8. mysql -uroot -proot -h192.168.1.54 -P33062 -e "select @@hostname,@@server_id,@@server_uuid"
  9. mysql -uroot -proot -h192.168.1.54 -P33063 -e "select @@hostname,@@server_id,@@server_uuid"
  10. mysql -uroot -proot -h192.168.1.54 -P33064 -e "select @@hostname,@@server_id,@@server_uuid"

在这里插入图片描述

2.4 主库创建用户

  1. mysql -uroot -proot -h192.168.1.54 -P33062
  2. grant replication slave on *.* to repl@'%' identified by 'jeames';
  3. select user,host,grant_priv,password_last_changed,authentication_string from mysql.user;

在这里插入图片描述

  1. mysql> create database jeamesdb;
  2. mysql> use jeamesdb
  3. mysql> create table mytb1(id int,name varchar(30));
  4. mysql> insert into mytb1 values(1,'a'),(2,'b');
  5. mysql> show variables like '%log_bin%';

在这里插入图片描述

  1. #主库导出时不能加--set-gtid-purged=off 参数
  2. mysqldump -uroot -proot -h172.72.0.2 -P3306 --single-transaction \
  3. --hex-blob --routines --events --triggers \
  4. --master-data=2 --databases jeamesdb \
  5. --default-character-set=utf8 --max_allowed_packet=512M > /tmp/salve.sql
  6. mysql> select @@hostname,@@server_id,@@server_uuid;

在这里插入图片描述

三、搭建从库

  1. --S1
  2. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.3 -P3306 < /tmp/salve.sql
  3. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.3 -P3306
  4. change master to
  5. master_host='172.72.0.2',
  6. master_port=3306,
  7. master_user='repl',
  8. master_password='jeames',
  9. master_auto_position=1;
  10. mysql> start slave;
  11. mysql> show slave status \G;
  12. 主库:mysql> insert into mytb1 values(3,'c'),(4,'d');
  13. 从库:mysql> show slave status \G;
  14. 从库:mysql> SELECT * FROM jeamesdb.mytb1;
  15. 注意:此处如果报错,则通过以下方法处理

在这里插入图片描述

  1. 以上报错显示密码错误,修改密码重新执行即可
  2. mysql> stop slave;
  3. mysql> start slave;

在这里插入图片描述

  1. 注:以上方法适合binlog日志不存在可以通过这个方法同步
  2. --S2
  3. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.4 -P3306
  4. change master to master_host='172.72.0.2',
  5. master_port=3306,
  6. master_user='repl',
  7. master_password='jeames',
  8. master_auto_position=1;
  9. mysql> start slave;
  10. mysql> show slave status \G;
  11. mysql> SELECT * FROM jeamesdb.mytb1;
  12. 注:以上方法是通过binlog日志同步
  13. 确认主库状态:
  14. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.2 -P3306
  15. mysql> show slave hosts;

在这里插入图片描述

  1. 确认备库状态:
  2. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.4 -P3306
  3. mysql> show slave statuS \G

四、搭建 MySQL Router

  1. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.2 -P3306 主库
  2. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.3 -P3306 从库1
  3. [root@centos7 ~]# mysql -uroot -proot -h172.72.0.4 -P3306 从库2

4.1 初始化容器

  1. docker run -d --name MysqlRouter \
  2. -h MysqlRouter \
  3. --net=mysql-network --ip 172.72.0.7 --privileged=true \
  4. -p 7001-7005:7001-7005 -p 2271:22 \
  5. techerwang/oracle:centos76 init
  6. [root@centos7 ~]# docker update --restart=always MysqlRouter
  7. [root@centos7 ~]# docker exec -it MysqlRouter bash
  8. [root@MysqlRouter /]# ifconfig

在这里插入图片描述

4.2 安装router

  1. [root@centos7 ~]# docker cp mysql-router-community-8.0.23-1.el7.x86_64.rpm MysqlRouter:/
  2. [root@centos7 ~]# docker exec -it MysqlRouter bash
  3. [root@MysqlRouter /]# rpm -ivh mysql-router-community-8.0.23-1.el7.x86_64.rpm

在这里插入图片描述

  1. mysqlrouter --version
  2. mysqlrouter --help

4.3 相关配置

  1. [root@MysqlRouter /]# mkdir -p /var/log/mysql-router
  2. [root@MysqlRouter /]# mkdir -p /etc/mysql-router/
  3. [root@MysqlRouter /]# cat /etc/passwd 查看是否有mysql用户
  4. [root@MysqlRouter /]# useradd mysql
  5. [root@MysqlRouter /]# chown mysql:mysql /var/log/mysql-router
  6. cat > /etc/mysql-router/mysqlrouter.conf <<"EOF"
  7. [DEFAULT]
  8. logging_folder = /var/log/mysql-route
  9. [logger]
  10. level = INFO
  11. [routing:secondary]
  12. bind_address = 172.72.0.7
  13. bind_port = 7001
  14. destinations = 172.72.0.3:3306,172.72.0.4:3306
  15. routing_strategy = round-robin
  16. [routing:primary]
  17. bind_address = 172.72.0.7
  18. bind_port = 7002
  19. destinations = 172.72.0.2:3306
  20. routing_strategy = next-available
  21. EOF
  22. 注:round-robin代表一种轮训算法

4.4 启动

在这里插入图片描述

4.5 测试

  1. #测试读负载均衡(7001端口)
  2. [root@centos7 ~]# for i in $(seq 1 10); do mysql -uroot -proot -h172.72.0.7 -P7001 -e 'select @@server_id;'; done | egrep '[0-9]'

在这里插入图片描述

  1. #测试写(7002端口)
  2. for i in $(seq 1 10); do mysql -uroot -proot -h172.72.0.7 -P7002 -e 'select @@server_id;'; done | egrep '[0-9]'

在这里插入图片描述

4.6 从库设置为只读

  1. mysql> set global read_only=1;
  2. # set global read_only=0 为取消普通账号的只读模式
  3. # set global read_only=1 对拥有super权限的账号是不生效的,所以在授权账号的时候尽量避免添加super权限
  4. 从库1设置
  5. mysql> grant all on *.* to repl@'%' identified by 'jeames' with grant option;
  6. mysql> flush privileges;
  7. mysql> update mysql.user set grant_priv='N',super_priv='N' where user='repl';
  8. mysql> select user,host,grant_priv,super_priv,authentication_string,password_last_changed from mysql.user;

在这里插入图片描述在这里插入图片描述
大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻


本文转载自: https://blog.csdn.net/weixin_41645135/article/details/122262184
版权归原作者 IT邦德 所有, 如有侵权,请联系我们删除。

“00后的一套高可用,惊艳了面试官,当场开了20万年薪”的评论:

还没有评论