目录

  • 前言
  • 一、MySQL 集群原理
    • 1. MySQL-MMM
    • 2. MHA
    • 3. InnoDB Cluster
  • 二、Docker 安装模拟 MySQL 主从复制集群
    • 1. 创建 Master 实例
    • 2. 创建 Slave 实例并启动
    • 3. 为 master 授权用户来他的同步数据
    • 4. 配置 slaver 同步 master 数据
  • 三、分库分表
    • 1. 下载安装 Sharding-Proxy
    • 2. 配置数据分片+读写分离
    • 3. 创建测试表
    • 4. k8s 有状态服务部署

前言

集群目标

  • 高可用(High Availability) :是当一台服务器停止服务后,对于业务及用户毫无影响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。

  • 突破数据量限制:一台服务器不能储存大量数据,需要多台分担,每个存储一部分, 共同存储完整个集群数据。最好能做到互相备份,即使单节点故障,也能在其他节点 找到数据。

  • 数据备份容灾:单点故障后,存储的数据仍然可以在别的地方拉起。

  • 压力分担:由于多个服务器都能完成各自一部分工作,所以尽量的避免了单点压力的存在

集群基础形式


一、MySQL 集群原理


以上可以作为企业中常用的数据库解决方案:

1. MySQL-MMM

MySQL-MMM 是 Master-Master Replication Manager for MySQL (mysql 主主复制管理器) 的简称,是 Google 的开源项目 (Perl 脚本) 。MMM 基于 MySQL Replication 做的扩展架构,主要用来监控 mysql 主主复制并做失败转移。

其原理是将真实数据库节点的 IP (RIP) 映射为虚拟 IP (VIP) 集。mysql-mmm 的监管端会提供多个虚拟 IP (VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 mysql 之上,当某一台 mysql 宕机时,监管会将 VIP 迁移至其他 mysql。

在整个监管过程中,需要在 mysql 中添加相关授权用户,以便让 mysql 可以支持监理机的维护。授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户,如果想使用 mmm 的备份工具则还要添加一个mmm_tools 用户。

2. MHA

MHA (Master High Availability) 目前在 MySQL 高可用方面是一个相对成熟的解决方案, 由日本 DeNA 公司 youshimaton (现就职于 Facebook 公司) 开发,是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作 (以2019 年的眼光来说太慢了),并且在进行故障切换的过程中,MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

3. InnoDB Cluster

InnoDB Cluster 支持自动 Failover、强一致性、读写分离、读库高可用、读请求负载均衡,横向扩展的特性,是比较完备的一套方案。但是部署起来复杂,想要解决 router 单点问题好需要新增组件,如没有其他更好的方案可考虑该方案。

InnoDB Cluster 主要由 MySQL Shell、MySQL Router 和 MySQL 服务器集群组成,三者协同工作,共同为 MySQL 提供完整的高可用性解决方案。MySQL Shell 对管理人员提供管理接口,可以很方便的对集群进行配置和管理,MySQL Router 可以根据部署的集群状况自动的初始化,是客户端连接实例。

如果有节点 down 机,集群会自动更新配置。集群包含单点写入和多点写入两种模式。在单主模式下,如果主节点 down 掉,从节点自动替换上来,MySQL Router 会自动探测,并将客户端连接到新节点。

二、Docker 安装模拟 MySQL 主从复制集群

1. 创建 Master 实例

A、下载 mysql 镜像

sudo docker pull mysql:5.7

B、创建 Master 实例并启动

docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql/master/log:/var/log/mysql \
-v /mydata/mysql/master/data:/var/lib/mysql \
-v /mydata/mysql/master/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
参数 说明
-p 3307:3306 将容器的 3306 端口映射到主机的 3307 端口
-v /mydata/mysql/master/conf:/etc/mysql 将配置文件夹挂在到主机
-v /mydata/mysql/master/log:/var/log/mysql 将日志文件夹挂载到主机-
v /mydata/mysql/master/data:/var/lib/mysql/ 将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root 初始化 root 用户的密码

C、修改 master 基本配置

vim /mydata/mysql/master/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

注意:skip-name-resolve 一定要加,不然连接 mysql 会超级慢

D、添加 master 主从复制部分配置

server_id=1
log-bin=mysql-bin
read-only=0
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

重启 master

2. 创建 Slave 实例并启动

A、启动 Slave 实例

docker run -p 3317:3306 --name mysql-slaver-01 \
-v /mydata/mysql/slaver/log:/var/log/mysql \
-v /mydata/mysql/slaver/data:/var/lib/mysql \
-v /mydata/mysql/slaver/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \ -d mysql:5.7

B、修改 slave 基本配置

vim /mydata/mysql/slaver/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve

C、添加 master 主从复制部分配置

server_id=2
log-bin=mysql-bin
read-only=1
binlog-do-db=gulimall_ums
binlog-do-db=gulimall_pms
binlog-do-db=gulimall_oms
binlog-do-db=gulimall_sms
binlog-do-db=gulimall_wms
binlog-do-db=gulimall_admin
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

重启 slaver

3. 为 master 授权用户来他的同步数据

A、进入 master 容器

docker exec -it mysql /bin/bash

B、进入 mysql 内部 (mysql –uroot -p)

授权 root 可以远程访问 (主从无关,为了方便我们远程连接mysql)

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

添加用来同步的用户

GRANT REPLICATION SLAVE ON *.* to 'backup'@'%' identified by '123456';

查看 master 状态

show master status\G;

4. 配置 slaver 同步 master 数据

A、进入 slaver 容器

docker exec -it mysql-slaver-01 /bin/bash

B、进入 mysql 内部 (mysql –uroot -p)

授权 root 可以远程访问 (主从无关,为了方便我们远程连接mysql)

grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;

设置主库连接

change master to master_host='mysql-master.gulimall', master_user='backup',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=0,master_port=3306;

启动从库同步

start slave;

查看从库状态

show slave status\G;


至此主从配置完成。

总结:

  • 主从数据库在自己配置文件中声明需要同步哪个数据库,忽略哪个数据库等信息。
    并且 server-id 不能一样。
  • 主库授权某个账号密码来同步自己的数据。
  • 从库使用这个账号密码连接主库来同步数据。

三、分库分表

我们用 MyCat 或者 ShardingSphere 来做分库分表

shardingSphere: http://shardingsphere.apache.org/index_zh.html

  • auto_increment_offset:1 从几开始增长
  • auto_increment_increment:2 每次的步长

1. 下载安装 Sharding-Proxy

镜像方式

docker pull apache/sharding-proxy
docker run -d -v /mydata/sharding-proxy/conf:/opt/sharding-proxy/conf -v/mydata/sharding-proxy/lib:/opt/sharding-proxy/lib --env PORT=3308 -p13308:3308apache/sharding-proxy:latest

压缩包下载

https://shardingsphere.apache.org/document/current/cn/downloads/

2. 配置数据分片+读写分离

config-mallshard.yaml

schemaName: sharding_db
dataSources:ds0:url: jdbc:mysql://192.168.56.10:3307/ds0username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 65ds0_slave0:url: jdbc:mysql://192.168.56.10:3317/ds0username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 65ds1:url: jdbc:mysql://192.168.56.10:3307/ds1username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 65ds1_slave0:url: jdbc:mysql://192.168.56.10:3317/ds1username: rootpassword: rootconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 65
shardingRule:tables:t_order:actualDataNodes: ds${0..1}.t_order${0..1}databaseStrategy:inline:shardingColumn: user_idalgorithmExpression: ds${user_id % 2}tableStrategy:inline:shardingColumn: order_idalgorithmExpression: t_order${order_id % 2}keyGenerator:type: SNOWFLAKEcolumn: order_idt_order_item:actualDataNodes: ds${0..1}.t_order_item${0..1}databaseStrategy:inline:shardingColumn: user_idalgorithmExpression: ds${user_id % 2}tableStrategy:inline:shardingColumn: order_idalgorithmExpression: t_order_item${order_id % 2}keyGenerator:type: SNOWFLAKEcolumn: order_item_idbindingTables: - t_order,t_order_itembroadcastTables: - t_configdefaultDataSourceName: ds0defaultTableStrategy:none:masterSlaveRules:ms_ds0:masterDataSourceName: ds0slaveDataSourceNames: - ds0_slave0loadBalanceAlgorithmType: ROUND_ROBINms_ds1:masterDataSourceName: ds1slaveDataSourceNames: - ds1_slave0loadBalanceAlgorithmType: ROUND_ROBIN

3. 创建测试表

CREATE TABLE `t_order` (`order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `status` varchar(50) COLLATE utf8_bin   DEFAULT NULL, PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TABLE `t_order_item` (`order_item_id` bigint(20) NOT NULL, `order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `content` varchar(255) COLLATE utf8_bin  DEFAULT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

4. k8s 有状态服务部署

可以使用 kubesphere,快速搭建 MySQL 环境。

  • 有状态服务抽取配置为 ConfigMap
  • 有状态服务必须使用 pvc 持久化数据
  • 服务集群内访问使用 DNS 提供的稳定域名

谷粒商城 集群篇 (六) --------- MySQL 集群相关推荐

  1. 谷粒商城电商项目 高可用集群篇

    更多视频,JAVA收徒 QQ:987115885谷粒商城电商项目 高可用集群篇339.k8s-简介.mp4340.k8s-架构原理&核心概念.mp4341.k8s-集群搭建-环境准备.mp43 ...

  2. 谷粒商城-分布式高级篇【业务编写】

    谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...

  3. 谷粒商城--认证中心--高级篇笔记八

    谷粒商城–认证中心–高级篇笔记八 1. 环境搭建 1.1 新建模块gulimall-auth-server 1.2 pom文件 上面没选好直接复制下面的pom文件,记得排除gulimall-commo ...

  4. 谷粒商城-分布式高级篇[商城业务-检索服务]

    谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...

  5. 谷粒商城三阶段课件_谷粒商城分布式基础篇一

    微服务架构图 微服务划分图 搭建虚拟开发环境 1.下载安装VirtualBox 下载安装Vagrant 2.安装好后,创建一个存放vagrant box的目录,方便日后统一管理,比如叫做../cent ...

  6. 谷粒商城-分布式基础篇-环境搭建

    1.写在前面 既个人博客系统和Java虚拟机学习后,深感技术点过于零散,于是照着尚硅谷教程写了谷粒商城这个项目.谷粒商城是一个完整的大型分布式架构电商平台,这个项目将我目前学到的知识点,以及还未学到的 ...

  7. 谷粒商城-分布式高级篇[商城业务-秒杀服务]

    谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...

  8. 谷粒商城--分布式基础篇2

    谷粒商城–分布式基础篇2(前端基础) 目录 谷粒商城--分布式基础篇2(前端基础) 5 前端 5.1 ES6 5.1.1 简介 5.1.2 什么是ECMAStript 5.1.3 ES6 新特性 5. ...

  9. 谷粒商城分布式高级篇(中)

    谷粒商城分布式基础篇 谷粒商城分布式高级篇(上) 谷粒商城分布式高级篇(中) 谷粒商城分布式高级篇(下) 文章目录 商城业务 异步 异步复习 线程池详解 CompletableFuture Compl ...

最新文章

  1. mysql去除字符串首的非字母_如何从SQLServer中的字符串中删除所有非字母字符?...
  2. oracle表没被锁删不掉,ORACLE查看表被锁和删除锁
  3. 如何通过netstat命令判断是否遭受Dos功击?遭到DDoS该如何缓解?
  4. 【loj#6220】sum
  5. 织梦在线报名平台php,DedeCMSv5
  6. 在 windows 下使用 Xming+Putty 显示 Linux 下软件图形界面
  7. OllyDbg笔记-修改Messagebox的标题
  8. c语言超市账务管理源代码,C语言 超市管理系统源程序.doc
  9. java基础类的继承_JAVA核心技术I---JAVA基础知识(类的继承)
  10. 【ZOJ 3715 —— 13年浙江省赛K】Kindergarten Election 【枚举答案进行判断】 【夺宝奇兵 —— CCPC-Wannafly Winter Camp Day1】
  11. 认知的四个层次,读懂改变一生
  12. 坦白说php源码,qq坦白说新思路解密 附源码
  13. UIWebView的使用---safri
  14. python画菱形的代码_python绘制菱形
  15. 我们很高兴地宣布我们正在与 OKC 整合
  16. 我的第一篇博客--成长的第一站
  17. 如何获取股票交易接口
  18. 5-6 uniapp 图片压缩
  19. Unity向量投影使用
  20. linux小红帽如何封闭端口,安装红帽子Linux的几点注意

热门文章

  1. regsvr32.exe使用详解
  2. RET RETF IRET IRETD 指令的不同
  3. 计算机操作与规范,电脑操作基本知识(精华版)
  4. STM32彩灯控制器
  5. synergy使用方法和安装包
  6. NGINX根据客户端真实ip限制/referer限制
  7. excel数字排序1后面是2而不是10
  8. 国内用户访问国内服务器,国外用户访问国外服务器
  9. Simulink 学习(一)
  10. 介绍国内外CMS系统