简单实现基于ShardingSphere读写分离

mymx2
mymx2 2019-06-05 18:21
阅读需:0

上效果图:

先了解什么是ShardingSphere:查看

注意ShardingSphere还在孵化,选择要考虑。

  • 如果项目中已经有相关包,不用重复引入:


  • 如果你在使用blade,先删除spring自带数据源配置


  • yml配置:

spring:
  shardingsphere:
    datasource:
      names: master,slave0
      slave0:
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://111.222.333.444:3306/xxx?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
        username: admin
      master:
        password: root
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://555.666.777.888:3306/xxx?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
        username: root
    masterslave:
      slave-data-source-names: slave0
      name: ms
      master-data-source-name: master
    props:
      sql:
        show: true

  • OK.已经完成了..开启trace级别日志查看insert和select效果吧

  • 没有两个mysql?简单贴下docker-compose:

version: '3'
services:
  mysql:
    image: mysql:8
    hostname: "mysql8"
    container_name: mysql8 #容器名称
    environment:
      - MYSQL_ROOT_PASSWORD=mysqladmin
    volumes:
      - $PWD/mysql/data:/var/lib/mysql
      - $PWD/mysql/conf.d:/etc/mysql/conf.d
    command: 
      - --default-authentication-plugin=mysql_native_password
    privileged: true
    restart: always
    ports:
      - 3306:3306

  • master:当前目录下mysql/conf.d/mysqld.cnf

[mysqld]
#主数据库端ID号
server_id = 100
#开启二进制日志,如果要进行主从,需要同名称,表示同一组
log-bin = mysql-bin
#需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
#binlog-do-db = nacos


#将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中
log-slave-updates
#将函数复制到slave
log_bin_trust_function_creators = 1
#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
sync_binlog = 1


#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_offset = 1
#这个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
auto_increment_increment = 1
#二进制日志自动删除的天数,默认值为0,表示“没有自动删除”,启动时和二进制日志循环时可能删除
expire_logs_days = 7

  • slave:当前目录下mysql/conf.d/mysqld.cnf

[mysqld]
#从数据库端ID号
server_id = 101
#开启二进制日志,如果要进行主从,需要同名称,表示同一组
log-bin = mysql-bin
#指定slave要复制哪个库
#replicate-do-db = nacos


#将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中
log-slave-updates
#将函数复制到slave
log_bin_trust_function_creators = 1
#控制binlog的写入频率。每执行多少次事务写入一次(这个参数性能消耗很大,但可减小MySQL崩溃造成的损失)
sync_binlog = 0


#log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作
innodb_flush_log_at_trx_commit = 0
#MySQL主从复制的时候,当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据
slave-net-timeout = 60
#设置只读
read_only = 1

当然如果你只有一个机子,那就复制docker-compose中的mysql并且修改端口号和挂载文件地址。

  • 大概主从同步流程

#参考
https://www.jianshu.com/p/40e8b7548f03

#进入容器
docker exec -it mysql8 bash

#登录mysql
mysql -u root -p

#master

如果从主机要与master保持同步,则需要有一个专属的账号

mysql>CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

mysql>GRANT ALL PRIVILEGES ON *.* TO 'slave'@'%';

mysql>flush privileges;

mysql>show master status;

#slave

mysql>CREATE USER 'admin'@'%' IDENTIFIED BY '123456';

mysql>GRANT SELECT ON *.* TO 'admin'@'%';

mysql>flush privileges;

mysql>stop slave;

mysql>reset slave;

mysql>change master to master_host='111.222.333.444',master_user='slave',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=111;

mysql>start slave;

mysql>show slave status\G;

至此,简单的msyql主从也配好了。然后自行测试吧。


评论
  • mtozhang
    2020-05-22 11:30
    数据源改了,程序启动不了,上述过程完成吗?
    16 回复