谷粒商城 集群篇 (六) --------- MySQL 集群
目录
- 前言
- 一、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 集群相关推荐
- 谷粒商城电商项目 高可用集群篇
更多视频,JAVA收徒 QQ:987115885谷粒商城电商项目 高可用集群篇339.k8s-简介.mp4340.k8s-架构原理&核心概念.mp4341.k8s-集群搭建-环境准备.mp43 ...
- 谷粒商城-分布式高级篇【业务编写】
谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...
- 谷粒商城--认证中心--高级篇笔记八
谷粒商城–认证中心–高级篇笔记八 1. 环境搭建 1.1 新建模块gulimall-auth-server 1.2 pom文件 上面没选好直接复制下面的pom文件,记得排除gulimall-commo ...
- 谷粒商城-分布式高级篇[商城业务-检索服务]
谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...
- 谷粒商城三阶段课件_谷粒商城分布式基础篇一
微服务架构图 微服务划分图 搭建虚拟开发环境 1.下载安装VirtualBox 下载安装Vagrant 2.安装好后,创建一个存放vagrant box的目录,方便日后统一管理,比如叫做../cent ...
- 谷粒商城-分布式基础篇-环境搭建
1.写在前面 既个人博客系统和Java虚拟机学习后,深感技术点过于零散,于是照着尚硅谷教程写了谷粒商城这个项目.谷粒商城是一个完整的大型分布式架构电商平台,这个项目将我目前学到的知识点,以及还未学到的 ...
- 谷粒商城-分布式高级篇[商城业务-秒杀服务]
谷粒商城-分布式基础篇[环境准备] 谷粒商城-分布式基础[业务编写] 谷粒商城-分布式高级篇[业务编写]持续更新 谷粒商城-分布式高级篇-ElasticSearch 谷粒商城-分布式高级篇-分布式锁与 ...
- 谷粒商城--分布式基础篇2
谷粒商城–分布式基础篇2(前端基础) 目录 谷粒商城--分布式基础篇2(前端基础) 5 前端 5.1 ES6 5.1.1 简介 5.1.2 什么是ECMAStript 5.1.3 ES6 新特性 5. ...
- 谷粒商城分布式高级篇(中)
谷粒商城分布式基础篇 谷粒商城分布式高级篇(上) 谷粒商城分布式高级篇(中) 谷粒商城分布式高级篇(下) 文章目录 商城业务 异步 异步复习 线程池详解 CompletableFuture Compl ...
最新文章
- mysql去除字符串首的非字母_如何从SQLServer中的字符串中删除所有非字母字符?...
- oracle表没被锁删不掉,ORACLE查看表被锁和删除锁
- 如何通过netstat命令判断是否遭受Dos功击?遭到DDoS该如何缓解?
- 【loj#6220】sum
- 织梦在线报名平台php,DedeCMSv5
- 在 windows 下使用 Xming+Putty 显示 Linux 下软件图形界面
- OllyDbg笔记-修改Messagebox的标题
- c语言超市账务管理源代码,C语言 超市管理系统源程序.doc
- java基础类的继承_JAVA核心技术I---JAVA基础知识(类的继承)
- 【ZOJ 3715 —— 13年浙江省赛K】Kindergarten Election 【枚举答案进行判断】 【夺宝奇兵 —— CCPC-Wannafly Winter Camp Day1】
- 认知的四个层次,读懂改变一生
- 坦白说php源码,qq坦白说新思路解密 附源码
- UIWebView的使用---safri
- python画菱形的代码_python绘制菱形
- 我们很高兴地宣布我们正在与 OKC 整合
- 我的第一篇博客--成长的第一站
- 如何获取股票交易接口
- 5-6 uniapp 图片压缩
- Unity向量投影使用
- linux小红帽如何封闭端口,安装红帽子Linux的几点注意