Mysql集群

目录

一、集群原理

二、集群形式 

2.1 MHA

2.2 Mysql-MMM

2.3 InnoDB Cluster(Mysql官方推荐方案)

三、MySQL主从复制集群 

3.1 创建MySQL实例 

3.2 修改配置

3.3 master授权用户同步数据

3.4 slave设置主库连接

3.5 开始同步

四、ShardingSphere

4.1 ShardingSphere简介 

4.2 ShardingSphere-Proxy 

4.2.1 数据分片 

4.2.2 读写分离 


一、集群原理

二、集群形式 

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 

mysql-connector-java-5.1.47.jarhttps://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.47/mysql-connector-java-5.1.47.jar

mysql-connector-java-8.0.11.jarhttps://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.11/mysql-connector-java-8.0.11.jar

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值