目录
2.3 InnoDB Cluster(Mysql官方推荐方案)
一、集群原理
二、集群形式
2.1 MHA
- Master High Availability目前在Mysql高可用方面是一个相对成熟的解决方案,由日本DeNA公司youshimaton开发,是一套优秀的作为Mysql高可用性环境下故障切换和主从提升的高可用软件。在Mysql故障切换过程中,MHA能做到0~30秒之内自动完成数据库的故障切换操作(以现在的眼光来说太慢了),并且进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
2.2 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(IP漂移)。在整个监管过程中,需要在mysql中添加相关授权用户,以便让mysql可以支持监理机的维护。授权用户包括一个mmm_monitor用户和一个mmm_agent用户,如果想使用mmm的备份工具则还需要添加一个mmm_tools用户。
2.3 InnoDB Cluster(Mysql官方推荐方案)
- 支持自动Failover、强一致性、读写分离、读库高可用、读请求负载均衡、横向扩展的特性,是比较完备的一套方案。但是部署起来复杂,想要解决router单点问题需要新增组件,如没有其它更好的方案,可考虑该方案。InnoDB Cluster主要由Mysql Shell、Mysql Router和Mysql服务器集群组成,三者协同工作,共同为Mysql提供完整的高可用性解决方案。Mysql Shell对管理人员提供接口,可以很方便的对集群进行配置和管理,Mysql Router可以根据部署的集群状况自动的初始化,是客户端连接实例。如果有节点宕机,集群会自动更新配置。集群包含单点写入和多点写入两种模式,在单主模式下,如果主节点宕机,从节点自动替换上来,Mysql Router会自动探测,并将客户端连接到新节点。
三、MySQL主从复制集群
3.1 创建MySQL实例
- 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
- slave01
docker run -p 3317:3306 --name mysql-slave-01 \
-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
- slave02
docker run -p 3318:3306 --name mysql-slave-02 \
-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/log:/var/log/mysql 将日志夹挂载到主机
-v /mydata/mysql/master/data:/var/lib/mysql 将数据夹挂载到主机
-v /mydata/mysql/master/data:/var/lib/mysql 将配置夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root 初始化root用户密码
3.2 修改配置
- master
vim /mydata/mysql/master/conf/my.cnf
[client]
default-character-set=utf-8
[mysql]
default-charaster-set=utf-8
[mysqld]
init_connect='SET collation_connection=utf_unicode_ci'
init_connect='SET NAMES utf8'
charaster-set-server=utf8
collation-sever=utf8_unicode_ci
skip-charaster-set-client-handshake
skip-name-resolve
# 服务器ID
server_id=1
# 日志名称
log-bin=mysql-bin
# 读写模式
read-only=0
# 需要生成binlog的数据库
binlog-do-db=idea_admin
binlog-do-db=idea_ums
binlog-do-db=idea_pms
binlog-do-db=idea_oms
binlog-do-db=idea_sms
binlog-do-db=idea_wms
# 需要忽略的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
- slave01
vim /mydata/mysql/slave01/conf/my.cnf
[client]
default-character-set=utf-8
[mysql]
default-charaster-set=utf-8
[mysqld]
init_connect='SET collation_connection=utf_unicode_ci'
init_connect='SET NAMES utf8'
charaster-set-server=utf8
collation-sever=utf8_unicode_ci
skip-charaster-set-client-handshake
skip-name-resolve
# 服务器ID
server_id=2
# 日志名称
log-bin=mysql-bin
# 读模式
read-only=1
# 需要生成binlog的数据库
binlog-do-db=idea_admin
binlog-do-db=idea_ums
binlog-do-db=idea_pms
binlog-do-db=idea_oms
binlog-do-db=idea_sms
binlog-do-db=idea_wms
# 需要忽略的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
- slave02
vim /mydata/mysql/slave02/conf/my.cnf
[client]
default-character-set=utf-8
[mysql]
default-charaster-set=utf-8
[mysqld]
init_connect='SET collation_connection=utf_unicode_ci'
init_connect='SET NAMES utf8'
charaster-set-server=utf8
collation-sever=utf8_unicode_ci
skip-charaster-set-client-handshake
skip-name-resolve
# 服务器ID
server_id=3
# 日志名称
log-bin=mysql-bin
# 读写模式
read-only=0
# 需要生成binlog的数据库
binlog-do-db=idea_admin
binlog-do-db=idea_ums
binlog-do-db=idea_pms
binlog-do-db=idea_oms
binlog-do-db=idea_sms
binlog-do-db=idea_wms
# 需要忽略的数据库
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
3.3 master授权用户同步数据
-- 添加用来同步的用户
grant replication slave on *.* to 'backup'@'%'identified by 'Aa123456';
-- 查看master状态
SHOW master status;
3.4 slave设置主库连接
- slave01
-- 告诉slave,需要同步的master
-- master_log_pos=0:同步master数据开始的位置,slave会自动从上次同步位置开始
change master to master_host='localhost',master_user='back_up',master_password='Aa123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307;
- slave02
-- 告诉slave,需要同步的master
-- master_log_pos=0:同步master数据开始的位置,slave会自动从上次同步位置开始
change master to master_host='localhost',master_user='back_up',master_password='Aa123456',master_log_file='mysql-bin.000001',master_log_pos=0,master_port=3307;
3.5 开始同步
- slave01
-- 开始同步
start slave01;
-- 查看状态
show slave01 status;
- slave02
-- 开始同步
start slave02;
-- 查看状态
show slave02 status;
四、ShardingSphere
4.1 ShardingSphere简介
4.2 ShardingSphere-Proxy
- ShardingSphere-Proxy下载
- MySQL连接需要下载MySQL驱动
4.2.1 数据分片
- config-sharding.ymal
# 逻辑库名称。在集群模式中,使用该参数来联通ShardingSphereProxy。
databaseName: sharding_db
# 数据源
dataSources:
ds_0:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
ds_1:
url: jdbc:mysql://127.0.0.1:3306/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
# 分库分表配置
rules:
- !SHARDING
# 数据分片规则配置
tables:
# 逻辑表名称
t_order:
# 由数据源名 + 表名组成
actualDataNodes: ds_${0..1}.t_order_${0..1}
# 分表策略,缺省表示使用默认分表策略,只能选其一
tableStrategy:
# 用于单分片键的标准分片场景
standard:
# 分片列名称
shardingColumn: order_id
# 分片算法名称
shardingAlgorithmName: t_order_inline
# 分布式序列策略
keyGenerateStrategy:
# 自增列名称,缺省表示不使用自增主键生成器
column: order_id
# 分布式序列算法名称
keyGeneratorName: snowflake
# 分片审计策略
auditStrategy:
# 分片审计算法名称
auditorNames:
- sharding_key_required_auditor
# 是否禁用分片审计
allowHintDisable: true
t_order_item:
actualDataNodes: ds_${0..1}.t_order_item_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t_order_item_inline
keyGenerateStrategy:
column: order_item_id
keyGeneratorName: snowflake
# 绑定表规则列表
bindingTables:
- t_order,t_order_item
# 默认数据库分片策略
defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database_inline
# 默认表分片策略
# defaultTableStrategy:
# none:
# 默认的分布式序列策略
# defaultAuditStrategy:
# auditorNames:
# - sharding_key_required_auditor
# allowHintDisable: true
# 分片算法配置
shardingAlgorithms:
# 分片算法名称
database_inline:
# 分片算法类型
type: INLINE
# 分片算法属性配置
props:
algorithm-expression: ds_${user_id % 2}
t_order_inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}
t_order_item_inline:
type: INLINE
props:
algorithm-expression: t_order_item_${order_id % 2}
# 分布式序列算法配置
keyGenerators:
# 分布式序列算法名称
snowflake:
# 分布式序列算法类型
type: SNOWFLAKE
# 分片审计算法配置
auditors:
# 分片审计算法名称
sharding_key_required_auditor:
# 分片审计算法类型
type: DML_SHARDING_CONDITIONS
4.2.2 读写分离
- 静态读写分离:config-readwrite-splitting.ymal
rules:
- !READWRITE_SPLITTING
dataSources:
# 读写分离逻辑数据源名称
readwrite_ds:
# 读写分离类型
staticStrategy:
# 写库数据源名称
writeDataSourceName: mysql_master
# 读库数据源名称,多个从数据源用逗号分隔
readDataSourceNames:
- mysql_slave01
- mysql_slave02
# 负载均衡算法名称
loadBalancerName: random
# 负载均衡算法配置
loadBalancers:
# 负载均衡算法名称
random:
# 负载均衡算法类型
type: RANDOM
- 动态读写分离:config-readwrite-splitting.ymal
rules:
- !READWRITE_SPLITTING
dataSources:
# 读写分离逻辑数据源名称
readwrite_ds:
# 读写分离类型
dynamicStrategy:
# 写库数据源名称
writeDataSourceName: mysql_master
# 读库数据源名称,多个从数据源用逗号分隔
readDataSourceNames:
- mysql_slave01
- mysql_slave02
# 负载均衡算法名称
loadBalancerName: random
# 负载均衡算法配置
loadBalancers:
# 负载均衡算法名称
random:
# 负载均衡算法类型
type: RANDOM