安装

创建目录和配置文件

  1. mkdir -p mysql/config \
  2. && touch mysql/config/my.cnf \
  3. && touch mysql/docker-compose.yml

编辑配置文件

config/my.cnf

  1. [mysqld]
  2. # 解决docker启动连接慢的问题
  3. skip-name-resolve
  4. server-id=1
  5. port=3306
  6. default-storage-engine=INNODB
  7. character_set_server=utf8
  8. init_connect='SET NAMES utf8'
  9. lower_case_table_names=1
  10. max_connections=200
  11. max_connect_errors=10
  12. # 开启二进制日志
  13. log-bin=mysql-bin
  14. log_bin-index=mysql-bin.index
  15. log_bin_trust_function_creators=ON
  16. binlog-format=ROW
  17. # 设置自增起始偏移量
  18. auto_increment_offset=1
  19. # 设置自增步长
  20. auto_increment_increment=1
  21. # 开启慢查询日志
  22. slow_query_log=ON
  23. # 设置慢查询时间阈值
  24. long_query_time=1
  25. # 设置慢查询日志文件位置
  26. slow_query_log_file=/var/lib/mysql/slow_query.log

docker-compose.yml

  1. version: '3'
  2. services:
  3. mysql:
  4. image: mysql:8.0.21
  5. container_name: mysql
  6. ports:
  7. - 3306:3306
  8. privileged: true
  9. volumes:
  10. - ./config:/etc/mysql/conf.d
  11. - ./data:/var/lib/mysql
  12. - ./logs:/var/log/mysql
  13. environment:
  14. - MYSQL_ROOT_PASSWORD=root
  15. - MYSQL_USER=admin
  16. - MYSQL_PASSWORD=admin
  17. - TZ=Asia/Shanghai
  18. networks:
  19. default:
  20. external:
  21. name: service_network

启动服务

  1. docker-compose up -d

慢查询

  1. -- 查看慢查询日志是否开启
  2. show variables like '%slow_query_log%';
  3. set global slow_query_log=on;
  4. set global slow_query_log=off;
  5. -- 查看慢查询阈值
  6. show variables like '%long_query_time%';
  7. -- 查看没有使用索引的慢查询日志是否开启
  8. show variables like '%log_queries_not_using_indexes%';
  9. set global log_queries_not_using_indexes=on;
  10. set global log_queries_not_using_indexes=off;
  11. -- 查看慢查询日志使用说明来记录
  12. show variables like '%log_output%';
  13. set global log_output='file';
  14. set global log_output='table'

数据库架构

主从架构

缺点

  • master不能停机,停机就不能接收写请求
  • slave过多会出现延迟

Mysql环境搭建-单机 - 图1
数据同步原理
Mysql环境搭建-单机 - 图2

双主架构


可以配合一个第三方的工具,比如keepalived轻松做到IP的漂移,停机维护也不会影响写操作

Mysql环境搭建-单机 - 图3

级联架构


缺点

  • slave延迟更加大了

Mysql环境搭建-单机 - 图4

双主 + 级联


Mysql环境搭建-单机 - 图5

Keepalived

安装

  1. # 安装
  2. yum install keepalived ipvsadm -y
  3. # 查看配置文件位置
  4. rpm -qc keepalived

编辑配置文件

修改 /etc/keepalived/keepalived.conf 配置文件

master节点配置

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id mysql
  4. }
  5. vrrp_instance VI_1 {
  6. state BACKUP # 两个节点都为BACKUP状态,根据优先级大小判断谁为MASTER
  7. interface enp0s3
  8. virtual_router_id 51
  9. priority 100
  10. advert_int 1
  11. nopreempt # 非抢占模式
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. # 虚拟IP池
  17. virtual_ipaddress {
  18. 192.168.101.125
  19. }
  20. }
  21. virtual_server 192.168.101.125 3306 {
  22. delay_loop 2
  23. lb_algo wrr
  24. lb_kind DR
  25. persistence_timeout 60
  26. protocol TCP
  27. real_server 192.168.101.11 3306 {
  28. weight 3
  29. notify_down /etc/keepalived/shutdown.sh # 当服务down了之后执行的脚本
  30. TCP_CHECK {
  31. connect_timeout 10 # 连接超时时长(秒)
  32. nb_get_retry 3 # 重试次数
  33. delay_before_retry 3 # 每隔3秒检测一服务是否可用
  34. connect_port 3306
  35. }
  36. }
  37. }

slave节点配置

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id mysql
  4. }
  5. vrrp_instance VI_1 {
  6. state BACKUP # 两个节点都为BACKUP状态,根据优先级大小判断谁为MASTER
  7. interface enp0s3
  8. virtual_router_id 51
  9. priority 90
  10. advert_int 1
  11. nopreempt # 非抢占模式
  12. authentication {
  13. auth_type PASS
  14. auth_pass 1111
  15. }
  16. # 虚拟IP池
  17. virtual_ipaddress {
  18. 192.168.101.125
  19. }
  20. }
  21. virtual_server 192.168.101.125 3306 {
  22. delay_loop 2
  23. lb_algo wrr
  24. lb_kind DR
  25. persistence_timeout 60
  26. protocol TCP
  27. real_server 192.168.101.12 3306 {
  28. weight 3
  29. notify_down /etc/keepalived/shutdown.sh # 当服务down了之后执行的脚本
  30. TCP_CHECK {
  31. connect_timeout 10 # 连接超时时长(秒)
  32. nb_get_retry 3 # 重试次数
  33. delay_before_retry 3 # 每隔3秒检测一服务是否可用
  34. connect_port 3306
  35. }
  36. }
  37. }

notify_down脚本

/etc/keepalived目录下编写shutdown.sh脚本

  1. #!/bin/sh
  2. pkill keepalived

为脚本增加权限

  1. chmod 755 /etc/keepalived/shutdown.sh

启动keepalived

  1. systemctl start keepalived

踩过的坑

在设置虚拟IP之前,先ping一下该虚拟IP,确保该IP没有被使用。

HAProxy

分库分表

概念

互联网时代谈论最多的话题就是拆分。拆分一般分为水平拆分和垂直拆分,这并不单指对数据库或者缓存的拆分,主要是表达一种分而治之的思想和逻辑

水平拆分

水平拆分是指由于单一节点无法满足需求,需要扩展为多个节点,多个节点具有一致的功能,组成一个服务池,一个节点服务一部分请求量,所有节点共同处理大规模高并发的请求量

垂直拆分

垂直拆分是指按照功能进行拆分,秉着专业的人干专业的事的原则,把一个复杂的功能拆分为多个单一、简单的功能,不同单一简单功能组合在一起,和未拆分前完成的功能是一样的。由于每个功能职责单一、简单,使得维护和变更都变得更简单、容易、安全

三大问题

跨库关联
分布式事务
分页查询